diff mbox series

[13/18] maple_tree: simplify mas_commit_b_node()

Message ID 20240604174145.563900-14-sidhartha.kumar@oracle.com (mailing list archive)
State New
Headers show
Series Introduce a store type enum for the Maple tree | expand

Commit Message

Sid Kumar June 4, 2024, 5:41 p.m. UTC
Use mas->store_type to simplify the logic of identifying the type of
write.

Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
---
 lib/maple_tree.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

Comments

Liam R. Howlett June 4, 2024, 7:34 p.m. UTC | #1
* Sidhartha Kumar <sidhartha.kumar@oracle.com> [240604 13:42]:
> Use mas->store_type to simplify the logic of identifying the type of
> write.

Since b_type is now only used in one location, we can use
mas_new_ma_node() instead of mt_mk_node() and remove b_type entirely
from this function.  This is also true of the maple_node *node pointer.

old_enode and b_end could also be moved below all the returns as they
are only used after all the other options.

> 
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
>  lib/maple_tree.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> index 314691fd1c67..faadddbe2086 100644
> --- a/lib/maple_tree.c
> +++ b/lib/maple_tree.c
> @@ -3437,12 +3437,10 @@ static noinline_for_kasan int mas_commit_b_node(struct ma_wr_state *wr_mas,
>  	enum maple_type b_type = b_node->type;
>  
>  	old_enode = wr_mas->mas->node;
> -	if ((b_end < mt_min_slots[b_type]) &&
> -	    (!mte_is_root(old_enode)) &&
> -	    (mas_mt_height(wr_mas->mas) > 1))
> +	if (wr_mas->mas->store_type == wr_rebalance)
>  		return mas_rebalance(wr_mas->mas, b_node);
>  
> -	if (b_end >= mt_slots[b_type])
> +	if (wr_mas->mas->store_type == wr_split_store)
>  		return mas_split(wr_mas->mas, b_node);
>  
>  	if (mas_reuse_node(wr_mas, b_node, end))
> -- 
> 2.45.1
>
Mateusz Guzik June 26, 2024, 10:40 a.m. UTC | #2
On Tue, Jun 04, 2024 at 10:41:40AM -0700, Sidhartha Kumar wrote:
> Use mas->store_type to simplify the logic of identifying the type of
> write.
> 
> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> ---
>  lib/maple_tree.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> index 314691fd1c67..faadddbe2086 100644
> --- a/lib/maple_tree.c
> +++ b/lib/maple_tree.c
> @@ -3437,12 +3437,10 @@ static noinline_for_kasan int mas_commit_b_node(struct ma_wr_state *wr_mas,
>  	enum maple_type b_type = b_node->type;
>  
>  	old_enode = wr_mas->mas->node;
> -	if ((b_end < mt_min_slots[b_type]) &&
> -	    (!mte_is_root(old_enode)) &&
> -	    (mas_mt_height(wr_mas->mas) > 1))
> +	if (wr_mas->mas->store_type == wr_rebalance)
>  		return mas_rebalance(wr_mas->mas, b_node);
>  
> -	if (b_end >= mt_slots[b_type])
> +	if (wr_mas->mas->store_type == wr_split_store)
>  		return mas_split(wr_mas->mas, b_node);
>  
>  	if (mas_reuse_node(wr_mas, b_node, end))


This reliably results in "kernel BUG at mm/mmap.c:3412!".

bt below

reliably reproduces as follows: spawn "perf top", hit enter twice to
disassemble a func. tui hangs indefinitely, console shows the splat
below.

I verified going one commit down produces a working kernel.

kernel BUG at mm/mmap.c:3412!
[   35.820042] Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
[   35.821101] CPU: 4 PID: 1066 Comm: perf-top-UI Tainted: G        W          6.10.0-rc5-00304-g30e5748b1d44 #155
[   35.822929] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.1-0-g3208b098f51a-prebuilt.qemu.org 04/01/2014
[   35.824957] RIP: 0010:exit_mmap+0x392/0x3a0
[   35.825794] Code: ef e8 02 9f fe ff eb d7 be 01 00 00 00 48 89 ef e8 73 a3 fe ff eb be 31 f6 48 89 ef
e8 a7 a2 fe ff eb a8 0f 0b e9 75 fe ff ff <0f> 0b e8 a7 b2 c1 00 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90
[   35.829141] RSP: 0018:ff7fe6c8c2393c40 EFLAGS: 00010293
[   35.830103] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
[   35.831398] RDX: ff39fe34499c3c00 RSI: 0000000000000001 RDI: ff39fe34499c3c08
[   35.832705] RBP: ff39fe3441a28580 R08: 000000000000000c R09: 0000000000000060
[   35.834010] R10: ff39fe3450ad5600 R11: 0000000000000000 R12: 00000000000000e8
[   35.835295] R13: 0000000000003593 R14: ff39fe3441a28628 R15: ff39fe3441a285c0
[   35.836569] FS:  0000000000000000(0000) GS:ff39fe39a7700000(0000) knlGS:0000000000000000
[   35.838042] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   35.839093] CR2: 00007efd624f39ed CR3: 000000010130e001 CR4: 0000000000371ef0
[   35.840389] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[   35.841892] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400
[   35.843182] Call Trace:
[   35.843646]  <TASK>
[   35.844051]  ? die+0x36/0x90
[   35.844602]  ? do_trap+0xdd/0x100
[   35.845226]  ? exit_mmap+0x392/0x3a0
[   35.845915]  ? do_error_trap+0x65/0x80
[   35.846614]  ? exit_mmap+0x392/0x3a0
[   35.847287]  ? exc_invalid_op+0x50/0x70
[   35.847999]  ? exit_mmap+0x392/0x3a0
[   35.848662]  ? asm_exc_invalid_op+0x1a/0x20
[   35.849437]  ? exit_mmap+0x392/0x3a0
[   35.850120]  __mmput+0x3d/0x130
[   35.850713]  begin_new_exec+0x4ed/0xb00
[   35.851428]  ? load_elf_phdrs+0x6c/0xc0
[   35.852150]  load_elf_binary+0x2ca/0x15a0
[   35.852890]  ? __kernel_read+0x1d8/0x2f0
[   35.853621]  ? __kernel_read+0x1d8/0x2f0
[   35.854348]  ? load_misc_binary+0x1f6/0x310
[   35.855113]  bprm_execve+0x243/0x600
[   35.855784]  do_execveat_common.isra.0+0x1bd/0x220
[   35.856672]  __x64_sys_execve+0x36/0x40
[   35.857384]  do_syscall_64+0x52/0x150
[   35.858088]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
[   35.859014] RIP: 0033:0x7efd624f3a17
[   35.859677] Code: Unable to access opcode bytes at 0x7efd624f39ed.
[   35.860790] RSP: 002b:00007efd48bf8dc8 EFLAGS: 00000202 ORIG_RAX: 000000000000003b
[   35.862170] RAX: ffffffffffffffda RBX: 000055e5736a44e3 RCX: 00007efd624f3a17
[   35.863472] RDX: 000055e59c315000 RSI: 00007efd48bf9050 RDI: 000055e5736a44e3
[   35.864768] RBP: 00007efd48bf8e40 R08: 0000000000000000 R09: 00007efd48c006c0
[   35.866475] R10: 00007efd62430e50 R11: 0000000000000202 R12: 00007efd48bf9050
[   35.868167] R13: 000055e59c315000 R14: 0000000000000001 R15: 0000000000000001
[   35.869873]  </TASK>
[   35.870676] Modules linked in:
[   35.871944] ---[ end trace 0000000000000000 ]---
Andrew Morton June 26, 2024, 5:28 p.m. UTC | #3
On Wed, 26 Jun 2024 12:40:19 +0200 Mateusz Guzik <mjguzik@gmail.com> wrote:

> This reliably results in "kernel BUG at mm/mmap.c:3412!".

Thanks, I'll drop v3 of the series "Introduce a store type enum for the
Maple tree"
Sid Kumar June 26, 2024, 5:45 p.m. UTC | #4
On 6/26/24 3:40 AM, Mateusz Guzik wrote:
> On Tue, Jun 04, 2024 at 10:41:40AM -0700, Sidhartha Kumar wrote:
>> Use mas->store_type to simplify the logic of identifying the type of
>> write.
>>
>> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
>> ---
>>   lib/maple_tree.c | 6 ++----
>>   1 file changed, 2 insertions(+), 4 deletions(-)
>>
>> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
>> index 314691fd1c67..faadddbe2086 100644
>> --- a/lib/maple_tree.c
>> +++ b/lib/maple_tree.c
>> @@ -3437,12 +3437,10 @@ static noinline_for_kasan int mas_commit_b_node(struct ma_wr_state *wr_mas,
>>   	enum maple_type b_type = b_node->type;
>>   
>>   	old_enode = wr_mas->mas->node;
>> -	if ((b_end < mt_min_slots[b_type]) &&
>> -	    (!mte_is_root(old_enode)) &&
>> -	    (mas_mt_height(wr_mas->mas) > 1))
>> +	if (wr_mas->mas->store_type == wr_rebalance)
>>   		return mas_rebalance(wr_mas->mas, b_node);
>>   
>> -	if (b_end >= mt_slots[b_type])
>> +	if (wr_mas->mas->store_type == wr_split_store)
>>   		return mas_split(wr_mas->mas, b_node);
>>   
>>   	if (mas_reuse_node(wr_mas, b_node, end))
> 
> 
> This reliably results in "kernel BUG at mm/mmap.c:3412!".
> 
> bt below
> 
> reliably reproduces as follows: spawn "perf top", hit enter twice to
> disassemble a func. tui hangs indefinitely, console shows the splat
> below.
> 

Hello,

Thanks for your report. When I run perf top and disassemble a function tui 
doesn't hang. In dmesg I see:

[   17.836399] perf: interrupt took too long (2705 > 2500), lowering 
kernel.perf_event_max_sample_rate to 73000
[   17.837532] perf: interrupt took too long (3561 > 3381), lowering 
kernel.perf_event_max_sample_rate to 56000
[   17.838818] perf: interrupt took too long (4654 > 4451), lowering 
kernel.perf_event_max_sample_rate to 42000
[   17.840267] perf: interrupt took too long (5930 > 5817), lowering 
kernel.perf_event_max_sample_rate to 33000


but not the bug that your seeing. Could you send your config file so I could 
test with that?

Thanks,
Sid



> I verified going one commit down produces a working kernel.
> 
> kernel BUG at mm/mmap.c:3412!
> [   35.820042] Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
> [   35.821101] CPU: 4 PID: 1066 Comm: perf-top-UI Tainted: G        W          6.10.0-rc5-00304-g30e5748b1d44 #155
> [   35.822929] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.1-0-g3208b098f51a-prebuilt.qemu.org 04/01/2014
> [   35.824957] RIP: 0010:exit_mmap+0x392/0x3a0
> [   35.825794] Code: ef e8 02 9f fe ff eb d7 be 01 00 00 00 48 89 ef e8 73 a3 fe ff eb be 31 f6 48 89 ef
> e8 a7 a2 fe ff eb a8 0f 0b e9 75 fe ff ff <0f> 0b e8 a7 b2 c1 00 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90
> [   35.829141] RSP: 0018:ff7fe6c8c2393c40 EFLAGS: 00010293
> [   35.830103] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
> [   35.831398] RDX: ff39fe34499c3c00 RSI: 0000000000000001 RDI: ff39fe34499c3c08
> [   35.832705] RBP: ff39fe3441a28580 R08: 000000000000000c R09: 0000000000000060
> [   35.834010] R10: ff39fe3450ad5600 R11: 0000000000000000 R12: 00000000000000e8
> [   35.835295] R13: 0000000000003593 R14: ff39fe3441a28628 R15: ff39fe3441a285c0
> [   35.836569] FS:  0000000000000000(0000) GS:ff39fe39a7700000(0000) knlGS:0000000000000000
> [   35.838042] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [   35.839093] CR2: 00007efd624f39ed CR3: 000000010130e001 CR4: 0000000000371ef0
> [   35.840389] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [   35.841892] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400
> [   35.843182] Call Trace:
> [   35.843646]  <TASK>
> [   35.844051]  ? die+0x36/0x90
> [   35.844602]  ? do_trap+0xdd/0x100
> [   35.845226]  ? exit_mmap+0x392/0x3a0
> [   35.845915]  ? do_error_trap+0x65/0x80
> [   35.846614]  ? exit_mmap+0x392/0x3a0
> [   35.847287]  ? exc_invalid_op+0x50/0x70
> [   35.847999]  ? exit_mmap+0x392/0x3a0
> [   35.848662]  ? asm_exc_invalid_op+0x1a/0x20
> [   35.849437]  ? exit_mmap+0x392/0x3a0
> [   35.850120]  __mmput+0x3d/0x130
> [   35.850713]  begin_new_exec+0x4ed/0xb00
> [   35.851428]  ? load_elf_phdrs+0x6c/0xc0
> [   35.852150]  load_elf_binary+0x2ca/0x15a0
> [   35.852890]  ? __kernel_read+0x1d8/0x2f0
> [   35.853621]  ? __kernel_read+0x1d8/0x2f0
> [   35.854348]  ? load_misc_binary+0x1f6/0x310
> [   35.855113]  bprm_execve+0x243/0x600
> [   35.855784]  do_execveat_common.isra.0+0x1bd/0x220
> [   35.856672]  __x64_sys_execve+0x36/0x40
> [   35.857384]  do_syscall_64+0x52/0x150
> [   35.858088]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
> [   35.859014] RIP: 0033:0x7efd624f3a17
> [   35.859677] Code: Unable to access opcode bytes at 0x7efd624f39ed.
> [   35.860790] RSP: 002b:00007efd48bf8dc8 EFLAGS: 00000202 ORIG_RAX: 000000000000003b
> [   35.862170] RAX: ffffffffffffffda RBX: 000055e5736a44e3 RCX: 00007efd624f3a17
> [   35.863472] RDX: 000055e59c315000 RSI: 00007efd48bf9050 RDI: 000055e5736a44e3
> [   35.864768] RBP: 00007efd48bf8e40 R08: 0000000000000000 R09: 00007efd48c006c0
> [   35.866475] R10: 00007efd62430e50 R11: 0000000000000202 R12: 00007efd48bf9050
> [   35.868167] R13: 000055e59c315000 R14: 0000000000000001 R15: 0000000000000001
> [   35.869873]  </TASK>
> [   35.870676] Modules linked in:
> [   35.871944] ---[ end trace 0000000000000000 ]---
>
Mateusz Guzik June 26, 2024, 6:29 p.m. UTC | #5
On Wed, Jun 26, 2024 at 7:45 PM Sidhartha Kumar
<sidhartha.kumar@oracle.com> wrote:
>
> On 6/26/24 3:40 AM, Mateusz Guzik wrote:
> > On Tue, Jun 04, 2024 at 10:41:40AM -0700, Sidhartha Kumar wrote:
> >> Use mas->store_type to simplify the logic of identifying the type of
> >> write.
> >>
> >> Signed-off-by: Sidhartha Kumar <sidhartha.kumar@oracle.com>
> >> ---
> >>   lib/maple_tree.c | 6 ++----
> >>   1 file changed, 2 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> >> index 314691fd1c67..faadddbe2086 100644
> >> --- a/lib/maple_tree.c
> >> +++ b/lib/maple_tree.c
> >> @@ -3437,12 +3437,10 @@ static noinline_for_kasan int mas_commit_b_node(struct ma_wr_state *wr_mas,
> >>      enum maple_type b_type = b_node->type;
> >>
> >>      old_enode = wr_mas->mas->node;
> >> -    if ((b_end < mt_min_slots[b_type]) &&
> >> -        (!mte_is_root(old_enode)) &&
> >> -        (mas_mt_height(wr_mas->mas) > 1))
> >> +    if (wr_mas->mas->store_type == wr_rebalance)
> >>              return mas_rebalance(wr_mas->mas, b_node);
> >>
> >> -    if (b_end >= mt_slots[b_type])
> >> +    if (wr_mas->mas->store_type == wr_split_store)
> >>              return mas_split(wr_mas->mas, b_node);
> >>
> >>      if (mas_reuse_node(wr_mas, b_node, end))
> >
> >
> > This reliably results in "kernel BUG at mm/mmap.c:3412!".
> >
> > bt below
> >
> > reliably reproduces as follows: spawn "perf top", hit enter twice to
> > disassemble a func. tui hangs indefinitely, console shows the splat
> > below.
> >
>
> Hello,
>
> Thanks for your report. When I run perf top and disassemble a function tui
> doesn't hang. In dmesg I see:
>
> [   17.836399] perf: interrupt took too long (2705 > 2500), lowering
> kernel.perf_event_max_sample_rate to 73000
> [   17.837532] perf: interrupt took too long (3561 > 3381), lowering
> kernel.perf_event_max_sample_rate to 56000
> [   17.838818] perf: interrupt took too long (4654 > 4451), lowering
> kernel.perf_event_max_sample_rate to 42000
> [   17.840267] perf: interrupt took too long (5930 > 5817), lowering
> kernel.perf_event_max_sample_rate to 33000
>
>
> but not the bug that your seeing. Could you send your config file so I could
> test with that?
>

https://people.freebsd.org/~mjg/.linux-crap/.config-maple-crash

I verified again this reliably crashes when going to:
commit 30e5748b1d44e3eefc41773e27c63e51910ed718 (HEAD)
Author: Sidhartha Kumar <sidhartha.kumar@oracle.com>
Date:   Tue Jun 18 13:47:45 2024 -0700

    maple_tree: simplify mas_commit_b_node()

on linux-next

Userspace is Debian 12 (which may be of significance), but just in
case I'll note I'm building the kernel on a Ubuntu 24.04.

> Thanks,
> Sid
>
>
>
> > I verified going one commit down produces a working kernel.
> >
> > kernel BUG at mm/mmap.c:3412!
> > [   35.820042] Oops: invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
> > [   35.821101] CPU: 4 PID: 1066 Comm: perf-top-UI Tainted: G        W          6.10.0-rc5-00304-g30e5748b1d44 #155
> > [   35.822929] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.1-0-g3208b098f51a-prebuilt.qemu.org 04/01/2014
> > [   35.824957] RIP: 0010:exit_mmap+0x392/0x3a0
> > [   35.825794] Code: ef e8 02 9f fe ff eb d7 be 01 00 00 00 48 89 ef e8 73 a3 fe ff eb be 31 f6 48 89 ef
> > e8 a7 a2 fe ff eb a8 0f 0b e9 75 fe ff ff <0f> 0b e8 a7 b2 c1 00 0f 1f 80 00 00 00 00 90 90 90 90 90 90 90 90
> > [   35.829141] RSP: 0018:ff7fe6c8c2393c40 EFLAGS: 00010293
> > [   35.830103] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
> > [   35.831398] RDX: ff39fe34499c3c00 RSI: 0000000000000001 RDI: ff39fe34499c3c08
> > [   35.832705] RBP: ff39fe3441a28580 R08: 000000000000000c R09: 0000000000000060
> > [   35.834010] R10: ff39fe3450ad5600 R11: 0000000000000000 R12: 00000000000000e8
> > [   35.835295] R13: 0000000000003593 R14: ff39fe3441a28628 R15: ff39fe3441a285c0
> > [   35.836569] FS:  0000000000000000(0000) GS:ff39fe39a7700000(0000) knlGS:0000000000000000
> > [   35.838042] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> > [   35.839093] CR2: 00007efd624f39ed CR3: 000000010130e001 CR4: 0000000000371ef0
> > [   35.840389] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> > [   35.841892] DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400
> > [   35.843182] Call Trace:
> > [   35.843646]  <TASK>
> > [   35.844051]  ? die+0x36/0x90
> > [   35.844602]  ? do_trap+0xdd/0x100
> > [   35.845226]  ? exit_mmap+0x392/0x3a0
> > [   35.845915]  ? do_error_trap+0x65/0x80
> > [   35.846614]  ? exit_mmap+0x392/0x3a0
> > [   35.847287]  ? exc_invalid_op+0x50/0x70
> > [   35.847999]  ? exit_mmap+0x392/0x3a0
> > [   35.848662]  ? asm_exc_invalid_op+0x1a/0x20
> > [   35.849437]  ? exit_mmap+0x392/0x3a0
> > [   35.850120]  __mmput+0x3d/0x130
> > [   35.850713]  begin_new_exec+0x4ed/0xb00
> > [   35.851428]  ? load_elf_phdrs+0x6c/0xc0
> > [   35.852150]  load_elf_binary+0x2ca/0x15a0
> > [   35.852890]  ? __kernel_read+0x1d8/0x2f0
> > [   35.853621]  ? __kernel_read+0x1d8/0x2f0
> > [   35.854348]  ? load_misc_binary+0x1f6/0x310
> > [   35.855113]  bprm_execve+0x243/0x600
> > [   35.855784]  do_execveat_common.isra.0+0x1bd/0x220
> > [   35.856672]  __x64_sys_execve+0x36/0x40
> > [   35.857384]  do_syscall_64+0x52/0x150
> > [   35.858088]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
> > [   35.859014] RIP: 0033:0x7efd624f3a17
> > [   35.859677] Code: Unable to access opcode bytes at 0x7efd624f39ed.
> > [   35.860790] RSP: 002b:00007efd48bf8dc8 EFLAGS: 00000202 ORIG_RAX: 000000000000003b
> > [   35.862170] RAX: ffffffffffffffda RBX: 000055e5736a44e3 RCX: 00007efd624f3a17
> > [   35.863472] RDX: 000055e59c315000 RSI: 00007efd48bf9050 RDI: 000055e5736a44e3
> > [   35.864768] RBP: 00007efd48bf8e40 R08: 0000000000000000 R09: 00007efd48c006c0
> > [   35.866475] R10: 00007efd62430e50 R11: 0000000000000202 R12: 00007efd48bf9050
> > [   35.868167] R13: 000055e59c315000 R14: 0000000000000001 R15: 0000000000000001
> > [   35.869873]  </TASK>
> > [   35.870676] Modules linked in:
> > [   35.871944] ---[ end trace 0000000000000000 ]---
> >
>
diff mbox series

Patch

diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index 314691fd1c67..faadddbe2086 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -3437,12 +3437,10 @@  static noinline_for_kasan int mas_commit_b_node(struct ma_wr_state *wr_mas,
 	enum maple_type b_type = b_node->type;
 
 	old_enode = wr_mas->mas->node;
-	if ((b_end < mt_min_slots[b_type]) &&
-	    (!mte_is_root(old_enode)) &&
-	    (mas_mt_height(wr_mas->mas) > 1))
+	if (wr_mas->mas->store_type == wr_rebalance)
 		return mas_rebalance(wr_mas->mas, b_node);
 
-	if (b_end >= mt_slots[b_type])
+	if (wr_mas->mas->store_type == wr_split_store)
 		return mas_split(wr_mas->mas, b_node);
 
 	if (mas_reuse_node(wr_mas, b_node, end))