On 03.11.14 05:52, Paul Mackerras wrote: > From: "Suresh E. Warrier" <warrier@xxxxxxxxxxxxxxxxxx> > > The kvmppc_vcore_blocked() code does not check for the wait condition > after putting the process on the wait queue. This means that it is > possible for an external interrupt to become pending, but the vcpu to > remain asleep until the next decrementer interrupt. The fix is to > make one last check for pending exceptions and ceded state before > calling schedule(). > > Signed-off-by: Suresh Warrier <warrier@xxxxxxxxxxxxxxxxxx> > Signed-off-by: Paul Mackerras <paulus@xxxxxxxxx> I don't understand the race you're fixing here. Can you please explain it? Alex > --- > arch/powerpc/kvm/book3s_hv.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c > index cd7e030..1a7a281 100644 > --- a/arch/powerpc/kvm/book3s_hv.c > +++ b/arch/powerpc/kvm/book3s_hv.c > @@ -1828,9 +1828,29 @@ static void kvmppc_wait_for_exec(struct kvm_vcpu *vcpu, int wait_state) > */ > static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc) > { > + struct kvm_vcpu *vcpu; > + int do_sleep = 1; > + > DEFINE_WAIT(wait); > > prepare_to_wait(&vc->wq, &wait, TASK_INTERRUPTIBLE); > + > + /* > + * Check one last time for pending exceptions and ceded state after > + * we put ourselves on the wait queue > + */ > + list_for_each_entry(vcpu, &vc->runnable_threads, arch.run_list) { > + if (vcpu->arch.pending_exceptions || !vcpu->arch.ceded) { > + do_sleep = 0; > + break; > + } > + } > + > + if (!do_sleep) { > + finish_wait(&vc->wq, &wait); > + return; > + } > + > vc->vcore_state = VCORE_SLEEPING; > spin_unlock(&vc->lock); > schedule(); > -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html