On Mon, Mar 30, 2020 at 06:20:28AM -0700, Matthew Wilcox wrote: >On Mon, Mar 30, 2020 at 12:36:36PM +0000, Wei Yang wrote: >> When head is NULL, shift is calculated from max. Currently we use a loop >> to detect how many XA_CHUNK_SHIFT is need to cover max. >> >> To achieve this, we can get number of bits max expands and round it up >> to XA_CHUNK_SHIFT. >> >> Signed-off-by: Wei Yang <richard.weiyang@xxxxxxxxx> >> --- >> lib/xarray.c | 6 +----- >> 1 file changed, 1 insertion(+), 5 deletions(-) >> >> diff --git a/lib/xarray.c b/lib/xarray.c >> index 1d9fab7db8da..6454cf3f5b4c 100644 >> --- a/lib/xarray.c >> +++ b/lib/xarray.c >> @@ -560,11 +560,7 @@ static int xas_expand(struct xa_state *xas, void *head) >> unsigned long max = xas_max(xas); >> >> if (!head) { >> - if (max == 0) >> - return 0; >> - while ((max >> shift) >= XA_CHUNK_SIZE) >> - shift += XA_CHUNK_SHIFT; >> - return shift + XA_CHUNK_SHIFT; >> + return roundup(fls_long(max), XA_CHUNK_SHIFT); > >This doesn't give the same number. Did you test this? > >Consider max = 64. The current code does: > >shift = 0; >64 >> 0 >= 64 (true) >shift += 6; >64 >> 6 < 64 >return 12 > >Your replacement does: > >fls_long(64) = 6 fls_long(64) = 7 >roundup(6, 6) is 6. > >Please be more careful. -- Wei Yang Help you, Help me