]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe: Use DRM_BUDDY_CONTIGUOUS_ALLOCATION for contiguous allocations
authorSanjay Yadav <sanjay.kumar.yadav@intel.com>
Wed, 21 Jan 2026 11:14:17 +0000 (16:44 +0530)
committerMatthew Auld <matthew.auld@intel.com>
Thu, 22 Jan 2026 09:52:27 +0000 (09:52 +0000)
The VRAM/stolen memory managers do not currently set
DRM_BUDDY_CONTIGUOUS_ALLOCATION for contiguous allocations. Enabling
this flag activates the buddy allocator's try_harder path, which helps
handle fragmented memory scenarios.

This enables the __alloc_contig_try_harder fallback in the buddy
allocator, allowing contiguous allocation requests to succeed even when
memory is fragmented by combining allocations from both(RHS and LHS)
sides of a large free block.

v2: (Matt B)
- Remove redundant logic for rounding allocation size and trimming when
  TTM_PL_FLAG_CONTIGUOUS is set, since drm_buddy now handles this when
  DRM_BUDDY_CONTIGUOUS_ALLOCATION is enabled

Closes: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/6713
Suggested-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Sanjay Yadav <sanjay.kumar.yadav@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patch.msgid.link/20260121111416.3104399-2-sanjay.kumar.yadav@intel.com
drivers/gpu/drm/xe/xe_ttm_vram_mgr.c

index 6553a19f7cf2f34914320a2f2671387a9cbe59ba..d6aa61e55f4d75c3a351e1c47b40b1d1993a3375 100644 (file)
@@ -81,6 +81,9 @@ static int xe_ttm_vram_mgr_new(struct ttm_resource_manager *man,
        if (place->flags & TTM_PL_FLAG_TOPDOWN)
                vres->flags |= DRM_BUDDY_TOPDOWN_ALLOCATION;
 
+       if (place->flags & TTM_PL_FLAG_CONTIGUOUS)
+               vres->flags |= DRM_BUDDY_CONTIGUOUS_ALLOCATION;
+
        if (place->fpfn || lpfn != man->size >> PAGE_SHIFT)
                vres->flags |= DRM_BUDDY_RANGE_ALLOCATION;
 
@@ -110,25 +113,12 @@ static int xe_ttm_vram_mgr_new(struct ttm_resource_manager *man,
                goto error_unlock;
        }
 
-       if (place->fpfn + (size >> PAGE_SHIFT) != lpfn &&
-           place->flags & TTM_PL_FLAG_CONTIGUOUS) {
-               size = roundup_pow_of_two(size);
-               min_page_size = size;
-
-               lpfn = max_t(unsigned long, place->fpfn + (size >> PAGE_SHIFT), lpfn);
-       }
-
        err = drm_buddy_alloc_blocks(mm, (u64)place->fpfn << PAGE_SHIFT,
                                     (u64)lpfn << PAGE_SHIFT, size,
                                     min_page_size, &vres->blocks, vres->flags);
        if (err)
                goto error_unlock;
 
-       if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
-               if (!drm_buddy_block_trim(mm, NULL, vres->base.size, &vres->blocks))
-                       size = vres->base.size;
-       }
-
        if (lpfn <= mgr->visible_size >> PAGE_SHIFT) {
                vres->used_visible_size = size;
        } else {