Skip to content

Commit

Permalink
KVM: introduce kvm_make_vcpus_request_mask() API
Browse files Browse the repository at this point in the history
Hyper-V style PV TLB flush hypercalls inmplementation will use this API.
To avoid memory allocation in CONFIG_CPUMASK_OFFSTACK case add
cpumask_var_t argument.

Signed-off-by: Vitaly Kuznetsov <[email protected]>
Signed-off-by: Radim Krčmář <[email protected]>
  • Loading branch information
vittyvk authored and rkrcmar committed May 26, 2018
1 parent 56b9ae7 commit 7053df4
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
3 changes: 3 additions & 0 deletions include/linux/kvm_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -730,6 +730,9 @@ void kvm_put_guest_fpu(struct kvm_vcpu *vcpu);

void kvm_flush_remote_tlbs(struct kvm *kvm);
void kvm_reload_remote_mmus(struct kvm *kvm);

bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
unsigned long *vcpu_bitmap, cpumask_var_t tmp);
bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req);

long kvm_arch_dev_ioctl(struct file *filp,
Expand Down
34 changes: 26 additions & 8 deletions virt/kvm/kvm_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,29 +203,47 @@ static inline bool kvm_kick_many_cpus(const struct cpumask *cpus, bool wait)
return true;
}

bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req)
bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req,
unsigned long *vcpu_bitmap, cpumask_var_t tmp)
{
int i, cpu, me;
cpumask_var_t cpus;
bool called;
struct kvm_vcpu *vcpu;

zalloc_cpumask_var(&cpus, GFP_ATOMIC);
bool called;

me = get_cpu();

kvm_for_each_vcpu(i, vcpu, kvm) {
if (!test_bit(i, vcpu_bitmap))
continue;

kvm_make_request(req, vcpu);
cpu = vcpu->cpu;

if (!(req & KVM_REQUEST_NO_WAKEUP) && kvm_vcpu_wake_up(vcpu))
continue;

if (cpus != NULL && cpu != -1 && cpu != me &&
if (tmp != NULL && cpu != -1 && cpu != me &&
kvm_request_needs_ipi(vcpu, req))
__cpumask_set_cpu(cpu, cpus);
__cpumask_set_cpu(cpu, tmp);
}
called = kvm_kick_many_cpus(cpus, !!(req & KVM_REQUEST_WAIT));

called = kvm_kick_many_cpus(tmp, !!(req & KVM_REQUEST_WAIT));
put_cpu();

return called;
}

bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req)
{
cpumask_var_t cpus;
bool called;
static unsigned long vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)]
= {[0 ... BITS_TO_LONGS(KVM_MAX_VCPUS)-1] = ULONG_MAX};

zalloc_cpumask_var(&cpus, GFP_ATOMIC);

called = kvm_make_vcpus_request_mask(kvm, req, vcpu_bitmap, cpus);

free_cpumask_var(cpus);
return called;
}
Expand Down

0 comments on commit 7053df4

Please sign in to comment.