* [PATCH 0/3] align maple tree write paths
@ 2023-10-09 20:16 Sidhartha Kumar
2023-10-09 20:16 ` [PATCH 1/3] maple_tree: introduce mas_prealloc_calc() Sidhartha Kumar
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Sidhartha Kumar @ 2023-10-09 20:16 UTC (permalink / raw)
To: linux-kernel, linux-mm, maple-tree
Cc: akpm, willy, liam.howlett, zhangpeng.00, Sidhartha Kumar
This series modifies the store paths in mas_store_gfp() and mas_erase() to
use the newly refined preallocation calculation before their calls to
mas_wr_store_entry(). This will avoid having to do worst case calculations.
Patch 1 abstracts the calculation outside of mas_preallocate() so it can
be used externally.
Patch 2 modifies the write path in mas_store_gfp() to use preallocations
and patch 3 does this in mas_erase().
The motivation for this series is part of the Maple Tree work list[1].
========== TESTING ==============
Testing was done with the maple tree test suite.
maple_tree: 570172962 of 570172962 tests passed
rebased on mm-unstable 10/09/23
[1]: https://lore.kernel.org/linux-mm/20230912172845.o54szwf33hc6p7ee@revolver/T/
Sidhartha Kumar (3):
maple_tree: introduce mas_prealloc_calc()
maple_tree: use preallocations in mas_store_gfp()
maple_tree: use preallocations in mas_erase()
lib/maple_tree.c | 128 ++++++++++++++++++++++++++++++++---------------
1 file changed, 88 insertions(+), 40 deletions(-)
--
2.41.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
2023-10-09 20:16 [PATCH 0/3] align maple tree write paths Sidhartha Kumar
@ 2023-10-09 20:16 ` Sidhartha Kumar
2023-10-09 22:25 ` kernel test robot
` (2 more replies)
2023-10-09 20:16 ` [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp() Sidhartha Kumar
2023-10-09 20:16 ` [PATCH 3/3] maple_tree: use preallocations in mas_erase() Sidhartha Kumar
2 siblings, 3 replies; 14+ messages in thread
From: Sidhartha Kumar @ 2023-10-09 20:16 UTC (permalink / raw)
To: linux-kernel, linux-mm, maple-tree
Cc: akpm, willy, liam.howlett, zhangpeng.00, Sidhartha Kumar
Abstract the calculation used to determine the number of nodes needed for
a store operation into a separate function: mas_prealloc_calc().
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
lib/maple_tree.c | 85 ++++++++++++++++++++++++++++--------------------
1 file changed, 50 insertions(+), 35 deletions(-)
diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index 0e00a84e8e8f..e239197a57fc 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -5418,6 +5418,54 @@ void *mas_store(struct ma_state *mas, void *entry)
}
EXPORT_SYMBOL_GPL(mas_store);
+/**
+ * mas_prealloc_calc() - Calculate number of nodes needed for a
+ * store operation.
+ * @wr_mas: The maple write state
+ *
+ * Return: Number of nodes required for preallocation.
+ */
+int mas_prealloc_calc(struct ma_wr_state *wr_mas)
+{
+ struct ma_state *mas = wr_mas->mas;
+ unsigned char node_size;
+
+ if (unlikely(!mas->index && mas->last == ULONG_MAX))
+ return 1;
+
+ /* Root expand */
+ if (unlikely(mas_is_none(mas) || mas_is_ptr(mas)))
+ return 1;
+
+ if (unlikely(!mas_wr_walk(wr_mas))) {
+ /* Spanning store, use worst case for now */
+ return 1 + mas_mt_height(mas) * 3;
+ }
+
+ /* At this point, we are at the leaf node that needs to be altered. */
+ /* Exact fit, no nodes needed. */
+ if (wr_mas->r_min == mas->index && wr_mas->r_max == mas->last)
+ return 0;
+
+ mas_wr_end_piv(wr_mas);
+ node_size = mas_wr_new_end(wr_mas);
+ if (node_size >= mt_slots[wr_mas->type]) {
+ /* Split, worst case for now. */
+ return 1 + mas_mt_height(mas) * 2;
+ }
+
+ /* New root needs a singe node */
+ if (unlikely(mte_is_root(mas->node)))
+ return 1;
+
+ /* Potential spanning rebalance collapsing a node, use worst-case */
+ if (node_size - 1 <= mt_min_slots[wr_mas->type])
+ return mas_mt_height(mas) * 2 - 1;
+
+ /* node store, slot store needs one node */
+ return 1;
+}
+
/**
* mas_store_gfp() - Store a value into the tree.
* @mas: The maple state
@@ -5474,49 +5522,16 @@ EXPORT_SYMBOL_GPL(mas_store_prealloc);
int mas_preallocate(struct ma_state *mas, void *entry, gfp_t gfp)
{
MA_WR_STATE(wr_mas, mas, entry);
- unsigned char node_size;
int request = 1;
int ret;
-
- if (unlikely(!mas->index && mas->last == ULONG_MAX))
- goto ask_now;
-
mas_wr_store_setup(&wr_mas);
wr_mas.content = mas_start(mas);
- /* Root expand */
- if (unlikely(mas_is_none(mas) || mas_is_ptr(mas)))
- goto ask_now;
- if (unlikely(!mas_wr_walk(&wr_mas))) {
- /* Spanning store, use worst case for now */
- request = 1 + mas_mt_height(mas) * 3;
- goto ask_now;
- }
-
- /* At this point, we are at the leaf node that needs to be altered. */
- /* Exact fit, no nodes needed. */
- if (wr_mas.r_min == mas->index && wr_mas.r_max == mas->last)
+ request = mas_prealloc_calc(&wr_mas);
+ if (!request)
return 0;
- mas_wr_end_piv(&wr_mas);
- node_size = mas_wr_new_end(&wr_mas);
- if (node_size >= mt_slots[wr_mas.type]) {
- /* Split, worst case for now. */
- request = 1 + mas_mt_height(mas) * 2;
- goto ask_now;
- }
-
- /* New root needs a singe node */
- if (unlikely(mte_is_root(mas->node)))
- goto ask_now;
-
- /* Potential spanning rebalance collapsing a node, use worst-case */
- if (node_size - 1 <= mt_min_slots[wr_mas.type])
- request = mas_mt_height(mas) * 2 - 1;
-
- /* node store, slot store needs one node */
-ask_now:
mas_node_count_gfp(mas, request, gfp);
mas->mas_flags |= MA_STATE_PREALLOC;
if (likely(!mas_is_err(mas)))
--
2.41.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()
2023-10-09 20:16 [PATCH 0/3] align maple tree write paths Sidhartha Kumar
2023-10-09 20:16 ` [PATCH 1/3] maple_tree: introduce mas_prealloc_calc() Sidhartha Kumar
@ 2023-10-09 20:16 ` Sidhartha Kumar
2023-10-10 3:03 ` Peng Zhang
` (2 more replies)
2023-10-09 20:16 ` [PATCH 3/3] maple_tree: use preallocations in mas_erase() Sidhartha Kumar
2 siblings, 3 replies; 14+ messages in thread
From: Sidhartha Kumar @ 2023-10-09 20:16 UTC (permalink / raw)
To: linux-kernel, linux-mm, maple-tree
Cc: akpm, willy, liam.howlett, zhangpeng.00, Sidhartha Kumar
Preallocate maple nodes before call to mas_wr_store_entry(). If a new
node is not needed, go directly to mas_wr_store_entry(), otherwise
allocate the needed nodes and set the MA_STATE_PREALLOC flag.
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
lib/maple_tree.c | 22 +++++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index e239197a57fc..25ae66e585f4 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -5478,17 +5478,33 @@ int mas_prealloc_calc(struct ma_wr_state *wr_mas)
int mas_store_gfp(struct ma_state *mas, void *entry, gfp_t gfp)
{
MA_WR_STATE(wr_mas, mas, entry);
+ int request;
mas_wr_store_setup(&wr_mas);
- trace_ma_write(__func__, mas, 0, entry);
-retry:
+ wr_mas.content = mas_start(mas);
+
+ request = mas_prealloc_calc(&wr_mas);
+ if (!request)
+ goto store_entry;
+
+ mas_node_count_gfp(mas, request, gfp);
+ if (unlikely(mas_is_err(mas))) {
+ mas_set_alloc_req(mas, 0);
+ mas_destroy(mas);
+ mas_reset(mas);
+ return xa_err(mas->node);
+ }
+ mas->mas_flags |= MA_STATE_PREALLOC;
+
+store_entry:
mas_wr_store_entry(&wr_mas);
if (unlikely(mas_nomem(mas, gfp)))
- goto retry;
+ goto store_entry;
if (unlikely(mas_is_err(mas)))
return xa_err(mas->node);
+ trace_ma_write(__func__, mas, 0, entry);
return 0;
}
EXPORT_SYMBOL_GPL(mas_store_gfp);
--
2.41.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 3/3] maple_tree: use preallocations in mas_erase()
2023-10-09 20:16 [PATCH 0/3] align maple tree write paths Sidhartha Kumar
2023-10-09 20:16 ` [PATCH 1/3] maple_tree: introduce mas_prealloc_calc() Sidhartha Kumar
2023-10-09 20:16 ` [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp() Sidhartha Kumar
@ 2023-10-09 20:16 ` Sidhartha Kumar
2 siblings, 0 replies; 14+ messages in thread
From: Sidhartha Kumar @ 2023-10-09 20:16 UTC (permalink / raw)
To: linux-kernel, linux-mm, maple-tree
Cc: akpm, willy, liam.howlett, zhangpeng.00, Sidhartha Kumar
Preallocate the number of needed nodes before mas_wr_store_entry().
Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
lib/maple_tree.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index 25ae66e585f4..ef8d4b6b4456 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -6191,6 +6191,7 @@ void *mas_erase(struct ma_state *mas)
{
void *entry;
MA_WR_STATE(wr_mas, mas, NULL);
+ int request;
if (mas_is_none(mas) || mas_is_paused(mas))
mas->node = MAS_START;
@@ -6200,14 +6201,30 @@ void *mas_erase(struct ma_state *mas)
if (!entry)
return NULL;
-write_retry:
/* Must reset to ensure spanning writes of last slot are detected */
mas_reset(mas);
mas_wr_store_setup(&wr_mas);
+ wr_mas.content = mas_start(mas);
+
+ request = mas_prealloc_calc(&wr_mas);
+ if (!request)
+ goto store_entry;
+
+ mas_node_count_gfp(mas, request, GFP_KERNEL);
+ if (unlikely(mas_is_err(mas))) {
+ mas_set_alloc_req(mas, 0);
+ mas_destroy(mas);
+ mas_reset(mas);
+ return NULL;
+ }
+ mas->mas_flags |= MA_STATE_PREALLOC;
+
+store_entry:
mas_wr_store_entry(&wr_mas);
if (mas_nomem(mas, GFP_KERNEL))
- goto write_retry;
+ goto store_entry;
+ trace_ma_write(__func__, mas, 0, entry);
return entry;
}
EXPORT_SYMBOL_GPL(mas_erase);
--
2.41.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
2023-10-09 20:16 ` [PATCH 1/3] maple_tree: introduce mas_prealloc_calc() Sidhartha Kumar
@ 2023-10-09 22:25 ` kernel test robot
2023-10-10 22:13 ` Sidhartha Kumar
2023-10-10 11:06 ` kernel test robot
2023-10-18 2:53 ` kernel test robot
2 siblings, 1 reply; 14+ messages in thread
From: kernel test robot @ 2023-10-09 22:25 UTC (permalink / raw)
To: Sidhartha Kumar, linux-kernel, linux-mm, maple-tree
Cc: oe-kbuild-all, akpm, willy, liam.howlett, zhangpeng.00, Sidhartha Kumar
Hi Sidhartha,
kernel test robot noticed the following build warnings:
[auto build test WARNING on akpm-mm/mm-everything]
[also build test WARNING on linus/master v6.6-rc5 next-20231009]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Sidhartha-Kumar/maple_tree-introduce-mas_prealloc_calc/20231010-041859
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20231009201639.920512-2-sidhartha.kumar%40oracle.com
patch subject: [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20231010/202310100603.qsn3ruBx-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231010/202310100603.qsn3ruBx-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202310100603.qsn3ruBx-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> lib/maple_tree.c:5428:5: warning: no previous prototype for 'mas_prealloc_calc' [-Wmissing-prototypes]
5428 | int mas_prealloc_calc(struct ma_wr_state *wr_mas)
| ^~~~~~~~~~~~~~~~~
vim +/mas_prealloc_calc +5428 lib/maple_tree.c
5420
5421 /**
5422 * mas_prealloc_calc() - Calculate number of nodes needed for a
5423 * store operation.
5424 * @wr_mas: The maple write state
5425 *
5426 * Return: Number of nodes required for preallocation.
5427 */
> 5428 int mas_prealloc_calc(struct ma_wr_state *wr_mas)
5429 {
5430 struct ma_state *mas = wr_mas->mas;
5431 unsigned char node_size;
5432
5433 if (unlikely(!mas->index && mas->last == ULONG_MAX))
5434 return 1;
5435
5436 /* Root expand */
5437 if (unlikely(mas_is_none(mas) || mas_is_ptr(mas)))
5438 return 1;
5439
5440 if (unlikely(!mas_wr_walk(wr_mas))) {
5441 /* Spanning store, use worst case for now */
5442 return 1 + mas_mt_height(mas) * 3;
5443 }
5444
5445 /* At this point, we are at the leaf node that needs to be altered. */
5446 /* Exact fit, no nodes needed. */
5447 if (wr_mas->r_min == mas->index && wr_mas->r_max == mas->last)
5448 return 0;
5449
5450 mas_wr_end_piv(wr_mas);
5451 node_size = mas_wr_new_end(wr_mas);
5452 if (node_size >= mt_slots[wr_mas->type]) {
5453 /* Split, worst case for now. */
5454 return 1 + mas_mt_height(mas) * 2;
5455 }
5456
5457 /* New root needs a singe node */
5458 if (unlikely(mte_is_root(mas->node)))
5459 return 1;
5460
5461 /* Potential spanning rebalance collapsing a node, use worst-case */
5462 if (node_size - 1 <= mt_min_slots[wr_mas->type])
5463 return mas_mt_height(mas) * 2 - 1;
5464
5465 /* node store, slot store needs one node */
5466 return 1;
5467 }
5468
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()
2023-10-09 20:16 ` [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp() Sidhartha Kumar
@ 2023-10-10 3:03 ` Peng Zhang
2023-10-11 0:17 ` Sidhartha Kumar
2023-10-10 18:15 ` Liam R. Howlett
2023-10-25 9:52 ` kernel test robot
2 siblings, 1 reply; 14+ messages in thread
From: Peng Zhang @ 2023-10-10 3:03 UTC (permalink / raw)
To: Sidhartha Kumar
Cc: akpm, willy, liam.howlett, zhangpeng.00, linux-kernel,
maple-tree, linux-mm
Hi,
在 2023/10/10 04:16, Sidhartha Kumar 写道:
> Preallocate maple nodes before call to mas_wr_store_entry(). If a new
> node is not needed, go directly to mas_wr_store_entry(), otherwise
> allocate the needed nodes and set the MA_STATE_PREALLOC flag.
>
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
> lib/maple_tree.c | 22 +++++++++++++++++++---
> 1 file changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> index e239197a57fc..25ae66e585f4 100644
> --- a/lib/maple_tree.c
> +++ b/lib/maple_tree.c
> @@ -5478,17 +5478,33 @@ int mas_prealloc_calc(struct ma_wr_state *wr_mas)
> int mas_store_gfp(struct ma_state *mas, void *entry, gfp_t gfp)
> {
> MA_WR_STATE(wr_mas, mas, entry);
> + int request;
>
> mas_wr_store_setup(&wr_mas);
> - trace_ma_write(__func__, mas, 0, entry);
> -retry:
> + wr_mas.content = mas_start(mas);
> +
> + request = mas_prealloc_calc(&wr_mas);
mas_wr_store_entry() does something similar to mas_prealloc_calc().
Now, making it do it twice would incur additional overhead.
We encountered this issue while optimizing preallocation, but it
hasn't been resolved yet. Previously, this problem only occurred
when using mas_preallocate(). Now, this change would bring this
impact to all write operations on maple tree. What do you think
about it?
Thanks,
Peng
> + if (!request)
> + goto store_entry;
> +
> + mas_node_count_gfp(mas, request, gfp);
> + if (unlikely(mas_is_err(mas))) {
> + mas_set_alloc_req(mas, 0);
> + mas_destroy(mas);
> + mas_reset(mas);
> + return xa_err(mas->node);
> + }
> + mas->mas_flags |= MA_STATE_PREALLOC;
> +
> +store_entry:
> mas_wr_store_entry(&wr_mas);
> if (unlikely(mas_nomem(mas, gfp)))
> - goto retry;
> + goto store_entry;
>
> if (unlikely(mas_is_err(mas)))
> return xa_err(mas->node);
>
> + trace_ma_write(__func__, mas, 0, entry);
> return 0;
> }
> EXPORT_SYMBOL_GPL(mas_store_gfp);
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
2023-10-09 20:16 ` [PATCH 1/3] maple_tree: introduce mas_prealloc_calc() Sidhartha Kumar
2023-10-09 22:25 ` kernel test robot
@ 2023-10-10 11:06 ` kernel test robot
2023-10-18 2:53 ` kernel test robot
2 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2023-10-10 11:06 UTC (permalink / raw)
To: Sidhartha Kumar, linux-kernel, linux-mm, maple-tree
Cc: llvm, oe-kbuild-all, akpm, willy, liam.howlett, zhangpeng.00,
Sidhartha Kumar
Hi Sidhartha,
kernel test robot noticed the following build warnings:
[auto build test WARNING on akpm-mm/mm-everything]
[also build test WARNING on linus/master v6.6-rc5 next-20231010]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Sidhartha-Kumar/maple_tree-introduce-mas_prealloc_calc/20231010-041859
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20231009201639.920512-2-sidhartha.kumar%40oracle.com
patch subject: [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
config: um-allnoconfig (https://download.01.org/0day-ci/archive/20231010/202310101854.kMSUyzOr-lkp@intel.com/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231010/202310101854.kMSUyzOr-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202310101854.kMSUyzOr-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> lib/maple_tree.c:5428:5: warning: no previous prototype for function 'mas_prealloc_calc' [-Wmissing-prototypes]
5428 | int mas_prealloc_calc(struct ma_wr_state *wr_mas)
| ^
lib/maple_tree.c:5428:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
5428 | int mas_prealloc_calc(struct ma_wr_state *wr_mas)
| ^
| static
lib/maple_tree.c:348:21: warning: unused function 'mte_set_full' [-Wunused-function]
348 | static inline void *mte_set_full(const struct maple_enode *node)
| ^
lib/maple_tree.c:353:21: warning: unused function 'mte_clear_full' [-Wunused-function]
353 | static inline void *mte_clear_full(const struct maple_enode *node)
| ^
lib/maple_tree.c:358:20: warning: unused function 'mte_has_null' [-Wunused-function]
358 | static inline bool mte_has_null(const struct maple_enode *node)
| ^
lib/maple_tree.c:689:29: warning: unused function 'mas_pivot' [-Wunused-function]
689 | static inline unsigned long mas_pivot(struct ma_state *mas, unsigned char piv)
| ^
lib/maple_tree.c:4201:20: warning: stack frame size (1032) exceeds limit (1024) in 'mas_wr_modify' [-Wframe-larger-than]
4201 | static inline void mas_wr_modify(struct ma_wr_state *wr_mas)
| ^
6 warnings generated.
vim +/mas_prealloc_calc +5428 lib/maple_tree.c
5420
5421 /**
5422 * mas_prealloc_calc() - Calculate number of nodes needed for a
5423 * store operation.
5424 * @wr_mas: The maple write state
5425 *
5426 * Return: Number of nodes required for preallocation.
5427 */
> 5428 int mas_prealloc_calc(struct ma_wr_state *wr_mas)
5429 {
5430 struct ma_state *mas = wr_mas->mas;
5431 unsigned char node_size;
5432
5433 if (unlikely(!mas->index && mas->last == ULONG_MAX))
5434 return 1;
5435
5436 /* Root expand */
5437 if (unlikely(mas_is_none(mas) || mas_is_ptr(mas)))
5438 return 1;
5439
5440 if (unlikely(!mas_wr_walk(wr_mas))) {
5441 /* Spanning store, use worst case for now */
5442 return 1 + mas_mt_height(mas) * 3;
5443 }
5444
5445 /* At this point, we are at the leaf node that needs to be altered. */
5446 /* Exact fit, no nodes needed. */
5447 if (wr_mas->r_min == mas->index && wr_mas->r_max == mas->last)
5448 return 0;
5449
5450 mas_wr_end_piv(wr_mas);
5451 node_size = mas_wr_new_end(wr_mas);
5452 if (node_size >= mt_slots[wr_mas->type]) {
5453 /* Split, worst case for now. */
5454 return 1 + mas_mt_height(mas) * 2;
5455 }
5456
5457 /* New root needs a singe node */
5458 if (unlikely(mte_is_root(mas->node)))
5459 return 1;
5460
5461 /* Potential spanning rebalance collapsing a node, use worst-case */
5462 if (node_size - 1 <= mt_min_slots[wr_mas->type])
5463 return mas_mt_height(mas) * 2 - 1;
5464
5465 /* node store, slot store needs one node */
5466 return 1;
5467 }
5468
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()
2023-10-09 20:16 ` [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp() Sidhartha Kumar
2023-10-10 3:03 ` Peng Zhang
@ 2023-10-10 18:15 ` Liam R. Howlett
2023-10-25 9:52 ` kernel test robot
2 siblings, 0 replies; 14+ messages in thread
From: Liam R. Howlett @ 2023-10-10 18:15 UTC (permalink / raw)
To: Sidhartha Kumar
Cc: linux-kernel, linux-mm, maple-tree, akpm, willy, zhangpeng.00
* Sidhartha Kumar <sidhartha.kumar@oracle.com> [231009 16:16]:
> Preallocate maple nodes before call to mas_wr_store_entry(). If a new
> node is not needed, go directly to mas_wr_store_entry(), otherwise
> allocate the needed nodes and set the MA_STATE_PREALLOC flag.
The way I'd like to see this working is to preallocate nodes prior to
writing, but also to end in a state where we can call the store
operation to continue the operation. Both of these parts need to be
together in a patch set if they cannot be in the same patch.
Thanks,
Liam
>
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
> lib/maple_tree.c | 22 +++++++++++++++++++---
> 1 file changed, 19 insertions(+), 3 deletions(-)
>
> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> index e239197a57fc..25ae66e585f4 100644
> --- a/lib/maple_tree.c
> +++ b/lib/maple_tree.c
> @@ -5478,17 +5478,33 @@ int mas_prealloc_calc(struct ma_wr_state *wr_mas)
> int mas_store_gfp(struct ma_state *mas, void *entry, gfp_t gfp)
> {
> MA_WR_STATE(wr_mas, mas, entry);
> + int request;
>
> mas_wr_store_setup(&wr_mas);
> - trace_ma_write(__func__, mas, 0, entry);
> -retry:
> + wr_mas.content = mas_start(mas);
> +
> + request = mas_prealloc_calc(&wr_mas);
> + if (!request)
> + goto store_entry;
> +
> + mas_node_count_gfp(mas, request, gfp);
> + if (unlikely(mas_is_err(mas))) {
> + mas_set_alloc_req(mas, 0);
> + mas_destroy(mas);
> + mas_reset(mas);
> + return xa_err(mas->node);
> + }
> + mas->mas_flags |= MA_STATE_PREALLOC;
> +
> +store_entry:
> mas_wr_store_entry(&wr_mas);
> if (unlikely(mas_nomem(mas, gfp)))
> - goto retry;
> + goto store_entry;
>
> if (unlikely(mas_is_err(mas)))
> return xa_err(mas->node);
>
> + trace_ma_write(__func__, mas, 0, entry);
> return 0;
> }
> EXPORT_SYMBOL_GPL(mas_store_gfp);
> --
> 2.41.0
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
2023-10-09 22:25 ` kernel test robot
@ 2023-10-10 22:13 ` Sidhartha Kumar
0 siblings, 0 replies; 14+ messages in thread
From: Sidhartha Kumar @ 2023-10-10 22:13 UTC (permalink / raw)
To: kernel test robot, linux-kernel, linux-mm, maple-tree
Cc: oe-kbuild-all, akpm, willy, liam.howlett, zhangpeng.00
On 10/9/23 3:25 PM, kernel test robot wrote:
> Hi Sidhartha,
>
> kernel test robot noticed the following build warnings:
>
> [auto build test WARNING on akpm-mm/mm-everything]
> [also build test WARNING on linus/master v6.6-rc5 next-20231009]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Sidhartha-Kumar/maple_tree-introduce-mas_prealloc_calc/20231010-041859
> base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link: https://lore.kernel.org/r/20231009201639.920512-2-sidhartha.kumar%40oracle.com
> patch subject: [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
> config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20231010/202310100603.qsn3ruBx-lkp@intel.com/config)
> compiler: m68k-linux-gcc (GCC) 13.2.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231010/202310100603.qsn3ruBx-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202310100603.qsn3ruBx-lkp@intel.com/
>
> All warnings (new ones prefixed by >>):
>
>>> lib/maple_tree.c:5428:5: warning: no previous prototype for 'mas_prealloc_calc' [-Wmissing-prototypes]
> 5428 | int mas_prealloc_calc(struct ma_wr_state *wr_mas)
> | ^~~~~~~~~~~~~~~~~
>
>
> vim +/mas_prealloc_calc +5428 lib/maple_tree.c
>
> 5420
> 5421 /**
> 5422 * mas_prealloc_calc() - Calculate number of nodes needed for a
> 5423 * store operation.
> 5424 * @wr_mas: The maple write state
> 5425 *
> 5426 * Return: Number of nodes required for preallocation.
> 5427 */
>> 5428 int mas_prealloc_calc(struct ma_wr_state *wr_mas)
Adding static inline should fix this compilation error.
> 5429 {
> 5430 struct ma_state *mas = wr_mas->mas;
> 5431 unsigned char node_size;
> 5432
> 5433 if (unlikely(!mas->index && mas->last == ULONG_MAX))
> 5434 return 1;
> 5435
> 5436 /* Root expand */
> 5437 if (unlikely(mas_is_none(mas) || mas_is_ptr(mas)))
> 5438 return 1;
> 5439
> 5440 if (unlikely(!mas_wr_walk(wr_mas))) {
> 5441 /* Spanning store, use worst case for now */
> 5442 return 1 + mas_mt_height(mas) * 3;
> 5443 }
> 5444
> 5445 /* At this point, we are at the leaf node that needs to be altered. */
> 5446 /* Exact fit, no nodes needed. */
> 5447 if (wr_mas->r_min == mas->index && wr_mas->r_max == mas->last)
> 5448 return 0;
> 5449
> 5450 mas_wr_end_piv(wr_mas);
> 5451 node_size = mas_wr_new_end(wr_mas);
> 5452 if (node_size >= mt_slots[wr_mas->type]) {
> 5453 /* Split, worst case for now. */
> 5454 return 1 + mas_mt_height(mas) * 2;
> 5455 }
> 5456
> 5457 /* New root needs a singe node */
> 5458 if (unlikely(mte_is_root(mas->node)))
> 5459 return 1;
> 5460
> 5461 /* Potential spanning rebalance collapsing a node, use worst-case */
> 5462 if (node_size - 1 <= mt_min_slots[wr_mas->type])
> 5463 return mas_mt_height(mas) * 2 - 1;
> 5464
> 5465 /* node store, slot store needs one node */
> 5466 return 1;
> 5467 }
> 5468
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()
2023-10-10 3:03 ` Peng Zhang
@ 2023-10-11 0:17 ` Sidhartha Kumar
2023-10-11 7:40 ` Peng Zhang
0 siblings, 1 reply; 14+ messages in thread
From: Sidhartha Kumar @ 2023-10-11 0:17 UTC (permalink / raw)
To: Peng Zhang; +Cc: akpm, willy, liam.howlett, linux-kernel, maple-tree, linux-mm
On 10/9/23 8:03 PM, Peng Zhang wrote:
> Hi,
>
> 在 2023/10/10 04:16, Sidhartha Kumar 写道:
>> Preallocate maple nodes before call to mas_wr_store_entry(). If a new
>> node is not needed, go directly to mas_wr_store_entry(), otherwise
>> allocate the needed nodes and set the MA_STATE_PREALLOC flag.
>>
>> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
>> ---
>> lib/maple_tree.c | 22 +++++++++++++++++++---
>> 1 file changed, 19 insertions(+), 3 deletions(-)
>>
>> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
>> index e239197a57fc..25ae66e585f4 100644
>> --- a/lib/maple_tree.c
>> +++ b/lib/maple_tree.c
>> @@ -5478,17 +5478,33 @@ int mas_prealloc_calc(struct ma_wr_state *wr_mas)
>> int mas_store_gfp(struct ma_state *mas, void *entry, gfp_t gfp)
>> {
>> MA_WR_STATE(wr_mas, mas, entry);
>> + int request;
>> mas_wr_store_setup(&wr_mas);
>> - trace_ma_write(__func__, mas, 0, entry);
>> -retry:
>> + wr_mas.content = mas_start(mas);
>> +
>> + request = mas_prealloc_calc(&wr_mas);
> mas_wr_store_entry() does something similar to mas_prealloc_calc().
> Now, making it do it twice would incur additional overhead.
> We encountered this issue while optimizing preallocation, but it
> hasn't been resolved yet. Previously, this problem only occurred
> when using mas_preallocate(). Now, this change would bring this
> impact to all write operations on maple tree. What do you think
> about it?
>
After talking to Liam, I will have to implement the store type enum
feature on the Maple Tree Work list so that mas_prealloc_calc() can
start a partial walk and write that information to the enum.
mas_wr_store_entry() can then read that enum to continue the walk that
was already started rather than having to redo the whole walk. This
could also be used in mas_preallocate(). Do you have any suggestions for
the implementation of this enum?
Thanks,
Sid
> Thanks,
> Peng
>> + if (!request)
>> + goto store_entry;
>> +
>> + mas_node_count_gfp(mas, request, gfp);
>> + if (unlikely(mas_is_err(mas))) {
>> + mas_set_alloc_req(mas, 0);
>> + mas_destroy(mas);
>> + mas_reset(mas);
>> + return xa_err(mas->node);
>> + }
>> + mas->mas_flags |= MA_STATE_PREALLOC;
>> +
>> +store_entry:
>> mas_wr_store_entry(&wr_mas);
>> if (unlikely(mas_nomem(mas, gfp)))
>> - goto retry;
>> + goto store_entry;
>> if (unlikely(mas_is_err(mas)))
>> return xa_err(mas->node);
>> + trace_ma_write(__func__, mas, 0, entry);
>> return 0;
>> }
>> EXPORT_SYMBOL_GPL(mas_store_gfp);
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()
2023-10-11 0:17 ` Sidhartha Kumar
@ 2023-10-11 7:40 ` Peng Zhang
0 siblings, 0 replies; 14+ messages in thread
From: Peng Zhang @ 2023-10-11 7:40 UTC (permalink / raw)
To: Sidhartha Kumar
Cc: akpm, willy, liam.howlett, linux-kernel, maple-tree, linux-mm,
Peng Zhang
在 2023/10/11 08:17, Sidhartha Kumar 写道:
> On 10/9/23 8:03 PM, Peng Zhang wrote:
>> Hi,
>>
>> 在 2023/10/10 04:16, Sidhartha Kumar 写道:
>>> Preallocate maple nodes before call to mas_wr_store_entry(). If a new
>>> node is not needed, go directly to mas_wr_store_entry(), otherwise
>>> allocate the needed nodes and set the MA_STATE_PREALLOC flag.
>>>
>>> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
>>> ---
>>> lib/maple_tree.c | 22 +++++++++++++++++++---
>>> 1 file changed, 19 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
>>> index e239197a57fc..25ae66e585f4 100644
>>> --- a/lib/maple_tree.c
>>> +++ b/lib/maple_tree.c
>>> @@ -5478,17 +5478,33 @@ int mas_prealloc_calc(struct ma_wr_state *wr_mas)
>>> int mas_store_gfp(struct ma_state *mas, void *entry, gfp_t gfp)
>>> {
>>> MA_WR_STATE(wr_mas, mas, entry);
>>> + int request;
>>> mas_wr_store_setup(&wr_mas);
>>> - trace_ma_write(__func__, mas, 0, entry);
>>> -retry:
>>> + wr_mas.content = mas_start(mas);
>>> +
>>> + request = mas_prealloc_calc(&wr_mas);
>> mas_wr_store_entry() does something similar to mas_prealloc_calc().
>> Now, making it do it twice would incur additional overhead.
>> We encountered this issue while optimizing preallocation, but it
>> hasn't been resolved yet. Previously, this problem only occurred
>> when using mas_preallocate(). Now, this change would bring this
>> impact to all write operations on maple tree. What do you think
>> about it?
>>
>
> After talking to Liam, I will have to implement the store type enum feature on the Maple Tree Work list so that mas_prealloc_calc() can start a partial walk and write that information to the enum. mas_wr_store_entry() can then read that enum to continue the walk that was already started rather than having to redo the whole walk. This could also be used in mas_preallocate(). Do you have any suggestions for the implementation of this enum?
There is another scenario where this enum can be useful,
as seen in the implementation of mas_replace_entry() in [1].
It is a faster alternative to mas_store(), but it is not safe.
If we can determine through the enum while writing the maple
tree that a faster write operation can be performed, it would
be beneficial. Some performance improvements can also be
observed in [1].
[1] https://lore.kernel.org/lkml/49f0181a-55a4-41aa-8596-877560c8b802@bytedance.com/
>
> Thanks,
> Sid
>
>> Thanks,
>> Peng
>>> + if (!request)
>>> + goto store_entry;
>>> +
>>> + mas_node_count_gfp(mas, request, gfp);
>>> + if (unlikely(mas_is_err(mas))) {
>>> + mas_set_alloc_req(mas, 0);
>>> + mas_destroy(mas);
>>> + mas_reset(mas);
>>> + return xa_err(mas->node);
>>> + }
>>> + mas->mas_flags |= MA_STATE_PREALLOC;
>>> +
>>> +store_entry:
>>> mas_wr_store_entry(&wr_mas);
>>> if (unlikely(mas_nomem(mas, gfp)))
>>> - goto retry;
>>> + goto store_entry;
>>> if (unlikely(mas_is_err(mas)))
>>> return xa_err(mas->node);
>>> + trace_ma_write(__func__, mas, 0, entry);
>>> return 0;
>>> }
>>> EXPORT_SYMBOL_GPL(mas_store_gfp);
>>
>
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
2023-10-09 20:16 ` [PATCH 1/3] maple_tree: introduce mas_prealloc_calc() Sidhartha Kumar
2023-10-09 22:25 ` kernel test robot
2023-10-10 11:06 ` kernel test robot
@ 2023-10-18 2:53 ` kernel test robot
2 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2023-10-18 2:53 UTC (permalink / raw)
To: Sidhartha Kumar, linux-kernel, linux-mm, maple-tree
Cc: oe-kbuild-all, akpm, willy, liam.howlett, zhangpeng.00, Sidhartha Kumar
Hi Sidhartha,
kernel test robot noticed the following build warnings:
[auto build test WARNING on akpm-mm/mm-everything]
[also build test WARNING on linus/master v6.6-rc6 next-20231017]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Sidhartha-Kumar/maple_tree-introduce-mas_prealloc_calc/20231010-041859
base: https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/r/20231009201639.920512-2-sidhartha.kumar%40oracle.com
patch subject: [PATCH 1/3] maple_tree: introduce mas_prealloc_calc()
config: i386-randconfig-061-20231018 (https://download.01.org/0day-ci/archive/20231018/202310181030.sYP91twn-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231018/202310181030.sYP91twn-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202310181030.sYP91twn-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> lib/maple_tree.c:5428:5: sparse: sparse: symbol 'mas_prealloc_calc' was not declared. Should it be static?
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()
2023-10-09 20:16 ` [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp() Sidhartha Kumar
2023-10-10 3:03 ` Peng Zhang
2023-10-10 18:15 ` Liam R. Howlett
@ 2023-10-25 9:52 ` kernel test robot
2023-10-26 17:16 ` Liam R. Howlett
2 siblings, 1 reply; 14+ messages in thread
From: kernel test robot @ 2023-10-25 9:52 UTC (permalink / raw)
To: Sidhartha Kumar
Cc: oe-lkp, lkp, maple-tree, linux-mm, linux-kernel, akpm, willy,
liam.howlett, zhangpeng.00, Sidhartha Kumar, oliver.sang
Hello,
kernel test robot noticed "BUG:sleeping_function_called_from_invalid_context_at_include/linux/sched/mm.h" on:
commit: 9116baa49536116f013d691d2178c520959f46c2 ("[PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()")
url: https://github.com/intel-lab-lkp/linux/commits/Sidhartha-Kumar/maple_tree-introduce-mas_prealloc_calc/20231010-041859
base: https://git.kernel.org/cgit/linux/kernel/git/akpm/mm.git mm-everything
patch link: https://lore.kernel.org/all/20231009201639.920512-3-sidhartha.kumar@oracle.com/
patch subject: [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()
in testcase: boot
compiler: gcc-11
test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 16G
(please refer to attached dmesg/kmsg for entire log/backtrace)
+------------------------------------------------------------------------------------+------------+------------+
| | 9cbebad6db | 9116baa495 |
+------------------------------------------------------------------------------------+------------+------------+
| BUG:sleeping_function_called_from_invalid_context_at_include/linux/sched/mm.h | 0 | 7 |
| WARNING:suspicious_RCU_usage | 0 | 7 |
| include/linux/rcupdate.h:#Illegal_context_switch_in_RCU_read-side_critical_section | 0 | 7 |
+------------------------------------------------------------------------------------+------------+------------+
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <oliver.sang@intel.com>
| Closes: https://lore.kernel.org/oe-lkp/202310251706.6e6f6c4a-oliver.sang@intel.com
[ 12.322393][ T1] BUG: sleeping function called from invalid context at include/linux/sched/mm.h:306
[ 12.324008][ T1] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1, name: swapper
[ 12.325486][ T1] preempt_count: 1, expected: 0
[ 12.326345][ T1] 1 lock held by swapper/1:
[ 12.327164][ T1] #0: c2b52570 (&mt->ma_lock){+.+.}-{2:2}, at: check_root_expand+0x46/0xac0
[ 12.328850][ T1] CPU: 0 PID: 1 Comm: swapper Tainted: G T 6.6.0-rc4-00400-g9116baa49536 #1
[ 12.329034][ T1] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
[ 12.329034][ T1] Call Trace:
[ 12.329034][ T1] dump_stack_lvl (lib/dump_stack.c:107 (discriminator 1))
[ 12.329034][ T1] dump_stack (lib/dump_stack.c:114)
[ 12.329034][ T1] __might_resched (kernel/sched/core.c:10188)
[ 12.329034][ T1] __might_sleep (kernel/sched/core.c:10117 (discriminator 17))
[ 12.329034][ T1] kmem_cache_alloc (include/linux/sched/mm.h:306 mm/slab.h:705 mm/slub.c:3460 mm/slub.c:3486 mm/slub.c:3493 mm/slub.c:3502)
[ 12.329034][ T1] ? mas_alloc_nodes (lib/maple_tree.c:160 lib/maple_tree.c:1265)
[ 12.329034][ T1] mas_alloc_nodes (lib/maple_tree.c:160 lib/maple_tree.c:1265)
[ 12.329034][ T1] mas_node_count_gfp (lib/maple_tree.c:1347)
[ 12.329034][ T1] mas_store_gfp (lib/maple_tree.c:256 lib/maple_tree.c:5491)
[ 12.329034][ T1] ? check_empty_area_fill+0x3d0/0x3d0
[ 12.329034][ T1] check_root_expand+0x162/0xac0
[ 12.329034][ T1] maple_tree_seed (lib/test_maple_tree.c:3577)
[ 12.329034][ T1] ? check_gap_combining+0xdf8/0xdf8
[ 12.329034][ T1] do_one_initcall (init/main.c:1232)
[ 12.329034][ T1] do_initcalls (init/main.c:1293 init/main.c:1310)
[ 12.329034][ T1] kernel_init_freeable (init/main.c:1551)
[ 12.329034][ T1] ? rest_init (init/main.c:1429)
[ 12.329034][ T1] kernel_init (init/main.c:1439)
[ 12.329034][ T1] ret_from_fork (arch/x86/kernel/process.c:153)
[ 12.329034][ T1] ? rest_init (init/main.c:1429)
[ 12.329034][ T1] ret_from_fork_asm (arch/x86/entry/entry_32.S:741)
[ 12.329034][ T1] entry_INT80_32 (arch/x86/entry/entry_32.S:944)
[ 12.353802][ T1]
[ 12.354345][ T1] =============================
[ 12.355188][ T1] WARNING: suspicious RCU usage
[ 12.356056][ T1] 6.6.0-rc4-00400-g9116baa49536 #1 Tainted: G W T
[ 12.357413][ T1] -----------------------------
[ 12.358272][ T1] include/linux/rcupdate.h:375 Illegal context switch in RCU read-side critical section!
[ 12.359905][ T1]
[ 12.359905][ T1] other info that might help us debug this:
[ 12.359905][ T1]
[ 12.361711][ T1]
[ 12.361711][ T1] rcu_scheduler_active = 2, debug_locks = 1
[ 12.363058][ T1] 2 locks held by swapper/1:
[ 12.363877][ T1] #0: c2ad5938 (rcu_read_lock){....}-{1:2}, at: check_mas_store_gfp+0xa9/0x1b0
[ 12.365646][ T1] #1: c3965e84 (&mt->ma_lock){+.+.}-{2:2}, at: check_mas_store_gfp+0x104/0x1b0
[ 12.367338][ T1]
[ 12.367338][ T1] stack backtrace:
[ 12.368430][ T1] CPU: 0 PID: 1 Comm: swapper Tainted: G W T 6.6.0-rc4-00400-g9116baa49536 #1
[ 12.369129][ T1] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
[ 12.369129][ T1] Call Trace:
[ 12.369129][ T1] dump_stack_lvl (lib/dump_stack.c:107 (discriminator 1))
[ 12.369129][ T1] dump_stack (lib/dump_stack.c:114)
[ 12.369129][ T1] lockdep_rcu_suspicious (kernel/locking/lockdep.c:6713)
[ 12.369129][ T1] __might_resched (include/linux/rcupdate.h:375 kernel/sched/core.c:10149)
[ 12.369129][ T1] __might_sleep (kernel/sched/core.c:10117 (discriminator 17))
[ 12.369129][ T1] kmem_cache_alloc (include/linux/sched/mm.h:306 mm/slab.h:705 mm/slub.c:3460 mm/slub.c:3486 mm/slub.c:3493 mm/slub.c:3502)
[ 12.369129][ T1] ? mas_alloc_nodes (lib/maple_tree.c:160 lib/maple_tree.c:1265)
[ 12.369129][ T1] mas_alloc_nodes (lib/maple_tree.c:160 lib/maple_tree.c:1265)
[ 12.369129][ T1] mas_node_count_gfp (lib/maple_tree.c:1347)
[ 12.369129][ T1] mas_store_gfp (lib/maple_tree.c:256 lib/maple_tree.c:5491)
[ 12.369129][ T1] check_mas_store_gfp+0x14b/0x1b0
[ 12.369129][ T1] maple_tree_seed (lib/test_maple_tree.c:3646)
[ 12.369129][ T1] ? check_gap_combining+0xdf8/0xdf8
[ 12.369129][ T1] do_one_initcall (init/main.c:1232)
[ 12.369129][ T1] do_initcalls (init/main.c:1293 init/main.c:1310)
[ 12.369129][ T1] kernel_init_freeable (init/main.c:1551)
[ 12.369129][ T1] ? rest_init (init/main.c:1429)
[ 12.369129][ T1] kernel_init (init/main.c:1439)
[ 12.369129][ T1] ret_from_fork (arch/x86/kernel/process.c:153)
[ 12.369129][ T1] ? rest_init (init/main.c:1429)
[ 12.369129][ T1] ret_from_fork_asm (arch/x86/entry/entry_32.S:741)
[ 12.369129][ T1] entry_INT80_32 (arch/x86/entry/entry_32.S:944)
[ 15.220029][ T34] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 16.033920][ T35] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 17.655206][ T35] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 19.245918][ T35] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 36.522020][ T34] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 37.994914][ T34] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 38.766533][ T35] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 41.775652][ T34] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 43.236341][ T35] torture_spin_lock_write_delay: delay = 24 jiffies.
[ 44.106914][ T34] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 46.776934][ T34] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 47.165604][ T35] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 49.209209][ T34] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 50.316931][ T35] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 51.511048][ T34] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 54.564928][ T35] torture_spin_lock_write_delay: delay = 25 jiffies.
[ 59.372367][ T1] BUG: sleeping function called from invalid context at include/linux/sched/mm.h:306
[ 59.374045][ T1] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1, name: swapper
[ 59.375483][ T1] preempt_count: 1, expected: 0
[ 59.376310][ T1] 1 lock held by swapper/1:
[ 59.377090][ T1] #0: c2b52570 (&mt->ma_lock){+.+.}-{2:2}, at: check_empty_area_fill+0xe5/0x3d0
[ 59.378744][ T1] CPU: 0 PID: 1 Comm: swapper Tainted: G W T 6.6.0-rc4-00400-g9116baa49536 #1
[ 59.380409][ T1] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-debian-1.16.2-1 04/01/2014
[ 59.381080][ T1] Call Trace:
[ 59.381080][ T1] dump_stack_lvl (lib/dump_stack.c:107 (discriminator 1))
[ 59.381080][ T1] dump_stack (lib/dump_stack.c:114)
[ 59.381080][ T1] __might_resched (kernel/sched/core.c:10188)
[ 59.381080][ T1] __might_sleep (kernel/sched/core.c:10117 (discriminator 17))
[ 59.381080][ T1] kmem_cache_alloc (include/linux/sched/mm.h:306 mm/slab.h:705 mm/slub.c:3460 mm/slub.c:3486 mm/slub.c:3493 mm/slub.c:3502)
[ 59.381080][ T1] ? mas_alloc_nodes (lib/maple_tree.c:160 lib/maple_tree.c:1265)
[ 59.381080][ T1] mas_alloc_nodes (lib/maple_tree.c:160 lib/maple_tree.c:1265)
[ 59.381080][ T1] mas_node_count_gfp (lib/maple_tree.c:1347)
[ 59.381080][ T1] mas_store_gfp (lib/maple_tree.c:256 lib/maple_tree.c:5491)
[ 59.381080][ T1] check_empty_area_fill+0xab/0x3d0
[ 59.381080][ T1] maple_tree_seed (lib/test_maple_tree.c:3837)
[ 59.381080][ T1] ? check_gap_combining+0xdf8/0xdf8
[ 59.381080][ T1] do_one_initcall (init/main.c:1232)
[ 59.381080][ T1] do_initcalls (init/main.c:1293 init/main.c:1310)
[ 59.381080][ T1] kernel_init_freeable (init/main.c:1551)
[ 59.381080][ T1] ? rest_init (init/main.c:1429)
[ 59.381080][ T1] kernel_init (init/main.c:1439)
[ 59.381080][ T1] ret_from_fork (arch/x86/kernel/process.c:153)
[ 59.381080][ T1] ? rest_init (init/main.c:1429)
[ 59.381080][ T1] ret_from_fork_asm (arch/x86/entry/entry_32.S:741)
[ 59.381080][ T1] entry_INT80_32 (arch/x86/entry/entry_32.S:944)
[ 59.571154][ T1] maple_tree: 3807933 of 3807933 tests passed
[ 59.572831][ T1] test_memcat_p: test passed
[ 59.590510][ T1] test_meminit: all 11 tests in test_pages passed
[ 59.621976][ T1] test_meminit: all 40 tests in test_kvmalloc passed
[ 60.207905][ T1] test_meminit: all 70 tests in test_kmemcache passed
[ 60.217750][ T1] test_meminit: all 10 tests in test_rcu_persistent passed
[ 60.219088][ T1] test_meminit: all 131 tests passed!
[ 60.220126][ T1] ref_tracker: reference already released.
[ 60.220912][ T1] ref_tracker: allocated in:
The kernel config and materials to reproduce are available at:
https://download.01.org/0day-ci/archive/20231025/202310251706.6e6f6c4a-oliver.sang@intel.com
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp()
2023-10-25 9:52 ` kernel test robot
@ 2023-10-26 17:16 ` Liam R. Howlett
0 siblings, 0 replies; 14+ messages in thread
From: Liam R. Howlett @ 2023-10-26 17:16 UTC (permalink / raw)
To: kernel test robot; +Cc: oe-lkp, lkp, maple-tree, linux-mm, linux-kernel
... Dropping direct Cc's in attempt to avoid even more noise.
* kernel test robot <oliver.sang@intel.com> [231025 05:52]:
>
>
> Hello,
>
> kernel test robot noticed "BUG:sleeping_function_called_from_invalid_context_at_include/linux/sched/mm.h" on:
...
This patch set is being revised and discussed on how to make it a more
complete solution.
In the mean time, is there any way to stop the bot from emailing
everyone and burning more power?
Thank you,
Liam
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2023-10-26 17:16 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-09 20:16 [PATCH 0/3] align maple tree write paths Sidhartha Kumar
2023-10-09 20:16 ` [PATCH 1/3] maple_tree: introduce mas_prealloc_calc() Sidhartha Kumar
2023-10-09 22:25 ` kernel test robot
2023-10-10 22:13 ` Sidhartha Kumar
2023-10-10 11:06 ` kernel test robot
2023-10-18 2:53 ` kernel test robot
2023-10-09 20:16 ` [PATCH 2/3] maple_tree: use preallocations in mas_store_gfp() Sidhartha Kumar
2023-10-10 3:03 ` Peng Zhang
2023-10-11 0:17 ` Sidhartha Kumar
2023-10-11 7:40 ` Peng Zhang
2023-10-10 18:15 ` Liam R. Howlett
2023-10-25 9:52 ` kernel test robot
2023-10-26 17:16 ` Liam R. Howlett
2023-10-09 20:16 ` [PATCH 3/3] maple_tree: use preallocations in mas_erase() Sidhartha Kumar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox