diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2008-12-08 04:58:04 -0500 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2008-12-31 09:55:45 -0500 |
commit | 6ef7a1bc45f80fe0a263119d404688c596ea5031 (patch) | |
tree | 331e8f5ba73b53fa5997eb4dc376249d18897876 | |
parent | 498468961ed6f62a306eb90c49125776c526fa40 (diff) |
KVM: use modern cpumask primitives, no cpumask_t on stack
We're getting rid on on-stack cpumasks for large NR_CPUS.
1) Use cpumask_var_t/alloc_cpumask_var.
2) smp_call_function_mask -> smp_call_function_many
3) cpus_clear, cpus_empty, cpu_set -> cpumask_clear, cpumask_empty,
cpumask_set_cpu.
This actually generates slightly smaller code than the old one with
CONFIG_CPUMASKS_OFFSTACK=n. (gcc knows that cpus cannot be NULL in
that case, where cpumask_var_t is cpumask_t[1]).
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | virt/kvm/kvm_main.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index ba4275d06fb7..2d6ca7968d65 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -555,12 +555,14 @@ static void ack_flush(void *_completed) | |||
555 | static bool make_all_cpus_request(struct kvm *kvm, unsigned int req) | 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_var_t cpus; |
559 | bool called = false; | 559 | bool called = true; |
560 | struct kvm_vcpu *vcpu; | 560 | struct kvm_vcpu *vcpu; |
561 | 561 | ||
562 | if (alloc_cpumask_var(&cpus, GFP_ATOMIC)) | ||
563 | cpumask_clear(cpus); | ||
564 | |||
562 | me = get_cpu(); | 565 | me = get_cpu(); |
563 | cpus_clear(cpus); | ||
564 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { | 566 | for (i = 0; i < KVM_MAX_VCPUS; ++i) { |
565 | vcpu = kvm->vcpus[i]; | 567 | vcpu = kvm->vcpus[i]; |
566 | if (!vcpu) | 568 | if (!vcpu) |
@@ -568,14 +570,17 @@ static bool make_all_cpus_request(struct kvm *kvm, unsigned int req) | |||
568 | if (test_and_set_bit(req, &vcpu->requests)) | 570 | if (test_and_set_bit(req, &vcpu->requests)) |
569 | continue; | 571 | continue; |
570 | cpu = vcpu->cpu; | 572 | cpu = vcpu->cpu; |
571 | if (cpu != -1 && cpu != me) | 573 | if (cpus != NULL && cpu != -1 && cpu != me) |
572 | cpu_set(cpu, cpus); | 574 | cpumask_set_cpu(cpu, cpus); |
573 | } | ||
574 | if (!cpus_empty(cpus)) { | ||
575 | smp_call_function_mask(cpus, ack_flush, NULL, 1); | ||
576 | called = true; | ||
577 | } | 575 | } |
576 | if (unlikely(cpus == NULL)) | ||
577 | smp_call_function_many(cpu_online_mask, ack_flush, NULL, 1); | ||
578 | else if (!cpumask_empty(cpus)) | ||
579 | smp_call_function_many(cpus, ack_flush, NULL, 1); | ||
580 | else | ||
581 | called = false; | ||
578 | put_cpu(); | 582 | put_cpu(); |
583 | free_cpumask_var(cpus); | ||
579 | return called; | 584 | return called; |
580 | } | 585 | } |
581 | 586 | ||