Message ID | 20240618204750.79512-1-sidhartha.kumar@oracle.com (mailing list archive) |
---|---|
Headers | show |
Series | Introduce a store type enum for the Maple tree | expand |
Thanks! Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com> * Sidhartha Kumar <sidhartha.kumar@oracle.com> [240618 16:48]: > This series is rebased on top of mm-unstable + the patch: > maple_tree: modified return type of mas_wr_store_entry()[1]. Andrew could > you add that patch to mm-unstable before merging this series. > > > v2[2] -> v3: > - fix new line issues throughout the series > > - remove use of helper function in patch 13 > > > v1[3] -> v2: > - previous results were noisy, replaced with stress-ng-mmap config of > mmtests > > - document function parameter 'entry'in 'mas_prealloc_calc per Intel > Test Robot > > - explain why mas_reset() was dropeed in patch 4 > > - add locking and mas_destroy() to testcase in patch 4 > > - squash "set write store type" vs "set store type" into the > mas_wr_store_entry() modification > > - only set ret to xa_err() in the err case in mas_store_gfp() > > - move MT_BUG_ON() inside lock in patch 7 > > - noinline mas_wr_spanning store to reduce stack usage in > mas_wr_store_type() in patch 11 per Intel Test Robot > > - document function parameter gfp in mas_insert() per Intel > test robot. > > - further simplify the local variables in patch 11 > > ================================ OVERVIEW ================================ > > This series implements two work items[4]: "aligning mas_store_gfp() with > mas_preallocate()" and "enum for store type". > > mas_store_gfp() is modified to preallocate nodes. This simplies many of > the write helper functions by allowing them to use mas_store_gfp() rather > than open coding node allocation and error handling. > > The enum defines the following store types: > > enum store_type { > wr_invalid, > wr_new_root, > wr_store_root, > wr_exact_fit, > wr_spanning_store, > wr_split_store, > wr_rebalance, > wr_append, > wr_node_store, > wr_slot_store, > wr_bnode > }; > > In the current maple tree code, a walk down the tree is done in > mas_preallocate() to determine the number of nodes needed for this write. > After node allocation, mas_wr_store_entry() will perform another walk to > determine which write helper function to use to complete the write. > > Rather than performing the second walk, we can store the type of write > in the maple write state during node allocation and read this field to > complete the write. > > ================================ RESULTS ================================= > > v6.10_mmap v6.10_mmap_store_type > Duration User 9.80 8.69 > Duration System 2295.94 2243.85 > Duration Elapsed 1010.50 1009.44 > > ================================ TESTING ================================= > > Testing was done with the maple tree test suite. A new test case is also > added to validate the order in which we test for and assign the store type. > > [1]: https://lore.kernel.org/linux-mm/20240614092428.29491-1-rgbi3307@gmail.com/T/ > [2]: https://lore.kernel.org/linux-mm/20240607185257.963768-1-sidhartha.kumar@oracle.com/T/#ma3795b93f9d5c9c9286291e12f089bff45b87fed > [3]: https://lore.kernel.org/linux-mm/20240604174145.563900-1-sidhartha.kumar@oracle.com/ > [4]: https://lists.infradead.org/pipermail/maple-tree/2023-December/003098.html > > > Sidhartha Kumar (16): > maple_tree: introduce store_type enum > maple_tree: introduce mas_wr_prealloc_setup() > maple_tree: move up mas_wr_store_setup() and mas_wr_prealloc_setup() > maple_tree: introduce mas_wr_store_type() > maple_tree: remove mas_destroy() from mas_nomem() > maple_tree: use mas_store_gfp() in mas_erase() > maple_tree: use mas_store_gfp() in mtree_store_range() > maple_tree: print store type in mas_dump() > maple_tree: use store type in mas_wr_store_entry() > maple_tree: convert mas_insert() to preallocate nodes > maple_tree: simplify mas_commit_b_node() > maple_tree: remove mas_wr_modify() > maple_tree: have mas_store() allocate nodes if needed > maple_tree: remove node allocations from various write helper > functions > maple_tree: remove repeated sanity checks from mas_wr_append() > maple_tree: remove unneeded mas_wr_walk() in mas_store_prealloc() > > include/linux/maple_tree.h | 15 + > lib/maple_tree.c | 580 ++++++++++++++++++------------- > tools/testing/radix-tree/maple.c | 46 ++- > 3 files changed, 396 insertions(+), 245 deletions(-) > > -- > 2.45.2 >
On Tue, 18 Jun 2024, Sidhartha Kumar wrote: > This series is rebased on top of mm-unstable + the patch: > maple_tree: modified return type of mas_wr_store_entry()[1]. Andrew could > you add that patch to mm-unstable before merging this series. > > v2[2] -> v3: > - fix new line issues throughout the series > - remove use of helper function in patch 13 Please give tmpfs a try on the latest mm-unstable, with CONFIG_DEBUG_ATOMIC_SLEEP=y (maybe some of the messages below come from other config options like PROVE_LOCKING, but ATOMIC_SLEEP the main one). To the un-maple-trained eye, this series simply replaces a working maple tree preallocation scheme by a broken one, doing GFP_KERNEL allocations while holding spinlock. But I doubt that was the intention: maybe a line of code has gone missing or something, and you can quickly unbreak it. BUG: sleeping function called from invalid context at include/linux/sched/mm.h:337 in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 63, name: kdevtmpfs preempt_count: 1, expected: 0 RCU nest depth: 0, expected: 0 3 locks held by kdevtmpfs/63: #0: ffff8880008473f0 (sb_writers){.+.+}-{0:0}, at: mnt_want_write+0x19/0x40 #1: ffff8880008a0888 (&type->i_mutex_dir_key/1){+.+.}-{3:3}, at: filename_create+0x8a/0x120 #2: ffff8880008a0650 (&simple_offset_lock_class){+.+.}-{2:2}, at: mtree_alloc_cyclic+0x72/0xb0 Preemption disabled at: [<ffffffff81138b94>] preempt_count_add+0x54/0x60 CPU: 4 UID: 0 PID: 63 Comm: kdevtmpfs Not tainted 6.10.0-rc5-m25 #2 Hardware name: LENOVO 20XXS3LA00/20XXS3LA00, BIOS N32ET91W (1.67 ) 02/02/2024 Call Trace: <TASK> dump_stack_lvl+0x5d/0x80 ? preempt_count_add+0x54/0x60 dump_stack+0x10/0x20 __might_resched+0x23b/0x260 ? mas_alloc_nodes+0x71/0x160 __might_sleep+0x56/0x60 might_alloc+0x2a/0x40 kmem_cache_alloc_noprof+0x28/0x190 mas_alloc_nodes+0x71/0x160 ? lock_is_held+0xc/0x10 mas_node_count_gfp+0x2e/0x30 mas_wr_preallocate+0x43/0x60 mas_insert.isra.0+0x49/0xa0 mas_alloc_cyclic+0x9c/0x100 mtree_alloc_cyclic+0x92/0xb0 simple_offset_add+0x3c/0x60 shmem_mknod+0x55/0xb0 vfs_mknod+0x9c/0xc0 devtmpfs_work_loop+0x1c4/0x2a0 ? trace_hardirqs_on+0x37/0x40 ? _raw_spin_unlock_irqrestore+0x39/0x50 ? complete_with_flags+0x40/0x50 ? dmar_validate_one_drhd+0xa0/0xa0 devtmpfsd+0x25/0x30 kthread+0x100/0x110 ? list_del_init+0x30/0x30 ret_from_fork+0x22/0x40 ? list_del_init+0x30/0x30 ret_from_fork_asm+0x11/0x20 and lots more like that. Thanks, Hugh