Re: [RFC-PATCH 1/2] mm: Add __GFP_NO_LOCKS flag
From: Paul E. McKenney
Date: Thu Aug 13 2020 - 13:27:58 EST
On Thu, Aug 13, 2020 at 07:12:11PM +0200, Michal Hocko wrote:
> On Thu 13-08-20 09:29:04, Paul E. McKenney wrote:
> > On Thu, Aug 13, 2020 at 06:13:57PM +0200, Michal Hocko wrote:
> > > On Thu 13-08-20 09:04:42, Paul E. McKenney wrote:
> > > > On Thu, Aug 13, 2020 at 05:54:12PM +0200, Michal Hocko wrote:
> > > [...]
> > > > > If the whole bailout is guarded by CONFIG_PREEMPT_RT specific atomicity
> > > > > check then there is no functional problem - GFP_RT_SAFE would still be
> > > > > GFP_NOWAIT so functional wise the allocator will still do the right
> > > > > thing.
> > > >
> > > > Perhaps it was just me getting confused, early hour Pacific Time and
> > > > whatever other excuses might apply. But I thought that you still had
> > > > an objection to GFP_RT_SAFE based on changes in allocator semantics for
> > > > other users.
> > >
> > > There is still that problem with lockdep complaining about raw->regular
> > > spinlock on !PREEMPT_RT that would need to get resolved somehow. Thomas
> > > is not really keen on adding some lockdep annotation mechanism and
> > > unfortunatelly I do not have a different idea how to get rid of those.
> >
> > OK. So the current situation requires a choice between these these
> > alternatives, each of which has shortcomings that have been mentioned
> > earlier in this thread:
> >
> > 1. Prohibit invoking allocators from raw atomic context, such
> > as when holding a raw spinlock.
> >
> > 2. Adding a GFP_ flag.
>
> Which would implemente a completely new level atomic allocation for all
> preemption models
>
> >
> > 3. Reusing existing GFP_ flags/values/whatever to communicate
> > the raw-context information that was to be communicated by
> > the new GFP_ flag.
>
> this would have to be RT specific to not change the semantic for
> existing users. In other words make NOWAIT semantic working for
> RT atomic contexts.
>
> >
> > 4. Making lockdep forgive acquiring spinlocks while holding
> > raw spinlocks, but only in CONFIG_PREEMPT_NONE=y kernels.
>
> and this would have to go along with 3 to remove false positives on !RT.
OK, let's fill in the issues, then:
1. Prohibit invoking allocators from raw atomic context, such
as when holding a raw spinlock.
o This would prevent an important cache-locality
optimization.
2. Adding a GFP_ flag.
o Requires a new level atomic allocation for all preemption
models, namely, confined to the allocator's lockless
caches.
3. Reusing existing GFP_ flags/values/whatever to communicate
the raw-context information that was to be communicated by
the new GFP_ flag.
o There are existing users of all combinations that might
be unhappy with a change of semantics.
o But Michal is OK with this if usage is restricted to RT.
Except that this requires #4 below:
4. Making lockdep forgive acquiring spinlocks while holding
raw spinlocks, but only in CONFIG_PREEMPT_NONE=y kernels.
o This would allow latency degradation and other bad coding
practices to creep in, per Thomas's recent email.
Again, am I missing anything?
Thanx, Paul