KVM: add kvm_{test,clear}_request to replace {test,clear}_bit
authorRadim Krčmář <rkrcmar@redhat.com>
Wed, 26 Apr 2017 20:32:19 +0000 (22:32 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 27 Apr 2017 12:12:22 +0000 (14:12 +0200)
Users were expected to use kvm_check_request() for testing and clearing,
but request have expanded their use since then and some users want to
only test or do a faster clear.

Make sure that requests are not directly accessed with bit operations.

Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/mips/kvm/emulate.c
arch/powerpc/kvm/book3s_pr.c
arch/powerpc/kvm/book3s_pr_papr.c
arch/powerpc/kvm/booke.c
arch/powerpc/kvm/powerpc.c
arch/s390/kvm/kvm-s390.c
arch/x86/kvm/vmx.c
arch/x86/kvm/x86.c
include/linux/kvm_host.h

index 34e78a3ee9d79ece862574274f4ce11fcf3e6d7a..4144bfaef137728f9143e4ec3d2ab0c5b0606a73 100644 (file)
@@ -982,7 +982,7 @@ enum emulation_result kvm_mips_emul_wait(struct kvm_vcpu *vcpu)
                 * check if any I/O interrupts are pending.
                 */
                if (kvm_check_request(KVM_REQ_UNHALT, vcpu)) {
-                       clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+                       kvm_clear_request(KVM_REQ_UNHALT, vcpu);
                        vcpu->run->exit_reason = KVM_EXIT_IRQ_WINDOW_OPEN;
                }
        }
index f026b062c0ed22881b000d5bff5605f23bb8f5ed..69a09444d46e669adaec40c98424afe9f4841eea 100644 (file)
@@ -349,7 +349,7 @@ static void kvmppc_set_msr_pr(struct kvm_vcpu *vcpu, u64 msr)
        if (msr & MSR_POW) {
                if (!vcpu->arch.pending_exceptions) {
                        kvm_vcpu_block(vcpu);
-                       clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+                       kvm_clear_request(KVM_REQ_UNHALT, vcpu);
                        vcpu->stat.halt_wakeup++;
 
                        /* Unset POW bit after we woke up */
index f102616febc7b10aeedd467dfb1cf084024dd81c..bcbeeb62dd13e9eafb9d0b8e4c6ece982627db85 100644 (file)
@@ -344,7 +344,7 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)
        case H_CEDE:
                kvmppc_set_msr_fast(vcpu, kvmppc_get_msr(vcpu) | MSR_EE);
                kvm_vcpu_block(vcpu);
-               clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+               kvm_clear_request(KVM_REQ_UNHALT, vcpu);
                vcpu->stat.halt_wakeup++;
                return EMULATE_DONE;
        case H_LOGICAL_CI_LOAD:
index 3c296c2eacf8b91404507044b9ebe3da5e78f81b..3eaac38099770099e3d42bf7611eff9a2a7fdf41 100644 (file)
@@ -584,7 +584,7 @@ static void arm_next_watchdog(struct kvm_vcpu *vcpu)
         * userspace, so clear the KVM_REQ_WATCHDOG request.
         */
        if ((vcpu->arch.tsr & (TSR_ENW | TSR_WIS)) != (TSR_ENW | TSR_WIS))
-               clear_bit(KVM_REQ_WATCHDOG, &vcpu->requests);
+               kvm_clear_request(KVM_REQ_WATCHDOG, vcpu);
 
        spin_lock_irqsave(&vcpu->arch.wdt_lock, flags);
        nr_jiffies = watchdog_next_timeout(vcpu);
@@ -695,7 +695,7 @@ int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu)
        if (vcpu->arch.shared->msr & MSR_WE) {
                local_irq_enable();
                kvm_vcpu_block(vcpu);
-               clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+               kvm_clear_request(KVM_REQ_UNHALT, vcpu);
                hard_irq_disable();
 
                kvmppc_set_exit_type(vcpu, EMULATED_MTMSRWE_EXITS);
index cf725c580fc5771743bdf3b66dfd7569f78bfc87..1ee22a9100748f5cfbc276ea132a46279f8f8799 100644 (file)
@@ -233,7 +233,7 @@ int kvmppc_kvm_pv(struct kvm_vcpu *vcpu)
        case EV_HCALL_TOKEN(EV_IDLE):
                r = EV_SUCCESS;
                kvm_vcpu_block(vcpu);
-               clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+               kvm_clear_request(KVM_REQ_UNHALT, vcpu);
                break;
        default:
                r = EV_UNIMPLEMENTED;
index 7eb1275cc265899d9c6e9c5f0f0f9cc1f139dcc1..4bafb0a0c8b5b778cbdff2d28ac16a2dcac7da88 100644 (file)
@@ -2496,7 +2496,7 @@ retry:
        }
 
        /* nothing to do, just clear the request */
