On 03.11.14 05:52, Paul Mackerras wrote:
> From: "Suresh E. Warrier" <[email protected]>
>
> 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 <[email protected]>
> Signed-off-by: Paul Mackerras <[email protected]>
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html