From: Matthew Auld <matthew.auld@intel.com>
To: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>,
christian.koenig@amd.com, dri-devel@lists.freedesktop.org,
intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
amd-gfx@lists.freedesktop.org
Cc: alexander.deucher@amd.com,
"Timur Kristóf" <timur.kristof@gmail.com>,
"John Olender" <john.olender@gmail.com>,
stable@vger.kernel.org
Subject: Re: [PATCH v2] gpu/buddy: bail out of try_harder when alignment cannot be honoured
Date: Thu, 2 Jul 2026 11:48:14 +0100 [thread overview]
Message-ID: <a4657daa-c58e-4441-ad81-c3e770bc5a94@intel.com> (raw)
In-Reply-To: <20260629074311.68836-1-Arunpravin.PaneerSelvam@amd.com>
On 29/06/2026 08:43, Arunpravin Paneer Selvam wrote:
> The try_harder contiguous fallback could return a range whose start
> offset did not match the caller's min_block_size. When a candidate's
> start is misaligned, realign it: free the misaligned run and reallocate
> exactly @size at the next lower min_block_size boundary. This keeps the
> returned size unchanged with no surplus to trim, and rejects the request
> only when no aligned candidate fits.
>
> v2: align misaligned candidates down to min_block_size instead of
> bailing out, for both the RHS and LHS paths (Matthew).
>
> Suggested-by: Christian König <christian.koenig@amd.com>
> Fixes: 0a1844bf0b53 ("drm/buddy: Improve contiguous memory allocation")
> Cc: Matthew Auld <matthew.auld@intel.com>
> Cc: Christian König <christian.koenig@amd.com>
> Cc: Timur Kristóf <timur.kristof@gmail.com>
> Cc: John Olender <john.olender@gmail.com>
> Cc: stable@vger.kernel.org
> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
> ---
> drivers/gpu/buddy.c | 63 +++++++++++++++++++++++++++++++--------------
> 1 file changed, 44 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/buddy.c b/drivers/gpu/buddy.c
> index dc81fe0301ce..3c73ae87f3c5 100644
> --- a/drivers/gpu/buddy.c
> +++ b/drivers/gpu/buddy.c
> @@ -1118,22 +1118,30 @@ static int __gpu_buddy_alloc_range(struct gpu_buddy *mm,
> blocks, total_allocated_on_err);
> }
>
> +static int __alloc_contig_aligned_retry(struct gpu_buddy *mm,
> + u64 unaligned_offset,
> + u64 size,
> + u64 min_block_size,
> + struct list_head *blocks)
> +{
> + u64 aligned_offset = round_down(unaligned_offset, min_block_size);
> +
> + return __gpu_buddy_alloc_range(mm, aligned_offset, size, NULL, blocks);
> +}
> +
> static int __alloc_contig_try_harder(struct gpu_buddy *mm,
> u64 size,
> u64 min_block_size,
> struct list_head *blocks)
> {
> - u64 rhs_offset, lhs_offset, lhs_size, filled;
> + u64 rhs_offset, lhs_offset, filled;
> struct gpu_buddy_block *block;
> unsigned int tree, order;
> - LIST_HEAD(blocks_lhs);
> - unsigned long pages;
> u64 modify_size;
> int err;
>
> modify_size = rounddown_pow_of_two(size);
> - pages = modify_size >> ilog2(mm->chunk_size);
> - order = fls(pages) - 1;
> + order = ilog2(modify_size) - ilog2(mm->chunk_size);
> if (order == 0)
> return -ENOSPC;
>
> @@ -1149,31 +1157,48 @@ static int __alloc_contig_try_harder(struct gpu_buddy *mm,
> while (iter) {
> block = rbtree_get_free_block(iter);
>
> - /* Allocate blocks traversing RHS */
> rhs_offset = gpu_buddy_block_offset(block);
> +
> + /* Allocate blocks traversing RHS */
> err = __gpu_buddy_alloc_range(mm, rhs_offset, size,
> &filled, blocks);
> - if (!err || err != -ENOSPC)
> + if (err && err != -ENOSPC)
> return err;
> + if (!err && IS_ALIGNED(rhs_offset, min_block_size))
> + return 0;
> + if (!err) {
> + /* Allocate the unaligned RHS offset using round_down */
> + gpu_buddy_free_list_internal(mm, blocks);
> + err = __alloc_contig_aligned_retry(mm, rhs_offset,
> + size,
> + min_block_size,
> + blocks);
> + if (!err)
> + return 0;
> + if (err != -ENOSPC) {
> + gpu_buddy_free_list_internal(mm, blocks);
> + return err;
> + }
> + goto next;
> + }
>
> - lhs_size = max((size - filled), min_block_size);
> - if (!IS_ALIGNED(lhs_size, min_block_size))
> - lhs_size = round_up(lhs_size, min_block_size);
> + if (size - filled > rhs_offset)
> + goto next;
>
> - /* Allocate blocks traversing LHS */
> - lhs_offset = gpu_buddy_block_offset(block) - lhs_size;
> - err = __gpu_buddy_alloc_range(mm, lhs_offset, lhs_size,
> - NULL, &blocks_lhs);
> - if (!err) {
> - list_splice(&blocks_lhs, blocks);
> + lhs_offset = rhs_offset - (size - filled);
> +
> + /* Allocate the unaligned LHS offset using round_down */
> + gpu_buddy_free_list_internal(mm, blocks);
> + err = __alloc_contig_aligned_retry(mm, lhs_offset, size,
> + min_block_size, blocks);
> + if (!err)
> return 0;
> - } else if (err != -ENOSPC) {
> + if (err != -ENOSPC) {
> gpu_buddy_free_list_internal(mm, blocks);
> return err;
> }
> - /* Free blocks for the next iteration */
> +next:
> gpu_buddy_free_list_internal(mm, blocks);
> -
> iter = rb_prev(iter);
> }
> }
>
> base-commit: 6648301c5bb2ef23f0fb15bcb01d21ff66f36799
next prev parent reply other threads:[~2026-07-02 10:48 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-29 7:43 [PATCH v2] gpu/buddy: bail out of try_harder when alignment cannot be honoured Arunpravin Paneer Selvam
2026-06-29 16:04 ` ✓ i915.CI.BAT: success for gpu/buddy: bail out of try_harder when alignment cannot be honoured (rev2) Patchwork
2026-06-29 20:47 ` ✓ CI.KUnit: " Patchwork
2026-06-29 21:40 ` ✓ Xe.CI.BAT: " Patchwork
2026-06-29 22:39 ` ✗ i915.CI.Full: failure " Patchwork
2026-06-30 6:26 ` ✓ Xe.CI.FULL: success " Patchwork
2026-07-02 10:48 ` Matthew Auld [this message]
2026-07-03 0:35 ` [PATCH v2] gpu/buddy: bail out of try_harder when alignment cannot be honoured John Olender
2026-07-03 13:40 ` Arunpravin Paneer Selvam
2026-07-09 13:25 ` Arunpravin Paneer Selvam
-- strict thread matches above, loose matches on Subject: below --
2026-07-09 13:02 Arunpravin Paneer Selvam
2026-07-09 13:25 ` sashiko-bot
2026-07-09 13:10 Arunpravin Paneer Selvam
2026-07-09 13:29 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a4657daa-c58e-4441-ad81-c3e770bc5a94@intel.com \
--to=matthew.auld@intel.com \
--cc=Arunpravin.PaneerSelvam@amd.com \
--cc=alexander.deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=john.olender@gmail.com \
--cc=stable@vger.kernel.org \
--cc=timur.kristof@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.