[PATCH 2/6] drm/buddy: fix range bias

Arunpravin Paneer Selvam arunpravin.paneerselvam at amd.com
Fri Feb 16 11:40:51 UTC 2024


Looks good.

Reviewed-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam at amd.com>



On 2/15/2024 11:14 PM, Matthew Auld wrote:
> There is a corner case here where start/end is after/before the block
> range we are currently checking. If so we need to be sure that splitting
> the block will eventually give use the block size we need. To do that we
> should adjust the block range to account for the start/end, and only
> continue with the split if the size/alignment will fit the requested
> size. Not doing so can result in leaving split blocks unmerged when it
> eventually fails.
>
> Fixes: afea229fe102 ("drm: improve drm_buddy_alloc function")
> Signed-off-by: Matthew Auld<matthew.auld at intel.com>
> Cc: Arunpravin Paneer Selvam<Arunpravin.PaneerSelvam at amd.com>
> Cc: Christian König<christian.koenig at amd.com>
> Cc:<stable at vger.kernel.org>  # v5.18+
> ---
>   drivers/gpu/drm/drm_buddy.c | 10 ++++++++++
>   1 file changed, 10 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c
> index c1a99bf4dffd..d09540d4065b 100644
> --- a/drivers/gpu/drm/drm_buddy.c
> +++ b/drivers/gpu/drm/drm_buddy.c
> @@ -332,6 +332,7 @@ alloc_range_bias(struct drm_buddy *mm,
>   		 u64 start, u64 end,
>   		 unsigned int order)
>   {
> +	u64 req_size = mm->chunk_size << order;
>   	struct drm_buddy_block *block;
>   	struct drm_buddy_block *buddy;
>   	LIST_HEAD(dfs);
> @@ -367,6 +368,15 @@ alloc_range_bias(struct drm_buddy *mm,
>   		if (drm_buddy_block_is_allocated(block))
>   			continue;
>   
> +		if (block_start < start || block_end > end) {
> +			u64 adjusted_start = max(block_start, start);
> +			u64 adjusted_end = min(block_end, end);
> +
> +			if (round_down(adjusted_end + 1, req_size) <=
> +			    round_up(adjusted_start, req_size))
> +				continue;
> +		}
> +
>   		if (contains(start, end, block_start, block_end) &&
>   		    order == drm_buddy_block_order(block)) {
>   			/*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20240216/dc64419b/attachment.htm>


More information about the dri-devel mailing list