Re: [PATCH 2/2] drm_buddy: fix power-of-2 rounding errs
Matthew Auld <[email protected]>
| Newsgroups | gmane.linux.kernel,gmane.comp.video.dri.devel |
|---|---|
| Message-ID | <[email protected]> |
On 21/08/2026 10:19, David Gow wrote: > From: Jim Cromie <[email protected]> > > The standard roundup_pow_of_two() and rounddown_pow_of_two() macros use > unsigned long internally, which on 32-bit architectures (like arm32) is > a 32-bit type. > > drm_test_buddy_alloc_exceeds_max_order() uses these on a u64 value, > where they silently truncate the 10GB allocation, giving unexpected > success in DRM-CI. (see below the snip). > > Fix this by replacing the those macros with the safe 64-bit power-of-two > equivalents added in the previous patch. Do we also need something like is_power_of_2_u64() ? I think we could then remove that from i915_utils.h > > Signed-off-by: Jim Cromie <[email protected]> > Signed-off-by: David Gow <[email protected]> > --- > > This should actually be version 13, I think, as it's just a rebase of v12 > here, where it was part of a large series of fixups: > https://lore.kernel.org/all/[email protected]/ > > The major changes since that version are: > - Add the helper functions rounddown_pow_of_two64() and > roundup_pow_of_two64() (see patch 1) instead of open-coding them > - Rebase now that the buddy allocator lives in drivers/gpu/buddy.c > instead of drivers/gpu/drm/drm_buddy.c > > This is still breaking the gpu_test_buddy_alloc_exceeds_max_order > KUnit test on 32-bit systems: > [09:01:26] # gpu_test_buddy_alloc_exceeds_max_order: EXPECTATION FAILED at drivers/gpu/tests/gpu_buddy_test.c:1429 > [09:01:26] Expected err == -22, but > [09:01:26] err == 0 (0x0) > [09:01:26] WARNING: drivers/gpu/buddy.c:508 at gpu_buddy_fini+0x244/0x2e0, CPU#0: kunit_try_catch/1595 > [09:01:26] # gpu_test_buddy_alloc_exceeds_max_order: drivers/gpu/buddy.c:508: gpu_buddy_assert(gpu_buddy_block_is_free(mm->roots[i])) > [09:01:26] WARNING: drivers/gpu/buddy.c:516 at gpu_buddy_fini+0x284/0x2e0, CPU#0: kunit_try_catch/1595 > [09:01:26] # gpu_test_buddy_alloc_exceeds_max_order: drivers/gpu/buddy.c:508: gpu_buddy_assert(gpu_buddy_block_is_free(mm->roots[i])) > [09:01:26] WARNING: drivers/gpu/buddy.c:516 at gpu_buddy_fini+0x284/0x2e0, CPU#0: kunit_try_catch/1595 > [09:01:26] # gpu_test_buddy_alloc_exceeds_max_order: drivers/gpu/buddy.c:519: gpu_buddy_assert(!mm->used_scoreboard[i]) > [09:01:26] [FAILED] gpu_test_buddy_alloc_exceeds_max_order > > Cheers, > -- David > > --- > drivers/gpu/buddy.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/buddy.c b/drivers/gpu/buddy.c > index a5553fcec28c..64f41f1fe908 100644 > --- a/drivers/gpu/buddy.c > +++ b/drivers/gpu/buddy.c > @@ -1193,7 +1193,7 @@ static int __alloc_contig_try_harder(struct gpu_buddy *mm, > u64 modify_size; > int err; > > - modify_size = rounddown_pow_of_two(size); > + modify_size = rounddown_pow_of_two64(size); > order = ilog2(modify_size) - ilog2(mm->chunk_size); > if (order == 0) > return -ENOSPC; > @@ -1440,7 +1440,7 @@ int gpu_buddy_alloc_blocks(struct gpu_buddy *mm, > > /* Roundup the size to power of 2 */ > if (flags & GPU_BUDDY_CONTIGUOUS_ALLOCATION) { > - size = roundup_pow_of_two(size); > + size = roundup_pow_of_two64(size); > min_block_size = size; > /* > * Normalize the requested size to min_block_size for regular allocations.