]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86: Use non-atomic bit ops to manipulate "shadow" MSR intercepts
authorSean Christopherson <seanjc@google.com>
Tue, 10 Jun 2025 22:57:12 +0000 (15:57 -0700)
committerSean Christopherson <seanjc@google.com>
Fri, 20 Jun 2025 20:05:40 +0000 (13:05 -0700)
Manipulate the MSR bitmaps using non-atomic bit ops APIs (two underscores),
as the bitmaps are per-vCPU and are only ever accessed while vcpu->mutex is
held.

Reviewed-by: Binbin Wu <binbin.wu@linux.intel.com>
Link: https://lore.kernel.org/r/20250610225737.156318-8-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/vmx.c

index 60de360e3389710062d1e13cf2a13508caf627b3..9dce32cae4852ec4a01123ff325c1ee996469520 100644 (file)
@@ -783,14 +783,14 @@ static void set_shadow_msr_intercept(struct kvm_vcpu *vcpu, u32 msr, int read,
 
        /* Set the shadow bitmaps to the desired intercept states */
        if (read)
-               set_bit(slot, svm->shadow_msr_intercept.read);
+               __set_bit(slot, svm->shadow_msr_intercept.read);
        else
-               clear_bit(slot, svm->shadow_msr_intercept.read);
+               __clear_bit(slot, svm->shadow_msr_intercept.read);
 
        if (write)
-               set_bit(slot, svm->shadow_msr_intercept.write);
+               __set_bit(slot, svm->shadow_msr_intercept.write);
        else
-               clear_bit(slot, svm->shadow_msr_intercept.write);
+               __clear_bit(slot, svm->shadow_msr_intercept.write);
 }
 
 static bool valid_msr_intercept(u32 index)
@@ -856,8 +856,8 @@ static void set_msr_interception_bitmap(struct kvm_vcpu *vcpu, u32 *msrpm,
        bit_write = 2 * (msr & 0x0f) + 1;
        tmp       = msrpm[offset];
 
-       read  ? clear_bit(bit_read,  &tmp) : set_bit(bit_read,  &tmp);
-       write ? clear_bit(bit_write, &tmp) : set_bit(bit_write, &tmp);
+       read  ? __clear_bit(bit_read,  &tmp) : __set_bit(bit_read,  &tmp);
+       write ? __clear_bit(bit_write, &tmp) : __set_bit(bit_write, &tmp);
 
        msrpm[offset] = tmp;
 
index 0db1bd3833029b15ea810062cdf768675b32b0c1..90c45f35938ca620c4303b6df794a19892b744d8 100644 (file)
@@ -4040,9 +4040,9 @@ void vmx_disable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
        idx = vmx_get_passthrough_msr_slot(msr);
        if (idx >= 0) {
                if (type & MSR_TYPE_R)
-                       clear_bit(idx, vmx->shadow_msr_intercept.read);
+                       __clear_bit(idx, vmx->shadow_msr_intercept.read);
                if (type & MSR_TYPE_W)
-                       clear_bit(idx, vmx->shadow_msr_intercept.write);
+                       __clear_bit(idx, vmx->shadow_msr_intercept.write);
        }
 
        if ((type & MSR_TYPE_R) &&
@@ -4082,9 +4082,9 @@ void vmx_enable_intercept_for_msr(struct kvm_vcpu *vcpu, u32 msr, int type)
        idx = vmx_get_passthrough_msr_slot(msr);
        if (idx >= 0) {
                if (type & MSR_TYPE_R)
-                       set_bit(idx, vmx->shadow_msr_intercept.read);
+                       __set_bit(idx, vmx->shadow_msr_intercept.read);
                if (type & MSR_TYPE_W)
-                       set_bit(idx, vmx->shadow_msr_intercept.write);
+                       __set_bit(idx, vmx->shadow_msr_intercept.write);
        }
 
        if (type & MSR_TYPE_R)