On Mon, Feb 03, 2025 at 10:28:46AM +0100, Vlastimil Babka wrote: > Following the move of the TREE_RCU batching kvfree_rcu() implementation > to slab, we still have the simple non-batching implementation in tiny > RCU, and RCU implementation specific ifdefs in slab code. > > Finish the move and integration into slab. Allow using the simple > call_rcu() based implementation also with tree RCU when SLUB_TINY is > enabled, as its goal is also to limit memory footprint with less concern > for top performance. > > In order to avoid RCU having to recognize the fake callback function > pointers (__is_kvfree_rcu_offset()) when handling call_rcu(), implement > a callback that can calculate the object's address from the embedded > rcu_head pointer without knowing the specific offset (previously SLOB > would not have made it possible, but it's gone now). > > After this series, AFAIK only the following kvfree_rcu specific code > remains in RCU: > > - a call to kfree_rcu_scheduler_running() from rcu_set_runtime_mode() > > - probably necessary and a generic registration interface would be > unnecessary bloat? I am OK with this calling directly. Alternatively, you could create a core_initcall() that did nothing but invoke kfree_rcu_scheduler_running(), and then drop that call from rcu_set_runtime_mode(). Up to you guys! > - declarations of kfree_rcu() API in include/linux/rcupdate.h > > - could be moved to slab.h after checking for/fixing up potential > missing includes It would be good to move them, but no real hurry from this end. > git tree: > https://git.kernel.org/pub/scm/linux/kernel/git/vbabka/linux.git/log/?h=b4/slub-tiny-kfree_rcu > > Changes since RFC [1]: > - Rebased to v6.14-rc1 > - Fixed build errors reported by bots. > - Changed where kvfree_call_rcu() is moved to in patch 1 to avoid another > move in patch 4. > - R-b's by Ulad and Joel > - Fix a memory leak in kvfree_rcu_list() thanks to Ulad > - Various comments' improvements and fixes (Joel, Ulad) > - Rename config to CONFIG_KFREE_RCU_BATCHED (Ulad) > > Due to changes, didn't keep Paul's Tested-by (but thanks!) I re-ran the tests, so feel free to add it back in. ;-) Thanx, Paul > Will include in slab/for-next if no objection. > > [1] https://lore.kernel.org/all/20250123-slub-tiny-kfree_rcu-v1-0-0e386ef1541a@xxxxxxx/ > > To: Christoph Lameter <cl@xxxxxxxxx> > To: David Rientjes <rientjes@xxxxxxxxxx> > Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > Cc: Roman Gushchin <roman.gushchin@xxxxxxxxx> > Cc: Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx> > Cc: linux-mm@xxxxxxxxx > To: "Paul E. McKenney" <paulmck@xxxxxxxxxx> > To: Joel Fernandes <joel@xxxxxxxxxxxxxxxxx> > To: Josh Triplett <josh@xxxxxxxxxxxxxxxx> > To: Boqun Feng <boqun.feng@xxxxxxxxx> > To: Uladzislau Rezki <urezki@xxxxxxxxx> > Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> > Cc: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> > Cc: Lai Jiangshan <jiangshanlai@xxxxxxxxx> > Cc: Zqiang <qiang.zhang1211@xxxxxxxxx> > Cc: rcu@xxxxxxxxxxxxxxx > > Signed-off-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > Vlastimil Babka (4): > slab, rcu: move TINY_RCU variant of kvfree_rcu() to SLAB > rcu: remove trace_rcu_kvfree_callback > rcu, slab: use a regular callback function for kvfree_rcu > slab: don't batch kvfree_rcu() with SLUB_TINY > > include/linux/rcupdate.h | 33 ++++++++++++++++++--------------- > include/linux/rcutiny.h | 36 ------------------------------------ > include/linux/rcutree.h | 3 --- > include/linux/slab.h | 14 ++++++++++++++ > include/trace/events/rcu.h | 34 ---------------------------------- > kernel/rcu/tiny.c | 25 ------------------------- > kernel/rcu/tree.c | 9 ++------- > mm/Kconfig | 4 ++++ > mm/slab.h | 2 ++ > mm/slab_common.c | 33 +++++++++++++++++++++++++++------ > mm/slub.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 11 files changed, 113 insertions(+), 126 deletions(-) > --- > base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b > change-id: 20250123-slub-tiny-kfree_rcu-bd65bfe222f2 > > Best regards, > -- > Vlastimil Babka <vbabka@xxxxxxx> >