diff options
| author | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-08 04:56:24 -0500 |
|---|---|---|
| committer | Avi Kivity <avi@redhat.com> | 2008-12-31 09:55:45 -0500 |
| commit | 498468961ed6f62a306eb90c49125776c526fa40 (patch) | |
| tree | ace5ccb27e61124040aa0add338bf4bb480275dd /virt | |
| parent | 3d3aab1b973b01bd2a1aa46307e94a1380b1d802 (diff) | |
KVM: Extract core of kvm_flush_remote_tlbs/kvm_reload_remote_mmus
Avi said:
> Wow, code duplication from Rusty. Things must be bad.
Something about glass houses comes to mind. But instead, a patch.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/kvm_main.c | 44 |
1 files changed, 15 insertions, 29 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 484c903544f4..ba4275d06fb7 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -552,10 +552,11 @@ static void ack_flush(void *_completed) | |||
| 552 | { | 552 | { |
| 553 | } | 553 | } |
| 554 | 554 | ||
| 555 | void kvm_flush_remote_tlbs(struct kvm *kvm) | 555 | static bool make_all_cpus_request(struct kvm *kvm, unsigned int req) |
| 556 | { | 556 | { |
| 557 | int i, cpu, me; | 557 | int i, cpu, me; |
| 558 | cpumask_t cpus; | 558 | cpumask_t cpus; |
| 559 | bool called = false; | ||
| 559 | struct kvm_vcpu *vcpu; | 560 | struct kvm_vcpu *vcpu; |
| 560 | 561 | ||
| 561 | me = get_cpu(); | 562 | me = get_cpu(); |
| @@ -564,45 +565,30 @@ void kvm_flush_remote_tlbs(struct kvm *kvm) | |||
| 564 | vcpu = kvm->vcpus[i]; | 565 | vcpu = kvm->vcpus[i]; |
| 565 | if (!vcpu) | 566 | if (!vcpu) |
| 566 | continue; | 567 | continue; |
| 567 | if (test_and_set_bit(KVM_REQ_TLB_FLUSH, &vcpu->requests)) | 568 | if (test_and_set_bit(req, &vcpu->requests)) |
| 568 | continue; | 569 | continue; |
| 569 | cpu = vcpu->cpu; | 570 | cpu = vcpu->cpu; |
| 570 | if (cpu != -1 && cpu != me) | 571 | if (cpu != -1 && cpu != me) |
| 571 | cpu_set(cpu, cpus); | 572 | cpu_set(cpu, cpus); |
| 572 | } | 573 | } |
| 573 | if (cpus_empty(cpus)) | 574 | if (!cpus_empty(cpus)) { |
| 574 | goto out; | 575 | smp_call_function_mask(cpus, ack_flush, NULL, 1); |
| 575 | ++kvm->stat.remote_tlb_flush; | 576 | called = true; |
| 576 | smp_call_function_mask(cpus, ack_flush, NULL, 1); | 577 | } |
| 577 | out: | ||
| 578 | put_cpu(); | 578 | put_cpu(); |
| 579 | return called; | ||
| 579 | } | 580 | } |
| 580 | 581 | ||
| 581 | void kvm_reload_remote_mmus(struct kvm *kvm) | 582 | void kvm_flush_remote_tlbs(struct kvm *kvm) |
| 582 | { | 583 | { |
| 583 | int i, cpu, me; | 584 | if (make_all_cpus_request(kvm, KVM_REQ_TLB_FLUSH)) |
| 584 | cpumask_t cpus; | 585 | ++kvm->stat.remote_tlb_flush; |
| 585 | struct kvm_vcpu *vcpu; | ||
| 586 | |||
| 587 | me = get_cpu(); | ||
| 588 | cpus_clear(cpus); | ||
| 589 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { | ||
| 590 | vcpu = kvm->vcpus[i]; | ||
| 591 | if (!vcpu) | ||
| 592 | continue; | ||
| 593 | if (test_and_set_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests)) | ||
| 594 | continue; | ||
| 595 | cpu = vcpu->cpu; | ||
| 596 | if (cpu != -1 && cpu != me) | ||
| 597 | cpu_set(cpu, cpus); | ||
| 598 | } | ||
| 599 | if (cpus_empty(cpus)) | ||
| 600 | goto out; | ||
| 601 | smp_call_function_mask(cpus, ack_flush, NULL, 1); | ||
| 602 | out: | ||
| 603 | put_cpu(); | ||
| 604 | } | 586 | } |
| 605 | 587 | ||
| 588 | void kvm_reload_remote_mmus(struct kvm *kvm) | ||
| 589 | { | ||
| 590 | make_all_cpus_request(kvm, KVM_REQ_MMU_RELOAD); | ||
| 591 | } | ||
| 606 | 592 | ||
| 607 | int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id) | 593 | int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id) |
| 608 | { | 594 | { |
