On Fri, May 05, 2017 at 12:45:38PM +0200, Paolo Bonzini wrote: > > > On 05/05/2017 12:25, Stefan Hajnoczi wrote: > > On Thu, May 04, 2017 at 06:06:39PM +0200, Paolo Bonzini wrote: > >> On 04/05/2017 16:59, Stefan Hajnoczi wrote: > >>> On Thu, Apr 20, 2017 at 02:00:55PM +0200, Paolo Bonzini wrote: > >>>> Hot path reqs_lock critical sections are very small; the only large > >>>> critical > >>>> sections happen when a request waits for serialising requests, and these > >>>> should never happen in usual circumstances. > >>>> > >>>> We do not want these small critical sections to yield in any case, > >>>> which calls for using a spinlock while writing the list. > >>> > >>> Is this patch purely an optimization? > >> > >> Yes, it is, and pretty much a no-op until we have true multiqueue. But > >> I expect it to have a significant effect for multiqueue. > >> > >>> I'm hesitant about using spinlocks in userspace. There are cases where > >>> the thread is descheduled that are beyond our control. Nested virt will > >>> probably make things worse. People have been optimizing and trying > >>> paravirt approaches to kernel spinlocks for these reasons for years. > >> > >> This is true, but here we're talking about a 5-10 instruction window for > >> preemption; it matches the usage of spinlocks in other parts of QEMU. > > > > Only util/qht.c uses spinlocks, it's not a widely used primitive. > > Right, but the idea is the same---very short, heavy and > performance-critical cases use spinlocks. (util/qht.c is used heavily > in TCG mode). > > >> It is efficient when there is no contention, but when there is, the > >> latency goes up by several orders of magnitude. > > > > Doesn't glibc spin for a while before waiting on the futex? i.e. the > > best of both worlds. > > You have to specify that manually with pthread_mutexattr_settype(..., > PTHRED_MUTEX_ADAPTIVE_NP). It is not enabled by default because IIUC > the adaptive one doesn't support pthread_mutex_timedlock.
If you want to use spinlocks in QEMU please document strict rules that ensure they will be used safely. For example, I'd be comfortable with: Spinlock regions may only call functions in the same source file or functions explicitly documented as spinlock-safe. Only memory accesses and computation may be performed; do not make system calls or invoke library functions. Stefan
signature.asc
Description: PGP signature