Messages in this thread | | | Date | Wed, 15 Jul 2020 15:14:49 -0700 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH 1/1] rcu/tree: Drop the lock before entering to page allocator |
| |
On Wed, Jul 15, 2020 at 09:32:50PM +0200, Sebastian Andrzej Siewior wrote: > On 2020-07-15 21:02:43 [+0200], Uladzislau Rezki wrote: > > > > <snip> > > spin_lock(); > > __get_free_page(GFP_NOWAIT | __GFP_NOWARN); > > spin_unlock(); > > <snip> > > > > Also, please note we do it for regular kernel. > > ach right okay then. > > > > > > > What happened to the part where I asked for a spinlock_t? > > > > > What do you mean? > > Please drop that raw_spinlock_t for the kfree_rcu() based locking and > use just a plain spinlock_t for the locking. Then you can keep the same > code flow for RT and !RT without any special cases and everything.
My concern is that some critical bug will show up at some point that requires double-argument kfree_rcu() be invoked while holding a raw spinlock. (Single-argument kfree_rcu() must sometimes invoke synchronize_rcu(), so it can never be invoked in any state forbidding invoking schedule().)
Yes, dropping to a plain spinlock would be simple in the here and now, but experience indicates that it is only a matter of time, and that when that time comes it will come as an emergency.
One approach would be to replace the "IS_ENABLED(CONFIG_PREEMPT_RT)" with some sort of check for being in a context where spinlock acquisition is not legal. What could be done along those lines?
Thanx, Paul
| |