On Thu, Apr 06, 2017 at 10:20:56PM +0200, Radim Krčmář wrote: > We want to have kvm_make_all_cpus_request() to be an optmized version of > > kvm_for_each_vcpu(i, vcpu, kvm) { > kvm_make_request(vcpu, request); > kvm_vcpu_kick(vcpu); > } > > and kvm_vcpu_kick() wakes up the target vcpu. We know which requests do > not need the wake up and use it to optimize the loop. Any reason we don't want kvm_vcpu_kick() to also get the if (!(req & KVM_REQUEST_NO_WAKEUP)) optimization condition? I did some grepping, and don't see any kicks of the requests that have been marked as NO_WAKEUP, so nothing should change by adding it now. But the consistency would be nice for the doc I'm writing. Also, the condition in kvm_vcpu_kick() looks like overkill cpu != me && (unsigned)cpu < nr_cpu_ids && cpu_online(cpu) How could vcpu->cpu ever be any offline/invalid cpu, other than -1? The condition in kvm_make_all_cpus_request() makes more sense to me cpu != -1 && cpu != me I guess a lot this stuff is planned for a larger requests rework, when kicks get integrated with requests? I'm a bit anxious, though, as it changes how I document stuff now, and even how I approach the ARM series. For example, if kvm_make_request() already integrated kvm_vcpu_kick(), which means also adding the smp_mb__after_atomic(), like kvm_make_all_cpus_request() has, then I wouldn't need to add the smp_mb() to kvm_arch_vcpu_should_kick(). Thanks, drew > > Thanks to that, this patch doesn't change the behavior of current users > (the all don't need the wake up) and only prepares for future where the > wake up is going to be needed. > > I think that most requests do not need the wake up, so we would flip the > bit then. > > Signed-off-by: Radim Krčmář <rkrcmar@xxxxxxxxxx> > --- > virt/kvm/kvm_main.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c > index a486c6ad27a6..1db503bab3dc 100644 > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -186,6 +186,9 @@ bool kvm_make_all_cpus_request(struct kvm *kvm, unsigned int req) > /* Set ->requests bit before we read ->mode. */ > smp_mb__after_atomic(); > > + if (!(req & KVM_REQUEST_NO_WAKEUP)) > + kvm_vcpu_wake_up(vcpu); > + > if (cpus != NULL && cpu != -1 && cpu != me && > kvm_arch_vcpu_should_kick(vcpu)) > cpumask_set_cpu(cpu, cpus); > -- > 2.12.0 >