On Wed, 29 Mar 2023, Jani Nikula <jani.nikula@xxxxxxxxxxxxxxx> wrote: > On Wed, 29 Mar 2023, David Gow <davidgow@xxxxxxxxxx> 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> >> --- >> >> 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)) { > > Then maybe use is_power_of_2_u64() instead? *sigh* And as soon as I wrote that I realized it's a local thing in btrfs. Never mind for now... ...but in the long run would be nice to either fix is_power_of_2() for u64 or add that u64 version... BR, Jani. > > BR, > Jani. > >> kunit_err(test, "block size not power of two\n"); >> err = -EINVAL; >> } -- Jani Nikula, Intel Open Source Graphics Center