-       clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+       kvm_clear_request(KVM_REQ_UNHALT, vcpu);
 
        return 0;
 }
index a4ef6371810106bef15aa649badef4ff9d8ac18d..b003b8dfb20c6d4d45eb316bb89e05ab6c8c7c20 100644 (file)
@@ -6299,7 +6299,7 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu)
                if (intr_window_requested && vmx_interrupt_allowed(vcpu))
                        return handle_interrupt_window(&vmx->vcpu);
 
-               if (test_bit(KVM_REQ_EVENT, &vcpu->requests))
+               if (kvm_test_request(KVM_REQ_EVENT, vcpu))
                        return 1;
 
                err = emulate_instruction(vcpu, EMULTYPE_NO_REEXECUTE);
index f68c5b2ba627daba09d7bff5ca8c97b4d4189b90..2de54c20fa9e373c07c250681ffe10c930276322 100644 (file)
@@ -1753,7 +1753,7 @@ static void kvm_gen_update_masterclock(struct kvm *kvm)
 
        /* guest entries allowed */
        kvm_for_each_vcpu(i, vcpu, kvm)
-               clear_bit(KVM_REQ_MCLOCK_INPROGRESS, &vcpu->requests);
+               kvm_clear_request(KVM_REQ_MCLOCK_INPROGRESS, vcpu);
 
        spin_unlock(&ka->pvclock_gtod_sync_lock);
 #endif
@@ -7041,7 +7041,7 @@ static int vcpu_run(struct kvm_vcpu *vcpu)
                if (r <= 0)
                        break;
 
-               clear_bit(KVM_REQ_PENDING_TIMER, &vcpu->requests);
+               kvm_clear_request(KVM_REQ_PENDING_TIMER, vcpu);
                if (kvm_cpu_has_pending_timer(vcpu))
                        kvm_inject_pending_timer_irqs(vcpu);
 
@@ -7169,7 +7169,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
        if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
                kvm_vcpu_block(vcpu);
                kvm_apic_accept_events(vcpu);
-               clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
+               kvm_clear_request(KVM_REQ_UNHALT, vcpu);
                r = -EAGAIN;
                goto out;
        }
@@ -8382,7 +8382,7 @@ static inline bool kvm_vcpu_has_events(struct kvm_vcpu *vcpu)
        if (atomic_read(&vcpu->arch.nmi_queued))
                return true;
 
-       if (test_bit(KVM_REQ_SMI, &vcpu->requests))
+       if (kvm_test_request(KVM_REQ_SMI, vcpu))
                return true;
 
        if (kvm_arch_interrupt_allowed(vcpu) &&
index 397b7b5b1933b8082ce2955ffdc52463aafdcbf3..374fa92c7657784b0c3c05472b64e9bbd7db0a04 100644 (file)
@@ -1079,10 +1079,20 @@ static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
        set_bit(req, &vcpu->requests);
 }
 
+static inline bool kvm_test_request(int req, struct kvm_vcpu *vcpu)
+{
+       return test_bit(req, &vcpu->requests);
+}
+
+static inline void kvm_clear_request(int req, struct kvm_vcpu *vcpu)
+{
+       clear_bit(req, &vcpu->requests);
+}
+
 static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu)
 {
-       if (test_bit(req, &vcpu->requests)) {
-               clear_bit(req, &vcpu->requests);
+       if (kvm_test_request(req, vcpu)) {
+               kvm_clear_request(req, vcpu);
 
                /*
                 * Ensure the rest of the request is visible to kvm_check_request's