On Wed, 29 Mar 2023, Maíra Canal <mcanal@xxxxxxxxxx> wrote: > On 3/29/23 03:55, David Gow wrote: >> The drm_buddy_test KUnit tests verify that returned blocks have sizes >> which are powers of two using is_power_of_2(). However, is_power_of_2() >> operations on a 'long', but the block size is a u64. So on systems where >> long is 32-bit, this can sometimes fail even on correctly sized blocks. >> >> This only reproduces randomly, as the parameters passed to the buddy >> allocator in this test are random. The seed 0xb2e06022 reproduced it >> fine here. >> >> For now, just hardcode an is_power_of_2() implementation using >> x & (x - 1). >> >> Signed-off-by: David Gow <davidgow@xxxxxxxxxx> > > As we still didn't consolidate an implementation of is_power_of_2_u64(), I just cooked up some patches to try to make is_power_of_2() more flexible. I only sent them to the "CI trybot" for a quick spin first, will post to lkml later. [1] BR, Jani. [1] https://patchwork.freedesktop.org/series/115785/ > > Reviewed-by: Maíra Canal <mcanal@xxxxxxxxxx> > > Best Regards, > - Maíra Canal > >> --- >> >> There are actually a couple of is_power_of_2_u64() implementations >> already around in: >> - drivers/gpu/drm/i915/i915_utils.h >> - fs/btrfs/misc.h (called is_power_of_two_u64) >> >> So the ideal thing would be to consolidate these in one place. >> >> >> --- >> drivers/gpu/drm/tests/drm_buddy_test.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/gpu/drm/tests/drm_buddy_test.c b/drivers/gpu/drm/tests/drm_buddy_test.c >> index f8ee714df396..09ee6f6af896 100644 >> --- a/drivers/gpu/drm/tests/drm_buddy_test.c >> +++ b/drivers/gpu/drm/tests/drm_buddy_test.c >> @@ -89,7 +89,8 @@ static int check_block(struct kunit *test, struct drm_buddy *mm, >> err = -EINVAL; >> } >> >> - if (!is_power_of_2(block_size)) { >> + /* We can't use is_power_of_2() for a u64 on 32-bit systems. */ >> + if (block_size & (block_size - 1)) { >> kunit_err(test, "block size not power of two\n"); >> err = -EINVAL; >> } -- Jani Nikula, Intel Open Source Graphics Center