Messages in this thread | | | Date | Wed, 29 Mar 2023 07:54:56 -0300 | Subject | Re: [PATCH 2/2] drm: test: Fix 32-bit issue in drm_buddy_test | From | Maíra Canal <> |
| |
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@google.com>
As we still didn't consolidate an implementation of is_power_of_2_u64(),
Reviewed-by: Maíra Canal <mcanal@igalia.com>
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; > }
| |