Re: [patch -rt 1/2] KVM: use simple waitqueue for vcpu->wq

Thomas Gleixner
2014-11-25T20:23:25Z

On Tue, 25 Nov 2014, Rik van Riel wrote:
> On 11/25/2014 12:21 PM, Marcelo Tosatti wrote:
> > The problem:
> >
> > On -RT, an emulated LAPIC timer instances has the following path:
> >
> > 1) hard interrupt
> > 2) ksoftirqd is scheduled
> > 3) ksoftirqd wakes up vcpu thread
> > 4) vcpu thread is scheduled
> >
> > This extra context switch introduces unnecessary latency in the
> > LAPIC path for a KVM guest.
> >
> > The solution:
> >
> > Allow waking up vcpu thread from hardirq context,
> > thus avoiding the need for ksoftirqd to be scheduled.
> >
> > Normal waitqueues make use of spinlocks, which on -RT
> > are sleepable locks. Therefore, waking up a waitqueue
> > waiter involves locking a sleeping lock, which
> > is not allowed from hard interrupt context.
> >
>
> What are the consequences for the realtime kernel of
> making waitqueue traversal non-preemptible?
>
> Is waitqueue traversal something that ever takes so
> long we need to care about it being non-preemptible?

__wake_up
lock_irq_save()
__wake_up_common()
for_each_entry(curr)
curr->func()
unlock_irq_save()

There are two issues here:

1) Long waiter chains. We probably could work around that in some
creative way

2) The non default callbacks. default is default_wake_function.

The non default callbacks, which are used by nfsd and other stuff
are calling the world and some more and take preemptible locks and
do other fancy stuff which falls flat on its nose when called under
a raw lock on rt

So I created the swait replacement which has a smaller memory
footprint, less featuritis and a raw lock because its only wakes up,
no custom callbacks.

The still suffer #1, but most use cases on RT are single waiter
scenarios anyway.

Hope that helps.

Thanks,

tglx