lkml.org 
[lkml]   [2011]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v3 3/3] KVM: make make_all_cpus_request() lockless
    Now, we have 'vcpu->mode' to judge whether need to send ipi to other
    cpus, this way is very exact, so checking request bit is needless,
    then we can drop the spinlock let it's collateral

    Signed-off-by: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
    ---
    include/linux/kvm_host.h | 6 ------
    virt/kvm/kvm_main.c | 9 +++------
    2 files changed, 3 insertions(+), 12 deletions(-)

    diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
    index b99eacd..c8dee22 100644
    --- a/include/linux/kvm_host.h
    +++ b/include/linux/kvm_host.h
    @@ -224,7 +224,6 @@ struct kvm_memslots {

    struct kvm {
    spinlock_t mmu_lock;
    - raw_spinlock_t requests_lock;
    struct mutex slots_lock;
    struct mm_struct *mm; /* userspace tied to this vm */
    struct kvm_memslots *memslots;
    @@ -731,11 +730,6 @@ static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
    set_bit(req, &vcpu->requests);
    }

    -static inline bool kvm_make_check_request(int req, struct kvm_vcpu *vcpu)
    -{
    - return test_and_set_bit(req, &vcpu->requests);
    -}
    -
    static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu)
    {
    if (test_bit(req, &vcpu->requests)) {
    diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
    index 71a4eaf..c9eed53 100644
    --- a/virt/kvm/kvm_main.c
    +++ b/virt/kvm/kvm_main.c
    @@ -147,11 +147,9 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req)

    zalloc_cpumask_var(&cpus, GFP_ATOMIC);

    - raw_spin_lock(&kvm->requests_lock);
    - me = smp_processor_id();
    + me = get_cpu();
    kvm_for_each_vcpu(i, vcpu, kvm) {
    - if (kvm_make_check_request(req, vcpu))
    - continue;
    + kvm_make_request(req, vcpu);
    cpu = vcpu->cpu;

    /* Set ->requests bit before we read ->mode */
    @@ -167,7 +165,7 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req)
    smp_call_function_many(cpus, ack_flush, NULL, 1);
    else
    called = false;
    - raw_spin_unlock(&kvm->requests_lock);
    + put_cpu();
    free_cpumask_var(cpus);
    return called;
    }
    @@ -433,7 +431,6 @@ static struct kvm *kvm_create_vm(void)
    kvm->mm = current->mm;
    atomic_inc(&kvm->mm->mm_count);
    spin_lock_init(&kvm->mmu_lock);
    - raw_spin_lock_init(&kvm->requests_lock);
    kvm_eventfd_init(kvm);
    mutex_init(&kvm->lock);
    mutex_init(&kvm->irq_lock);
    --
    1.7.3.4

    \
     
     \ /
      Last update: 2011-01-12 08:43    [W:0.022 / U:5.644 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site