]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: VMX: Add helpers to toggle/change a bit in VMCS execution controls
authorDapeng Mi <dapeng1.mi@linux.intel.com>
Wed, 6 Aug 2025 19:56:48 +0000 (12:56 -0700)
committerSean Christopherson <seanjc@google.com>
Thu, 18 Sep 2025 19:57:19 +0000 (12:57 -0700)
Expand the VMCS controls builder macros to generate helpers to change a
bit to the desired value, and use the new helpers when toggling APICv
related controls.

No functional change intended.

Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
Signed-off-by: Mingwei Zhang <mizhang@google.com>
[sean: rewrite changelog]
Tested-by: Xudong Hao <xudong.hao@intel.com>
Link: https://lore.kernel.org/r/20250806195706.1650976-27-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/vmx/vmx.h

index 6b9523ca082cf8ec0f8978fde1a709a21c700a3b..d2fa64bddb578d88b8123ac8dddcce17c8e3095c 100644 (file)
@@ -4356,19 +4356,13 @@ void vmx_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu)
 
        pin_controls_set(vmx, vmx_pin_based_exec_ctrl(vmx));
 
-       if (kvm_vcpu_apicv_active(vcpu)) {
-               secondary_exec_controls_setbit(vmx,
-                                              SECONDARY_EXEC_APIC_REGISTER_VIRT |
-                                              SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY);
-               if (enable_ipiv)
-                       tertiary_exec_controls_setbit(vmx, TERTIARY_EXEC_IPI_VIRT);
-       } else {
-               secondary_exec_controls_clearbit(vmx,
-                                                SECONDARY_EXEC_APIC_REGISTER_VIRT |
-                                                SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY);
-               if (enable_ipiv)
-                       tertiary_exec_controls_clearbit(vmx, TERTIARY_EXEC_IPI_VIRT);
-       }
+       secondary_exec_controls_changebit(vmx,
+                                         SECONDARY_EXEC_APIC_REGISTER_VIRT |
+                                         SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY,
+                                         kvm_vcpu_apicv_active(vcpu));
+       if (enable_ipiv)
+               tertiary_exec_controls_changebit(vmx, TERTIARY_EXEC_IPI_VIRT,
+                                                kvm_vcpu_apicv_active(vcpu));
 
        vmx_update_msr_bitmap_x2apic(vcpu);
 }
index 24d65dac5e897aab16dd1f60d26137e81f9d4dc2..23d6e89b96f26a614784afbb2dc1074c153cab2b 100644 (file)
@@ -608,6 +608,14 @@ static __always_inline void lname##_controls_clearbit(struct vcpu_vmx *vmx, u##b
 {                                                                                              \
        BUILD_BUG_ON(!(val & (KVM_REQUIRED_VMX_##uname | KVM_OPTIONAL_VMX_##uname)));           \
        lname##_controls_set(vmx, lname##_controls_get(vmx) & ~val);                            \
+}                                                                                              \
+static __always_inline void lname##_controls_changebit(struct vcpu_vmx *vmx, u##bits val,      \
+                                                      bool set)                                \
+{                                                                                              \
+       if (set)                                                                                \
+               lname##_controls_setbit(vmx, val);                                              \
+       else                                                                                    \
+               lname##_controls_clearbit(vmx, val);                                            \
 }
 BUILD_CONTROLS_SHADOW(vm_entry, VM_ENTRY_CONTROLS, 32)
 BUILD_CONTROLS_SHADOW(vm_exit, VM_EXIT_CONTROLS, 32)