Re: Section 7.3.2: Mention of futexes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Sorry, I think I went on a tangent and lost the gist of my original
point. Let me clarify.

The paragraph in the book discusses a real problem with spin locks. A
low priority thread acquires a spin lock. A high priority thread
preempts it and attempts to acquire the same lock. Under certain
circumstances (single processor machines, core affinity) this can lead
to a deadlock. Such a deadlock is solved by using blocking locks
instead of spin locks. Linux futexes implement one kind of a blocking
lock, but I don't think are special in this sense. Moreover, blocking
locks are susceptible to a different problem in this scenario, as the
high priority thread is effectively waiting for the lock at the
priority of the low-priority thread (priority inversion). The
situation is remedied (I wouldn't necessarily say solved) by protocols
such as priority inheritance and priority protection.

--Elad

On Wed, 19 Oct 2022 at 20:18, Elad Lahav <e2lahav@xxxxxxxxx> wrote:
>
> Hmm... I may be wrong but I thought Linux futexes worked the same way
> as QNX mutexes:
>
> 1. The kernel provides a blocking call, implementing a classic mutex
> (SyncMutexLock() in the QNX case)
> 2. The C library wraps this call (pthread_mutex_lock()) with an
> attempt to acquire a user-mode lock without entering the kernel, using
> an atomic compare-exchange. The kernel call is invoked only if the
> atomic operation fails.
>
> If that is true for Linux then I still don't see how it is related to
> spin locks, which don't block, and the legitimate requirement to
> prevent preemption while holding a spin lock. It is definitely
> legitimate to say "don't use spin locks in user code, use blocking
> locks instead". In a micro-kernel based OS you may have to use spin
> locks in user-mode drivers that need to interact with ISRs, but those
> need to go beyond disabling preemption and disable interrupts
> completely.
>
> --Elad
>
> On Wed, 19 Oct 2022 at 18:15, Paul E. McKenney <paulmck@xxxxxxxxxx> wrote:
> >
> > On Fri, Oct 14, 2022 at 08:01:29AM -0400, Elad Lahav wrote:
> > > Hello,
> > >
> > > I'm not sure about the statement made in this section: "In contrast,
> > > Linux avoids these hints, in-
> > > stead getting similar results from a mechanism called futexes".
> > > Futexes are just wrappers around kernel mutexes, to speed up the case
> > > of acquiring a free lock. As such they do not solve the priority
> > > inversion problem, and are certainly not a replacement for disabling
> > > pre-emption when using spin locks.
> > > Kernel-level mutexes may address priority inversion by employing one
> > > of the established protocols (priority inheritance or priority
> > > protection).
> > >
> > > Am I missing something?
> >
> > Futexes were the response of the Linux kernel community to the request
> > from certain large database vendors for the ability to disable preemption
> > in userspace applications.  I was there and I heard it with my own ears,
> > but to your point I find little on the web to back this up.  In fact,
> > I am not easily finding the fact that most proprietary UNIX kernels did
> > in fact have userspace disable-preemption hints.
> >
> > Futexes are more a sleep/wakeup mechanism than a wrapper around mutexes,
> > though there was a hilarious bug early on that allowed a usermode
> > application to force a kernel-mode deadlock.  The semantics are involved,
> > a fact being driven home to those attempting to standardize it.
> >
> > How about the following change?  This documents futexes as the response
> > to the request for scheduler-conscious synchronization, but does not
> > claim anything beyond that.
> >
> >                                                         Thanx, Paul
> >
> > ------------------------------------------------------------------------
> >
> > commit 63c4deb868d5eec9df96fd8810e58e1519abb392
> > Author: Paul E. McKenney <paulmck@xxxxxxxxxx>
> > Date:   Wed Oct 19 15:14:03 2022 -0700
> >
> >     locking: Avoid over-claiming for futexes
> >
> >     It is true that futexes were the response of the Linux-kernel community
> >     to requests for user-mode disabling of preemption, but it is not clear
> >     how futexes were evaluated by those making the requests.
> >
> >     Reported-by: Elad Lahav <e2lahav@xxxxxxxxx>
> >     Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx>
> >
> > diff --git a/locking/locking.tex b/locking/locking.tex
> > index b138cd59..6d3bb1c8 100644
> > --- a/locking/locking.tex
> > +++ b/locking/locking.tex
> > @@ -2057,8 +2057,9 @@ being placed in a machine register.
> >  These hints frequently take the form of a bit set in a particular
> >  machine register, which enables extremely low per-lock-acquisition overhead
> >  for these mechanisms.
> > -In contrast, Linux avoids these hints, instead getting
> > -similar results from a mechanism called
> > +In contrast, Linux avoids these hints.
> > +Instead, the Linux kernel community's response to requests for
> > +scheduler-conscious synchronization was a mechanism called
> >  \emph{futexes}~\cite{HubertusFrancke2002Futex,IngoMolnar2006RobustFutexes,StevenRostedt2006piFutexes,UlrichDrepper2011Futexes}.
> >
> >  Interestingly enough, atomic instructions are not strictly needed to



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux