lkml.org 
[lkml]   [2017]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 1/9] KVM: add kvm_{test,clear}_request to replace {test,clear}_bit
    Date
    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>
    ---
    arch/mips/kvm/emulate.c | 2 +-
    arch/powerpc/kvm/book3s_pr.c | 2 +-
    arch/powerpc/kvm/book3s_pr_papr.c | 2 +-
    arch/powerpc/kvm/booke.c | 4 ++--
    arch/powerpc/kvm/powerpc.c | 2 +-
    arch/s390/kvm/kvm-s390.c | 2 +-
    arch/x86/kvm/vmx.c | 2 +-
    arch/x86/kvm/x86.c | 8 ++++----
    include/linux/kvm_host.h | 14 ++++++++++++--
    9 files changed, 24 insertions(+), 14 deletions(-)

    diff --git a/arch/mips/kvm/emulate.c b/arch/mips/kvm/emulate.c
    index 34e78a3ee9d7..4144bfaef137 100644
    --- a/arch/mips/kvm/emulate.c
    +++ b/arch/mips/kvm/emulate.c
    @@ -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;
    }
    }
    diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
    index f026b062c0ed..69a09444d46e 100644
    --- a/arch/powerpc/kvm/book3s_pr.c
    +++ b/arch/powerpc/kvm/book3s_pr.c
    @@ -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 */
    diff --git a/arch/powerpc/kvm/book3s_pr_papr.c b/arch/powerpc/kvm/book3s_pr_papr.c
    index f102616febc7..bcbeeb62dd13 100644
    --- a/arch/powerpc/kvm/book3s_pr_papr.c
    +++ b/arch/powerpc/kvm/book3s_pr_papr.c
    @@ -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:
    diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
    index 3c296c2eacf8..3eaac3809977 100644
    --- a/arch/powerpc/kvm/booke.c
    +++ b/arch/powerpc/kvm/booke.c
    @@ -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);
    diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
    index cf725c580fc5..1ee22a910074 100644
    --- a/arch/powerpc/kvm/powerpc.c
    +++ b/arch/powerpc/kvm/powerpc.c
    @@ -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;
    diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
    index 8771fef112a1..71a5f4023f3f 100644
    --- a/arch/s390/kvm/kvm-s390.c
    +++ b/arch/s390/kvm/kvm-s390.c
    @@ -2492,7 +2492,7 @@ static int kvm_s390_handle_requests(struct kvm_vcpu *vcpu)
    }

    /* nothing to do, just clear the request */
    - clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
    + kvm_clear_request(KVM_REQ_UNHALT, vcpu);

    return 0;
    }
    diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
    index a4ef63718101..b003b8dfb20c 100644
    --- a/arch/x86/kvm/vmx.c
    +++ b/arch/x86/kvm/vmx.c
    @@ -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);
    diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
    index f68c5b2ba627..2de54c20fa9e 100644
    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -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) &&
    diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
    index 397b7b5b1933..374fa92c7657 100644
    --- a/include/linux/kvm_host.h
    +++ b/include/linux/kvm_host.h
    @@ -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
    --
    2.12.2
    \
     
     \ /
      Last update: 2017-04-26 22:36    [W:4.877 / U:0.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site