Message ID | 20170913200824.28067-8-dave@stgolabs.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 13/09/2017 22:08, Davidlohr Bueso wrote: > For example, the following could occur, making us miss a wakeup: > > CPU0 CPU1 > kvm_vcpu_block kvm_mips_comparecount_func > [L] swait_active(&vcpu->wq) > [S] prepare_to_swait(&vcpu->wq) > [L] if (!kvm_vcpu_has_pending_timer(vcpu)) > schedule() [S] queue_timer_int(vcpu) > > Ensure that the swait_active() check is not hoisted over the interrupt. > > Signed-off-by: Davidlohr Bueso <dbueso@suse.de> > --- > arch/mips/kvm/mips.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c > index bce2a6431430..d535edc01434 100644 > --- a/arch/mips/kvm/mips.c > +++ b/arch/mips/kvm/mips.c > @@ -514,7 +514,7 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, > > dvcpu->arch.wait = 0; > > - if (swait_active(&dvcpu->wq)) > + if (swq_has_sleeper(&dvcpu->wq)) > swake_up(&dvcpu->wq); > > return 0; > @@ -1179,7 +1179,7 @@ static void kvm_mips_comparecount_func(unsigned long data) > kvm_mips_callbacks->queue_timer_int(vcpu); > > vcpu->arch.wait = 0; > - if (swait_active(&vcpu->wq)) > + if (swq_has_sleeper(&vcpu->wq)) > swake_up(&vcpu->wq); > } > > has_sleeper*s*. Can fix when committing. Paolo
On Wed, 13 Sep 2017, Paolo Bonzini wrote:
>has_sleeper*s*. Can fix when committing.
So for regular waitqueues we have it singular, which is why I kept
that name -- albeit sleepers() being better suited, yes. I don't think
we want to rename it unless we rename all wq_has_sleeper() callers as
well.
Thanks,
Davidlohr
diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c index bce2a6431430..d535edc01434 100644 --- a/arch/mips/kvm/mips.c +++ b/arch/mips/kvm/mips.c @@ -514,7 +514,7 @@ int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, dvcpu->arch.wait = 0; - if (swait_active(&dvcpu->wq)) + if (swq_has_sleeper(&dvcpu->wq)) swake_up(&dvcpu->wq); return 0; @@ -1179,7 +1179,7 @@ static void kvm_mips_comparecount_func(unsigned long data) kvm_mips_callbacks->queue_timer_int(vcpu); vcpu->arch.wait = 0; - if (swait_active(&vcpu->wq)) + if (swq_has_sleeper(&vcpu->wq)) swake_up(&vcpu->wq); }
For example, the following could occur, making us miss a wakeup: CPU0 CPU1 kvm_vcpu_block kvm_mips_comparecount_func [L] swait_active(&vcpu->wq) [S] prepare_to_swait(&vcpu->wq) [L] if (!kvm_vcpu_has_pending_timer(vcpu)) schedule() [S] queue_timer_int(vcpu) Ensure that the swait_active() check is not hoisted over the interrupt. Signed-off-by: Davidlohr Bueso <dbueso@suse.de> --- arch/mips/kvm/mips.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)