Message ID | 20170426203227.12321-6-rkrcmar@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Apr 26, 2017 at 10:32:23PM +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. > > 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. > > kvm_vcpu_kick() will get this condition after it is merged with > kvm_make_request() because we currently don't know which request is being > kicked. > > Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> > --- > 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 e5d52b46b531..3772f7dcc72d 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_vcpu_exiting_guest_mode(vcpu) != OUTSIDE_GUEST_MODE) > cpumask_set_cpu(cpu, cpus); > -- > 2.12.2 > Reviewed-by: Andrew Jones <drjones@redhat.com>
On Wed, 26 Apr 2017 22:32:23 +0200 Radim Krčmář <rkrcmar@redhat.com> 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. > > 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 s/the all/they all/ > 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. > > kvm_vcpu_kick() will get this condition after it is merged with > kvm_make_request() because we currently don't know which request is being > kicked. I find this sentence confusing: not all kicks are directly related to requests. > > Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> > --- > 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 e5d52b46b531..3772f7dcc72d 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_vcpu_exiting_guest_mode(vcpu) != OUTSIDE_GUEST_MODE) > cpumask_set_cpu(cpu, cpus); The code change looks good to me.
On 27/04/2017 14:06, Cornelia Huck wrote: > On Wed, 26 Apr 2017 22:32:23 +0200 > Radim Krčmář <rkrcmar@redhat.com> 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. >> >> 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 > > s/the all/they all/ > >> 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. >> >> kvm_vcpu_kick() will get this condition after it is merged with >> kvm_make_request() because we currently don't know which request is being >> kicked. > > I find this sentence confusing: not all kicks are directly related to > requests. I agree, it is backwards. Changing to "Later on, kvm_make_request() will take care of kicking too, using this bit to make the decision whether to kick or not". Paolo >> >> Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> >> --- >> 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 e5d52b46b531..3772f7dcc72d 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_vcpu_exiting_guest_mode(vcpu) != OUTSIDE_GUEST_MODE) >> cpumask_set_cpu(cpu, cpus); > > The code change looks good to me. >
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index e5d52b46b531..3772f7dcc72d 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_vcpu_exiting_guest_mode(vcpu) != OUTSIDE_GUEST_MODE) cpumask_set_cpu(cpu, cpus);
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. 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. kvm_vcpu_kick() will get this condition after it is merged with kvm_make_request() because we currently don't know which request is being kicked. Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> --- virt/kvm/kvm_main.c | 3 +++ 1 file changed, 3 insertions(+)