On 29 May 2025, at 18:47, Zi Yan wrote: > On 28 May 2025, at 23:17, Dev Jain wrote: > >> On 28/05/25 10:42 pm, Zi Yan wrote: >>> On 28 May 2025, at 7:31, Dev Jain wrote: >>> >>>> Suppose xas is pointing somewhere near the end of the multi-entry batch. >>>> Then it may happen that the computed slot already falls beyond the batch, >>>> thus breaking the loop due to !xa_is_sibling(), and computing the wrong >>>> order. Thus ensure that the caller is aware of this by triggering a BUG >>>> when the entry is a sibling entry. >>> Is it possible to add a test case in lib/test_xarray.c for this? >>> You can compile the tests with “make -C tools/testing/radix-tree” >>> and run “./tools/testing/radix-tree/xarray”. >> >> >> Sorry forgot to Cc you. >> I can surely do that later, but does this patch look fine? > > I am not sure the exact situation you are describing, so I asked you > to write a test case to demonstrate the issue. :) > IIUC, you mean xas needs to be a non sibling to make xas_get_order() work? I wonder if you can use xas_prev() to find the first entry in the multi-index batch then get the right order. >> >> >>> >>>> This patch is motivated by code inspection and not a real bug report. >>>> >>>> Signed-off-by: Dev Jain <dev.jain@xxxxxxx> >>>> --- >>>> The patch applies on 6.15 kernel. >>>> >>>> lib/xarray.c | 2 ++ >>>> 1 file changed, 2 insertions(+) >>>> >>>> diff --git a/lib/xarray.c b/lib/xarray.c >>>> index 9644b18af18d..0f699766c24f 100644 >>>> --- a/lib/xarray.c >>>> +++ b/lib/xarray.c >>>> @@ -1917,6 +1917,8 @@ int xas_get_order(struct xa_state *xas) >>>> if (!xas->xa_node) >>>> return 0; >>>> >>>> + XA_NODE_BUG_ON(xas->xa_node, xa_is_sibling(xa_entry(xas->xa, >>>> + xas->xa_node, xas->xa_offset))); >>>> for (;;) { >>>> unsigned int slot = xas->xa_offset + (1 << order); >>>> >>>> -- >>>> 2.30.2 >>> >>> Best Regards, >>> Yan, Zi > > > Best Regards, > Yan, Zi Best Regards, Yan, Zi