diff options
author | Xiao Guangrong <xiaoguangrong@cn.fujitsu.com> | 2011-01-12 02:41:22 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2011-03-17 12:08:26 -0400 |
commit | 3cba41307a2b1344ab8c1b9f55202d1e9d7bf81b (patch) | |
tree | 87191d63557cc722906ceaec98a1f8f148cf1fcc /virt/kvm/kvm_main.c | |
parent | 6b7e2d0991489559a1df4500d77f7b76c4607ed0 (diff) |
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>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r-- | virt/kvm/kvm_main.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 19209f849cf7..4856a7dcbd7f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -165,11 +165,9 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req) | |||
165 | 165 | ||
166 | zalloc_cpumask_var(&cpus, GFP_ATOMIC); | 166 | zalloc_cpumask_var(&cpus, GFP_ATOMIC); |
167 | 167 | ||
168 | raw_spin_lock(&kvm->requests_lock); | 168 | me = get_cpu(); |
169 | me = smp_processor_id(); | ||
170 | kvm_for_each_vcpu(i, vcpu, kvm) { | 169 | kvm_for_each_vcpu(i, vcpu, kvm) { |
171 | if (kvm_make_check_request(req, vcpu)) | 170 | kvm_make_request(req, vcpu); |
172 | continue; | ||
173 | cpu = vcpu->cpu; | 171 | cpu = vcpu->cpu; |
174 | 172 | ||
175 | /* Set ->requests bit before we read ->mode */ | 173 | /* Set ->requests bit before we read ->mode */ |
@@ -185,7 +183,7 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req) | |||
185 | smp_call_function_many(cpus, ack_flush, NULL, 1); | 183 | smp_call_function_many(cpus, ack_flush, NULL, 1); |
186 | else | 184 | else |
187 | called = false; | 185 | called = false; |
188 | raw_spin_unlock(&kvm->requests_lock); | 186 | put_cpu(); |
189 | free_cpumask_var(cpus); | 187 | free_cpumask_var(cpus); |
190 | return called; | 188 | return called; |
191 | } | 189 | } |
@@ -468,7 +466,6 @@ static struct kvm *kvm_create_vm(void) | |||
468 | kvm->mm = current->mm; | 466 | kvm->mm = current->mm; |
469 | atomic_inc(&kvm->mm->mm_count); | 467 | atomic_inc(&kvm->mm->mm_count); |
470 | spin_lock_init(&kvm->mmu_lock); | 468 | spin_lock_init(&kvm->mmu_lock); |
471 | raw_spin_lock_init(&kvm->requests_lock); | ||
472 | kvm_eventfd_init(kvm); | 469 | kvm_eventfd_init(kvm); |
473 | mutex_init(&kvm->lock); | 470 | mutex_init(&kvm->lock); |
474 | mutex_init(&kvm->irq_lock); | 471 | mutex_init(&kvm->irq_lock); |