Thomas Hellström
2024-Jan-18 16:38 UTC
[PATCH 3/5] drm/ttm: replace busy placement with flags v6
On 1/17/24 13:27, Thomas Hellstr?m wrote:> > On 1/17/24 11:47, Thomas Hellstr?m wrote: >> Hi, Christian >> >> Xe changes look good. Will send the series to xe ci to check for >> regressions. > > Hmm, there are some checkpatch warnings about author / SOB email > mismatch,With those fixed, this patch is Reviewed-by: Thomas Hellstr?m <thomas.hellstrom at linux.intel.com>> > But worserthere are some regressions in the dma-buf ktest (it tests > evicting of a dynamic dma-buf), > > https://patchwork.freedesktop.org/series/128873/ > > I'll take a look later today or tomorrow.These are from the next patch. Will continue the discussion there. /Thomas> > /Thomas > > > >> >> /Thomas >> >> >> On 1/12/24 13:51, Christian K?nig wrote: >>> From: Somalapuram Amaranath <Amaranath.Somalapuram at amd.com> >>> >>> Instead of a list of separate busy placement add flags which indicate >>> that a placement should only be used when there is room or if we >>> need to >>> evict. >>> >>> v2: add missing TTM_PL_FLAG_IDLE for i915 >>> v3: fix auto build test ERROR on drm-tip/drm-tip >>> v4: fix some typos pointed out by checkpatch >>> v5: cleanup some rebase problems with VMWGFX >>> v6: implement some missing VMWGFX functionality pointed out by Zack, >>> ???? rename the flags as suggested by Michel, rebase on drm-tip and >>> ???? adjust XE as well >>> >>> Signed-off-by: Christian K?nig <christian.koenig at amd.com> >>> Signed-off-by: Somalapuram Amaranath <Amaranath.Somalapuram at amd.com> >>> --- >>> ? drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |? 6 +- >>> ? drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c??? | 11 +--- >>> ? drivers/gpu/drm/drm_gem_vram_helper.c????? |? 2 - >>> ? drivers/gpu/drm/i915/gem/i915_gem_ttm.c??? | 37 +++++------ >>> ? drivers/gpu/drm/loongson/lsdc_ttm.c??????? |? 2 - >>> ? drivers/gpu/drm/nouveau/nouveau_bo.c?????? | 59 +++++++---------- >>> ? drivers/gpu/drm/nouveau/nouveau_bo.h?????? |? 1 - >>> ? drivers/gpu/drm/qxl/qxl_object.c?????????? |? 2 - >>> ? drivers/gpu/drm/qxl/qxl_ttm.c????????????? |? 2 - >>> ? drivers/gpu/drm/radeon/radeon_object.c???? |? 2 - >>> ? drivers/gpu/drm/radeon/radeon_ttm.c??????? |? 8 +-- >>> ? drivers/gpu/drm/radeon/radeon_uvd.c??????? |? 1 - >>> ? drivers/gpu/drm/ttm/ttm_bo.c?????????????? | 21 ++++--- >>> ? drivers/gpu/drm/ttm/ttm_resource.c???????? | 73 >>> +++++----------------- >>> ? drivers/gpu/drm/vmwgfx/vmwgfx_bo.c???????? | 33 +++++++--- >>> ? drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |? 4 -- >>> ? drivers/gpu/drm/xe/xe_bo.c???????????????? | 33 +++++----- >>> ? include/drm/ttm/ttm_placement.h??????????? | 10 +-- >>> ? include/drm/ttm/ttm_resource.h???????????? |? 8 +-- >>> ? 19 files changed, 118 insertions(+), 197 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>> index 425cebcc5cbf..b671b0665492 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>> @@ -220,9 +220,6 @@ void amdgpu_bo_placement_from_domain(struct >>> amdgpu_bo *abo, u32 domain) >>> ? ????? placement->num_placement = c; >>> ????? placement->placement = places; >>> - >>> -??? placement->num_busy_placement = c; >>> -??? placement->busy_placement = places; >>> ? } >>> ? ? /** >>> @@ -1397,8 +1394,7 @@ vm_fault_t >>> amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) >>> ????????????????????? AMDGPU_GEM_DOMAIN_GTT); >>> ? ????? /* Avoid costly evictions; only set GTT as a busy placement */ >>> -??? abo->placement.num_busy_placement = 1; >>> -??? abo->placement.busy_placement = &abo->placements[1]; >>> +??? abo->placements[0].flags |= TTM_PL_FLAG_DESIRED; >>> ? ????? r = ttm_bo_validate(bo, &abo->placement, &ctx); >>> ????? if (unlikely(r == -EBUSY || r == -ERESTARTSYS)) >>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>> index 75c9fd2c6c2a..8722beba494e 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>> @@ -102,23 +102,19 @@ static void amdgpu_evict_flags(struct >>> ttm_buffer_object *bo, >>> ????? /* Don't handle scatter gather BOs */ >>> ????? if (bo->type == ttm_bo_type_sg) { >>> ????????? placement->num_placement = 0; >>> -??????? placement->num_busy_placement = 0; >>> ????????? return; >>> ????? } >>> ? ????? /* Object isn't an AMDGPU object so ignore */ >>> ????? if (!amdgpu_bo_is_amdgpu_bo(bo)) { >>> ????????? placement->placement = &placements; >>> -??????? placement->busy_placement = &placements; >>> ????????? placement->num_placement = 1; >>> -??????? placement->num_busy_placement = 1; >>> ????????? return; >>> ????? } >>> ? ????? abo = ttm_to_amdgpu_bo(bo); >>> ????? if (abo->flags & AMDGPU_GEM_CREATE_DISCARDABLE) { >>> ????????? placement->num_placement = 0; >>> -??????? placement->num_busy_placement = 0; >>> ????????? return; >>> ????? } >>> ? @@ -128,13 +124,13 @@ static void amdgpu_evict_flags(struct >>> ttm_buffer_object *bo, >>> ????? case AMDGPU_PL_OA: >>> ????? case AMDGPU_PL_DOORBELL: >>> ????????? placement->num_placement = 0; >>> -??????? placement->num_busy_placement = 0; >>> ????????? return; >>> ? ????? case TTM_PL_VRAM: >>> ????????? if (!adev->mman.buffer_funcs_enabled) { >>> ????????????? /* Move to system memory */ >>> ????????????? amdgpu_bo_placement_from_domain(abo, >>> AMDGPU_GEM_DOMAIN_CPU); >>> + >>> ????????? } else if (!amdgpu_gmc_vram_full_visible(&adev->gmc) && >>> ???????????????? !(abo->flags & >>> AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) && >>> ???????????????? amdgpu_bo_in_cpu_visible_vram(abo)) { >>> @@ -149,8 +145,7 @@ static void amdgpu_evict_flags(struct >>> ttm_buffer_object *bo, >>> ????????????????????????????? AMDGPU_GEM_DOMAIN_CPU); >>> ????????????? abo->placements[0].fpfn = adev->gmc.visible_vram_size >>> >> PAGE_SHIFT; >>> ????????????? abo->placements[0].lpfn = 0; >>> -??????????? abo->placement.busy_placement = &abo->placements[1]; >>> -??????????? abo->placement.num_busy_placement = 1; >>> +??????????? abo->placements[0].flags |= TTM_PL_FLAG_DESIRED; >>> ????????? } else { >>> ????????????? /* Move to GTT memory */ >>> ????????????? amdgpu_bo_placement_from_domain(abo, >>> AMDGPU_GEM_DOMAIN_GTT | >>> @@ -966,8 +961,6 @@ int amdgpu_ttm_alloc_gart(struct >>> ttm_buffer_object *bo) >>> ????? /* allocate GART space */ >>> ????? placement.num_placement = 1; >>> ????? placement.placement = &placements; >>> -??? placement.num_busy_placement = 1; >>> -??? placement.busy_placement = &placements; >>> ????? placements.fpfn = 0; >>> ????? placements.lpfn = adev->gmc.gart_size >> PAGE_SHIFT; >>> ????? placements.mem_type = TTM_PL_TT; >>> diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c >>> b/drivers/gpu/drm/drm_gem_vram_helper.c >>> index b67eafa55715..75f2eaf0d5b6 100644 >>> --- a/drivers/gpu/drm/drm_gem_vram_helper.c >>> +++ b/drivers/gpu/drm/drm_gem_vram_helper.c >>> @@ -147,7 +147,6 @@ static void drm_gem_vram_placement(struct >>> drm_gem_vram_object *gbo, >>> ????????? invariant_flags = TTM_PL_FLAG_TOPDOWN; >>> ? ????? gbo->placement.placement = gbo->placements; >>> -??? gbo->placement.busy_placement = gbo->placements; >>> ? ????? if (pl_flag & DRM_GEM_VRAM_PL_FLAG_VRAM) { >>> ????????? gbo->placements[c].mem_type = TTM_PL_VRAM; >>> @@ -160,7 +159,6 @@ static void drm_gem_vram_placement(struct >>> drm_gem_vram_object *gbo, >>> ????? } >>> ? ????? gbo->placement.num_placement = c; >>> -??? gbo->placement.num_busy_placement = c; >>> ? ????? for (i = 0; i < c; ++i) { >>> ????????? gbo->placements[i].fpfn = 0; >>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>> b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>> index 6b69ef0cdbb4..80c6cafc8887 100644 >>> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>> @@ -65,8 +65,6 @@ static const struct ttm_place sys_placement_flags = { >>> ? static struct ttm_placement i915_sys_placement = { >>> ????? .num_placement = 1, >>> ????? .placement = &sys_placement_flags, >>> -??? .num_busy_placement = 1, >>> -??? .busy_placement = &sys_placement_flags, >>> ? }; >>> ? ? /** >>> @@ -157,32 +155,28 @@ i915_ttm_place_from_region(const struct >>> intel_memory_region *mr, >>> ? ? static void >>> ? i915_ttm_placement_from_obj(const struct drm_i915_gem_object *obj, >>> -??????????????? struct ttm_place *requested, >>> -??????????????? struct ttm_place *busy, >>> +??????????????? struct ttm_place *places, >>> ????????????????? struct ttm_placement *placement) >>> ? { >>> ????? unsigned int num_allowed = obj->mm.n_placements; >>> ????? unsigned int flags = obj->flags; >>> ????? unsigned int i; >>> ? -??? placement->num_placement = 1; >>> +??? places[0].flags |= TTM_PL_FLAG_DESIRED; >>> ????? i915_ttm_place_from_region(num_allowed ? obj->mm.placements[0] : >>> -?????????????????? obj->mm.region, requested, obj->bo_offset, >>> +?????????????????? obj->mm.region, &places[0], obj->bo_offset, >>> ???????????????????? obj->base.size, flags); >>> ? ????? /* Cache this on object? */ >>> -??? placement->num_busy_placement = num_allowed; >>> -??? for (i = 0; i < placement->num_busy_placement; ++i) >>> -??????? i915_ttm_place_from_region(obj->mm.placements[i], busy + i, >>> -?????????????????????? obj->bo_offset, obj->base.size, flags); >>> - >>> -??? if (num_allowed == 0) { >>> -??????? *busy = *requested; >>> -??????? placement->num_busy_placement = 1; >>> +??? for (i = 0; i < num_allowed; ++i) { >>> +??????? i915_ttm_place_from_region(obj->mm.placements[i], >>> +?????????????????????? &places[i + 1], obj->bo_offset, >>> +?????????????????????? obj->base.size, flags); >>> +??????? places[i + 1].flags |= TTM_PL_FLAG_FALLBACK; >>> ????? } >>> ? -??? placement->placement = requested; >>> -??? placement->busy_placement = busy; >>> +??? placement->num_placement = num_allowed + 1; >>> +??? placement->placement = places; >>> ? } >>> ? ? static int i915_ttm_tt_shmem_populate(struct ttm_device *bdev, >>> @@ -789,7 +783,8 @@ static int __i915_ttm_get_pages(struct >>> drm_i915_gem_object *obj, >>> ????? int ret; >>> ? ????? /* First try only the requested placement. No eviction. */ >>> -??? real_num_busy = fetch_and_zero(&placement->num_busy_placement); >>> +??? real_num_busy = placement->num_placement; >>> +??? placement->num_placement = 1; >>> ????? ret = ttm_bo_validate(bo, placement, &ctx); >>> ????? if (ret) { >>> ????????? ret = i915_ttm_err_to_gem(ret); >>> @@ -805,7 +800,7 @@ static int __i915_ttm_get_pages(struct >>> drm_i915_gem_object *obj, >>> ?????????? * If the initial attempt fails, allow all accepted >>> placements, >>> ?????????? * evicting if necessary. >>> ?????????? */ >>> -??????? placement->num_busy_placement = real_num_busy; >>> +??????? placement->num_placement = real_num_busy; >>> ????????? ret = ttm_bo_validate(bo, placement, &ctx); >>> ????????? if (ret) >>> ????????????? return i915_ttm_err_to_gem(ret); >>> @@ -839,7 +834,7 @@ static int __i915_ttm_get_pages(struct >>> drm_i915_gem_object *obj, >>> ? ? static int i915_ttm_get_pages(struct drm_i915_gem_object *obj) >>> ? { >>> -??? struct ttm_place requested, busy[I915_TTM_MAX_PLACEMENTS]; >>> +??? struct ttm_place places[I915_TTM_MAX_PLACEMENTS + 1]; >>> ????? struct ttm_placement placement; >>> ? ????? /* restricted by sg_alloc_table */ >>> @@ -849,7 +844,7 @@ static int i915_ttm_get_pages(struct >>> drm_i915_gem_object *obj) >>> ????? GEM_BUG_ON(obj->mm.n_placements > I915_TTM_MAX_PLACEMENTS); >>> ? ????? /* Move to the requested placement. */ >>> -??? i915_ttm_placement_from_obj(obj, &requested, busy, &placement); >>> +??? i915_ttm_placement_from_obj(obj, places, &placement); >>> ? ????? return __i915_ttm_get_pages(obj, &placement); >>> ? } >>> @@ -879,9 +874,7 @@ static int __i915_ttm_migrate(struct >>> drm_i915_gem_object *obj, >>> ????? i915_ttm_place_from_region(mr, &requested, obj->bo_offset, >>> ???????????????????? obj->base.size, flags); >>> ????? placement.num_placement = 1; >>> -??? placement.num_busy_placement = 1; >>> ????? placement.placement = &requested; >>> -??? placement.busy_placement = &requested; >>> ? ????? ret = __i915_ttm_get_pages(obj, &placement); >>> ????? if (ret) >>> diff --git a/drivers/gpu/drm/loongson/lsdc_ttm.c >>> b/drivers/gpu/drm/loongson/lsdc_ttm.c >>> index bf79dc55afa4..465f622ac05d 100644 >>> --- a/drivers/gpu/drm/loongson/lsdc_ttm.c >>> +++ b/drivers/gpu/drm/loongson/lsdc_ttm.c >>> @@ -54,7 +54,6 @@ static void lsdc_bo_set_placement(struct lsdc_bo >>> *lbo, u32 domain) >>> ????????? pflags |= TTM_PL_FLAG_TOPDOWN; >>> ? ????? lbo->placement.placement = lbo->placements; >>> -??? lbo->placement.busy_placement = lbo->placements; >>> ? ????? if (domain & LSDC_GEM_DOMAIN_VRAM) { >>> ????????? lbo->placements[c].mem_type = TTM_PL_VRAM; >>> @@ -77,7 +76,6 @@ static void lsdc_bo_set_placement(struct lsdc_bo >>> *lbo, u32 domain) >>> ????? } >>> ? ????? lbo->placement.num_placement = c; >>> -??? lbo->placement.num_busy_placement = c; >>> ? ????? for (i = 0; i < c; ++i) { >>> ????????? lbo->placements[i].fpfn = 0; >>> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c >>> b/drivers/gpu/drm/nouveau/nouveau_bo.c >>> index 00cc7d1abaa3..56dcd25db1ce 100644 >>> --- a/drivers/gpu/drm/nouveau/nouveau_bo.c >>> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c >>> @@ -404,27 +404,6 @@ nouveau_bo_new(struct nouveau_cli *cli, u64 >>> size, int align, >>> ????? return 0; >>> ? } >>> ? -static void >>> -set_placement_list(struct ttm_place *pl, unsigned *n, uint32_t domain) >>> -{ >>> -??? *n = 0; >>> - >>> -??? if (domain & NOUVEAU_GEM_DOMAIN_VRAM) { >>> -??????? pl[*n].mem_type = TTM_PL_VRAM; >>> -??????? pl[*n].flags = 0; >>> -??????? (*n)++; >>> -??? } >>> -??? if (domain & NOUVEAU_GEM_DOMAIN_GART) { >>> -??????? pl[*n].mem_type = TTM_PL_TT; >>> -??????? pl[*n].flags = 0; >>> -??????? (*n)++; >>> -??? } >>> -??? if (domain & NOUVEAU_GEM_DOMAIN_CPU) { >>> -??????? pl[*n].mem_type = TTM_PL_SYSTEM; >>> -??????? pl[(*n)++].flags = 0; >>> -??? } >>> -} >>> - >>> ? static void >>> ? set_placement_range(struct nouveau_bo *nvbo, uint32_t domain) >>> ? { >>> @@ -452,10 +431,6 @@ set_placement_range(struct nouveau_bo *nvbo, >>> uint32_t domain) >>> ????????????? nvbo->placements[i].fpfn = fpfn; >>> ????????????? nvbo->placements[i].lpfn = lpfn; >>> ????????? } >>> -??????? for (i = 0; i < nvbo->placement.num_busy_placement; ++i) { >>> -??????????? nvbo->busy_placements[i].fpfn = fpfn; >>> -??????????? nvbo->busy_placements[i].lpfn = lpfn; >>> -??????? } >>> ????? } >>> ? } >>> ? @@ -463,15 +438,32 @@ void >>> ? nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t domain, >>> ?????????????? uint32_t busy) >>> ? { >>> -??? struct ttm_placement *pl = &nvbo->placement; >>> +??? unsigned int *n = &nvbo->placement.num_placement; >>> +??? struct ttm_place *pl = nvbo->placements; >>> ? -??? pl->placement = nvbo->placements; >>> -??? set_placement_list(nvbo->placements, &pl->num_placement, domain); >>> +??? domain |= busy; >>> ? -??? pl->busy_placement = nvbo->busy_placements; >>> -??? set_placement_list(nvbo->busy_placements, &pl->num_busy_placement, >>> -?????????????? domain | busy); >>> +??? *n = 0; >>> +??? if (domain & NOUVEAU_GEM_DOMAIN_VRAM) { >>> +??????? pl[*n].mem_type = TTM_PL_VRAM; >>> +??????? pl[*n].flags = busy & NOUVEAU_GEM_DOMAIN_VRAM ? >>> +??????????? TTM_PL_FLAG_FALLBACK : 0; >>> +??????? (*n)++; >>> +??? } >>> +??? if (domain & NOUVEAU_GEM_DOMAIN_GART) { >>> +??????? pl[*n].mem_type = TTM_PL_TT; >>> +??????? pl[*n].flags = busy & NOUVEAU_GEM_DOMAIN_GART ? >>> +??????????? TTM_PL_FLAG_FALLBACK : 0; >>> +??????? (*n)++; >>> +??? } >>> +??? if (domain & NOUVEAU_GEM_DOMAIN_CPU) { >>> +??????? pl[*n].mem_type = TTM_PL_SYSTEM; >>> +??????? pl[*n].flags = busy & NOUVEAU_GEM_DOMAIN_CPU ? >>> +??????????? TTM_PL_FLAG_FALLBACK : 0; >>> +??????? (*n)++; >>> +??? } >>> ? +??? nvbo->placement.placement = nvbo->placements; >>> ????? set_placement_range(nvbo, domain); >>> ? } >>> ? @@ -1314,11 +1306,6 @@ vm_fault_t >>> nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo) >>> ????????????? nvbo->placements[i].lpfn = mappable; >>> ????????? } >>> ? -??????? for (i = 0; i < nvbo->placement.num_busy_placement; ++i) { >>> -??????????? nvbo->busy_placements[i].fpfn = 0; >>> -??????????? nvbo->busy_placements[i].lpfn = mappable; >>> -??????? } >>> - >>> ????????? nouveau_bo_placement_set(nvbo, NOUVEAU_GEM_DOMAIN_VRAM, 0); >>> ????? } >>> ? diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.h >>> b/drivers/gpu/drm/nouveau/nouveau_bo.h >>> index 70c551921a9e..e9dfab6a8156 100644 >>> --- a/drivers/gpu/drm/nouveau/nouveau_bo.h >>> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.h >>> @@ -15,7 +15,6 @@ struct nouveau_bo { >>> ????? struct ttm_placement placement; >>> ????? u32 valid_domains; >>> ????? struct ttm_place placements[3]; >>> -??? struct ttm_place busy_placements[3]; >>> ????? bool force_coherent; >>> ????? struct ttm_bo_kmap_obj kmap; >>> ????? struct list_head head; >>> diff --git a/drivers/gpu/drm/qxl/qxl_object.c >>> b/drivers/gpu/drm/qxl/qxl_object.c >>> index 06a58dad5f5c..1e46b0a6e478 100644 >>> --- a/drivers/gpu/drm/qxl/qxl_object.c >>> +++ b/drivers/gpu/drm/qxl/qxl_object.c >>> @@ -66,7 +66,6 @@ void qxl_ttm_placement_from_domain(struct qxl_bo >>> *qbo, u32 domain) >>> ????????? pflag |= TTM_PL_FLAG_TOPDOWN; >>> ? ????? qbo->placement.placement = qbo->placements; >>> -??? qbo->placement.busy_placement = qbo->placements; >>> ????? if (domain == QXL_GEM_DOMAIN_VRAM) { >>> ????????? qbo->placements[c].mem_type = TTM_PL_VRAM; >>> ????????? qbo->placements[c++].flags = pflag; >>> @@ -86,7 +85,6 @@ void qxl_ttm_placement_from_domain(struct qxl_bo >>> *qbo, u32 domain) >>> ????????? qbo->placements[c++].flags = 0; >>> ????? } >>> ????? qbo->placement.num_placement = c; >>> -??? qbo->placement.num_busy_placement = c; >>> ????? for (i = 0; i < c; ++i) { >>> ????????? qbo->placements[i].fpfn = 0; >>> ????????? qbo->placements[i].lpfn = 0; >>> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c >>> b/drivers/gpu/drm/qxl/qxl_ttm.c >>> index 1a82629bce3f..765a144cea14 100644 >>> --- a/drivers/gpu/drm/qxl/qxl_ttm.c >>> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c >>> @@ -60,9 +60,7 @@ static void qxl_evict_flags(struct >>> ttm_buffer_object *bo, >>> ? ????? if (!qxl_ttm_bo_is_qxl_bo(bo)) { >>> ????????? placement->placement = &placements; >>> -??????? placement->busy_placement = &placements; >>> ????????? placement->num_placement = 1; >>> -??????? placement->num_busy_placement = 1; >>> ????????? return; >>> ????? } >>> ????? qbo = to_qxl_bo(bo); >>> diff --git a/drivers/gpu/drm/radeon/radeon_object.c >>> b/drivers/gpu/drm/radeon/radeon_object.c >>> index 10c0fbd9d2b4..a955f8a2f7fe 100644 >>> --- a/drivers/gpu/drm/radeon/radeon_object.c >>> +++ b/drivers/gpu/drm/radeon/radeon_object.c >>> @@ -78,7 +78,6 @@ void radeon_ttm_placement_from_domain(struct >>> radeon_bo *rbo, u32 domain) >>> ????? u32 c = 0, i; >>> ? ????? rbo->placement.placement = rbo->placements; >>> -??? rbo->placement.busy_placement = rbo->placements; >>> ????? if (domain & RADEON_GEM_DOMAIN_VRAM) { >>> ????????? /* Try placing BOs which don't need CPU access outside of the >>> ?????????? * CPU accessible part of VRAM >>> @@ -114,7 +113,6 @@ void radeon_ttm_placement_from_domain(struct >>> radeon_bo *rbo, u32 domain) >>> ????? } >>> ? ????? rbo->placement.num_placement = c; >>> -??? rbo->placement.num_busy_placement = c; >>> ? ????? for (i = 0; i < c; ++i) { >>> ????????? if ((rbo->flags & RADEON_GEM_CPU_ACCESS) && >>> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c >>> b/drivers/gpu/drm/radeon/radeon_ttm.c >>> index de4e6d78f1e1..2078b0000e22 100644 >>> --- a/drivers/gpu/drm/radeon/radeon_ttm.c >>> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c >>> @@ -92,9 +92,7 @@ static void radeon_evict_flags(struct >>> ttm_buffer_object *bo, >>> ? ????? if (!radeon_ttm_bo_is_radeon_bo(bo)) { >>> ????????? placement->placement = &placements; >>> -??????? placement->busy_placement = &placements; >>> ????????? placement->num_placement = 1; >>> -??????? placement->num_busy_placement = 1; >>> ????????? return; >>> ????? } >>> ????? rbo = container_of(bo, struct radeon_bo, tbo); >>> @@ -114,15 +112,11 @@ static void radeon_evict_flags(struct >>> ttm_buffer_object *bo, >>> ?????????????? */ >>> ????????????? radeon_ttm_placement_from_domain(rbo, >>> RADEON_GEM_DOMAIN_VRAM | >>> ?????????????????????????????? RADEON_GEM_DOMAIN_GTT); >>> -??????????? rbo->placement.num_busy_placement = 0; >>> ????????????? for (i = 0; i < rbo->placement.num_placement; i++) { >>> ????????????????? if (rbo->placements[i].mem_type == TTM_PL_VRAM) { >>> ????????????????????? if (rbo->placements[i].fpfn < fpfn) >>> ????????????????????????? rbo->placements[i].fpfn = fpfn; >>> -??????????????? } else { >>> -??????????????????? rbo->placement.busy_placement >>> -??????????????????????? &rbo->placements[i]; >>> -??????????????????? rbo->placement.num_busy_placement = 1; >>> +??????????????????? rbo->placements[0].flags |= TTM_PL_FLAG_DESIRED; >>> ????????????????? } >>> ????????????? } >>> ????????? } else >>> diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c >>> b/drivers/gpu/drm/radeon/radeon_uvd.c >>> index a2cda184b2b2..058a1c8451b2 100644 >>> --- a/drivers/gpu/drm/radeon/radeon_uvd.c >>> +++ b/drivers/gpu/drm/radeon/radeon_uvd.c >>> @@ -324,7 +324,6 @@ void radeon_uvd_force_into_uvd_segment(struct >>> radeon_bo *rbo, >>> ????? rbo->placements[1].fpfn += (256 * 1024 * 1024) >> PAGE_SHIFT; >>> ????? rbo->placements[1].lpfn += (256 * 1024 * 1024) >> PAGE_SHIFT; >>> ????? rbo->placement.num_placement++; >>> -??? rbo->placement.num_busy_placement++; >>> ? } >>> ? ? void radeon_uvd_free_handles(struct radeon_device *rdev, struct >>> drm_file *filp) >>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c >>> b/drivers/gpu/drm/ttm/ttm_bo.c >>> index 8c1eaa74fa21..a5e11a92e0b9 100644 >>> --- a/drivers/gpu/drm/ttm/ttm_bo.c >>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c >>> @@ -410,8 +410,8 @@ static int ttm_bo_bounce_temp_buffer(struct >>> ttm_buffer_object *bo, >>> ????? struct ttm_resource *hop_mem; >>> ????? int ret; >>> ? -??? hop_placement.num_placement = >>> hop_placement.num_busy_placement = 1; >>> -??? hop_placement.placement = hop_placement.busy_placement = hop; >>> +??? hop_placement.num_placement = 1; >>> +??? hop_placement.placement = hop; >>> ? ????? /* find space in the bounce domain */ >>> ????? ret = ttm_bo_mem_space(bo, &hop_placement, &hop_mem, ctx); >>> @@ -440,10 +440,9 @@ static int ttm_bo_evict(struct >>> ttm_buffer_object *bo, >>> ????? dma_resv_assert_held(bo->base.resv); >>> ? ????? placement.num_placement = 0; >>> -??? placement.num_busy_placement = 0; >>> ????? bdev->funcs->evict_flags(bo, &placement); >>> ? -??? if (!placement.num_placement && !placement.num_busy_placement) { >>> +??? if (!placement.num_placement) { >>> ????????? ret = ttm_bo_wait_ctx(bo, ctx); >>> ????????? if (ret) >>> ????????????? return ret; >>> @@ -791,6 +790,9 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo, >>> ????????? const struct ttm_place *place = &placement->placement[i]; >>> ????????? struct ttm_resource_manager *man; >>> ? +??????? if (place->flags & TTM_PL_FLAG_FALLBACK) >>> +??????????? continue; >>> + >>> ????????? man = ttm_manager_type(bdev, place->mem_type); >>> ????????? if (!man || !ttm_resource_manager_used(man)) >>> ????????????? continue; >>> @@ -813,10 +815,13 @@ int ttm_bo_mem_space(struct ttm_buffer_object >>> *bo, >>> ????????? return 0; >>> ????? } >>> ? -??? for (i = 0; i < placement->num_busy_placement; ++i) { >>> -??????? const struct ttm_place *place = &placement->busy_placement[i]; >>> +??? for (i = 0; i < placement->num_placement; ++i) { >>> +??????? const struct ttm_place *place = &placement->placement[i]; >>> ????????? struct ttm_resource_manager *man; >>> ? +??????? if (place->flags & TTM_PL_FLAG_DESIRED) >>> +??????????? continue; >>> + >>> ????????? man = ttm_manager_type(bdev, place->mem_type); >>> ????????? if (!man || !ttm_resource_manager_used(man)) >>> ????????????? continue; >>> @@ -904,11 +909,11 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, >>> ????? /* >>> ?????? * Remove the backing store if no placement is given. >>> ?????? */ >>> -??? if (!placement->num_placement && !placement->num_busy_placement) >>> +??? if (!placement->num_placement) >>> ????????? return ttm_bo_pipeline_gutting(bo); >>> ? ????? /* Check whether we need to move buffer. */ >>> -??? if (bo->resource && ttm_resource_compat(bo->resource, placement)) >>> +??? if (bo->resource && ttm_resource_compatible(bo->resource, >>> placement)) >>> ????????? return 0; >>> ? ????? /* Moving of pinned BOs is forbidden */ >>> diff --git a/drivers/gpu/drm/ttm/ttm_resource.c >>> b/drivers/gpu/drm/ttm/ttm_resource.c >>> index 02b96d23fdb9..fb14f7716cf8 100644 >>> --- a/drivers/gpu/drm/ttm/ttm_resource.c >>> +++ b/drivers/gpu/drm/ttm/ttm_resource.c >>> @@ -291,37 +291,15 @@ bool ttm_resource_intersects(struct ttm_device >>> *bdev, >>> ? } >>> ? ? /** >>> - * ttm_resource_compatible - test for compatibility >>> + * ttm_resource_compatible - check if resource is compatible with >>> placement >>> ?? * >>> - * @bdev: TTM device structure >>> - * @res: The resource to test >>> - * @place: The placement to test >>> - * @size: How many bytes the new allocation needs. >>> - * >>> - * Test if @res compatible with @place and @size. >>> + * @res: the resource to check >>> + * @placement: the placement to check against >>> ?? * >>> - * Returns true if the res placement compatible with @place and @size. >>> + * Returns true if the placement is compatible. >>> ?? */ >>> -bool ttm_resource_compatible(struct ttm_device *bdev, >>> -???????????????? struct ttm_resource *res, >>> -???????????????? const struct ttm_place *place, >>> -???????????????? size_t size) >>> -{ >>> -??? struct ttm_resource_manager *man; >>> - >>> -??? if (!res || !place) >>> -??????? return false; >>> - >>> -??? man = ttm_manager_type(bdev, res->mem_type); >>> -??? if (!man->func->compatible) >>> -??????? return true; >>> - >>> -??? return man->func->compatible(man, res, place, size); >>> -} >>> - >>> -static bool ttm_resource_places_compat(struct ttm_resource *res, >>> -?????????????????????? const struct ttm_place *places, >>> -?????????????????????? unsigned num_placement) >>> +bool ttm_resource_compatible(struct ttm_resource *res, >>> +???????????????? struct ttm_placement *placement) >>> ? { >>> ????? struct ttm_buffer_object *bo = res->bo; >>> ????? struct ttm_device *bdev = bo->bdev; >>> @@ -330,44 +308,25 @@ static bool ttm_resource_places_compat(struct >>> ttm_resource *res, >>> ????? if (res->placement & TTM_PL_FLAG_TEMPORARY) >>> ????????? return false; >>> ? -??? for (i = 0; i < num_placement; i++) { >>> -??????? const struct ttm_place *heap = &places[i]; >>> +??? for (i = 0; i < placement->num_placement; i++) { >>> +??????? const struct ttm_place *place = &placement->placement[i]; >>> +??????? struct ttm_resource_manager *man; >>> ? -??????? if (!ttm_resource_compatible(bdev, res, heap, >>> bo->base.size)) >>> +??????? if (res->mem_type != place->mem_type) >>> +??????????? continue; >>> + >>> +??????? man = ttm_manager_type(bdev, res->mem_type); >>> +??????? if (man->func->compatible && >>> +??????????? !man->func->compatible(man, res, place, bo->base.size)) >>> ????????????? continue; >>> ? -??????? if ((res->mem_type == heap->mem_type) && >>> -??????????? (!(heap->flags & TTM_PL_FLAG_CONTIGUOUS) || >>> +??????? if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) || >>> ?????????????? (res->placement & TTM_PL_FLAG_CONTIGUOUS))) >>> ????????????? return true; >>> ????? } >>> ????? return false; >>> ? } >>> ? -/** >>> - * ttm_resource_compat - check if resource is compatible with >>> placement >>> - * >>> - * @res: the resource to check >>> - * @placement: the placement to check against >>> - * >>> - * Returns true if the placement is compatible. >>> - */ >>> -bool ttm_resource_compat(struct ttm_resource *res, >>> -???????????? struct ttm_placement *placement) >>> -{ >>> -??? if (ttm_resource_places_compat(res, placement->placement, >>> -?????????????????????? placement->num_placement)) >>> -??????? return true; >>> - >>> -??? if ((placement->busy_placement != placement->placement || >>> -???????? placement->num_busy_placement > placement->num_placement) && >>> -??????? ttm_resource_places_compat(res, placement->busy_placement, >>> -?????????????????????? placement->num_busy_placement)) >>> -??????? return true; >>> - >>> -??? return false; >>> -} >>> - >>> ? void ttm_resource_set_bo(struct ttm_resource *res, >>> ?????????????? struct ttm_buffer_object *bo) >>> ? { >>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >>> b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >>> index 2bfac3aad7b7..bfd41ce3c8f4 100644 >>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >>> @@ -742,9 +742,21 @@ void vmw_bo_move_notify(struct >>> ttm_buffer_object *bo, >>> ????????? vmw_resource_unbind_list(vbo); >>> ? } >>> ? +static u32 placement_flags(u32 domain, u32 desired, u32 fallback) >>> +{ >>> +??? if (desired & fallback & domain) >>> +??????? return 0; >>> + >>> +??? if (desired & domain) >>> +??????? return TTM_PL_FLAG_DESIRED; >>> + >>> +??? return TTM_PL_FLAG_FALLBACK; >>> +} >>> + >>> ? static u32 >>> -set_placement_list(struct ttm_place *pl, u32 domain) >>> +set_placement_list(struct ttm_place *pl, u32 desired, u32 fallback) >>> ? { >>> +??? u32 domain = desired | fallback; >>> ????? u32 n = 0; >>> ? ????? /* >>> @@ -752,35 +764,40 @@ set_placement_list(struct ttm_place *pl, u32 >>> domain) >>> ?????? */ >>> ????? if (domain & VMW_BO_DOMAIN_MOB) { >>> ????????? pl[n].mem_type = VMW_PL_MOB; >>> -??????? pl[n].flags = 0; >>> +??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_MOB, desired, >>> +????????????????????????? fallback); >>> ????????? pl[n].fpfn = 0; >>> ????????? pl[n].lpfn = 0; >>> ????????? n++; >>> ????? } >>> ????? if (domain & VMW_BO_DOMAIN_GMR) { >>> ????????? pl[n].mem_type = VMW_PL_GMR; >>> -??????? pl[n].flags = 0; >>> +??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_GMR, desired, >>> +????????????????????????? fallback); >>> ????????? pl[n].fpfn = 0; >>> ????????? pl[n].lpfn = 0; >>> ????????? n++; >>> ????? } >>> ????? if (domain & VMW_BO_DOMAIN_VRAM) { >>> ????????? pl[n].mem_type = TTM_PL_VRAM; >>> -??????? pl[n].flags = 0; >>> +??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_VRAM, desired, >>> +????????????????????????? fallback); >>> ????????? pl[n].fpfn = 0; >>> ????????? pl[n].lpfn = 0; >>> ????????? n++; >>> ????? } >>> ????? if (domain & VMW_BO_DOMAIN_WAITABLE_SYS) { >>> ????????? pl[n].mem_type = VMW_PL_SYSTEM; >>> -??????? pl[n].flags = 0; >>> +??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_WAITABLE_SYS, >>> +????????????????????????? desired, fallback); >>> ????????? pl[n].fpfn = 0; >>> ????????? pl[n].lpfn = 0; >>> ????????? n++; >>> ????? } >>> ????? if (domain & VMW_BO_DOMAIN_SYS) { >>> ????????? pl[n].mem_type = TTM_PL_SYSTEM; >>> -??????? pl[n].flags = 0; >>> +??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_SYS, desired, >>> +????????????????????????? fallback); >>> ????????? pl[n].fpfn = 0; >>> ????????? pl[n].lpfn = 0; >>> ????????? n++; >>> @@ -806,7 +823,7 @@ void vmw_bo_placement_set(struct vmw_bo *bo, u32 >>> domain, u32 busy_domain) >>> ????? u32 i; >>> ? ????? pl->placement = bo->places; >>> -??? pl->num_placement = set_placement_list(bo->places, domain); >>> +??? pl->num_placement = set_placement_list(bo->places, domain, >>> busy_domain); >>> ? ????? if (drm_debug_enabled(DRM_UT_DRIVER) && bo->tbo.resource) { >>> ????????? for (i = 0; i < pl->num_placement; ++i) { >>> @@ -821,8 +838,6 @@ void vmw_bo_placement_set(struct vmw_bo *bo, u32 >>> domain, u32 busy_domain) >>> ?????????????????? __func__, bo->tbo.resource->mem_type, domain); >>> ????? } >>> ? -??? pl->busy_placement = bo->busy_places; >>> -??? pl->num_busy_placement = set_placement_list(bo->busy_places, >>> busy_domain); >>> ? } >>> ? ? void vmw_bo_placement_set_default_accelerated(struct vmw_bo *bo) >>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >>> b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >>> index a84fffcef8e1..4d23d0a70bcb 100644 >>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >>> @@ -46,15 +46,11 @@ static const struct ttm_place >>> sys_placement_flags = { >>> ? struct ttm_placement vmw_vram_placement = { >>> ????? .num_placement = 1, >>> ????? .placement = &vram_placement_flags, >>> -??? .num_busy_placement = 1, >>> -??? .busy_placement = &vram_placement_flags >>> ? }; >>> ? ? struct ttm_placement vmw_sys_placement = { >>> ????? .num_placement = 1, >>> ????? .placement = &sys_placement_flags, >>> -??? .num_busy_placement = 1, >>> -??? .busy_placement = &sys_placement_flags >>> ? }; >>> ? ? const size_t vmw_tt_size = sizeof(struct vmw_ttm_tt); >>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c >>> index 8e4a3b1f6b93..1e5edc7f0b85 100644 >>> --- a/drivers/gpu/drm/xe/xe_bo.c >>> +++ b/drivers/gpu/drm/xe/xe_bo.c >>> @@ -38,22 +38,26 @@ static const struct ttm_place >>> sys_placement_flags = { >>> ? static struct ttm_placement sys_placement = { >>> ????? .num_placement = 1, >>> ????? .placement = &sys_placement_flags, >>> -??? .num_busy_placement = 1, >>> -??? .busy_placement = &sys_placement_flags, >>> ? }; >>> ? -static const struct ttm_place tt_placement_flags = { >>> -??? .fpfn = 0, >>> -??? .lpfn = 0, >>> -??? .mem_type = XE_PL_TT, >>> -??? .flags = 0, >>> +static const struct ttm_place tt_placement_flags[] = { >>> +??? { >>> +??????? .fpfn = 0, >>> +??????? .lpfn = 0, >>> +??????? .mem_type = XE_PL_TT, >>> +??????? .flags = TTM_PL_FLAG_DESIRED, >>> +??? }, >>> +??? { >>> +??????? .fpfn = 0, >>> +??????? .lpfn = 0, >>> +??????? .mem_type = XE_PL_SYSTEM, >>> +??????? .flags = TTM_PL_FLAG_FALLBACK, >>> +??? } >>> ? }; >>> ? ? static struct ttm_placement tt_placement = { >>> -??? .num_placement = 1, >>> -??? .placement = &tt_placement_flags, >>> -??? .num_busy_placement = 1, >>> -??? .busy_placement = &sys_placement_flags, >>> +??? .num_placement = 2, >>> +??? .placement = tt_placement_flags, >>> ? }; >>> ? ? bool mem_type_is_vram(u32 mem_type) >>> @@ -230,8 +234,6 @@ static int __xe_bo_placement_for_flags(struct >>> xe_device *xe, struct xe_bo *bo, >>> ????? bo->placement = (struct ttm_placement) { >>> ????????? .num_placement = c, >>> ????????? .placement = bo->placements, >>> -??????? .num_busy_placement = c, >>> -??????? .busy_placement = bo->placements, >>> ????? }; >>> ? ????? return 0; >>> @@ -251,7 +253,6 @@ static void xe_evict_flags(struct >>> ttm_buffer_object *tbo, >>> ????????? /* Don't handle scatter gather BOs */ >>> ????????? if (tbo->type == ttm_bo_type_sg) { >>> ????????????? placement->num_placement = 0; >>> -??????????? placement->num_busy_placement = 0; >>> ????????????? return; >>> ????????? } >>> ? @@ -1353,8 +1354,6 @@ static int __xe_bo_fixed_placement(struct >>> xe_device *xe, >>> ????? bo->placement = (struct ttm_placement) { >>> ????????? .num_placement = 1, >>> ????????? .placement = place, >>> -??????? .num_busy_placement = 1, >>> -??????? .busy_placement = place, >>> ????? }; >>> ? ????? return 0; >>> @@ -2112,9 +2111,7 @@ int xe_bo_migrate(struct xe_bo *bo, u32 mem_type) >>> ? ????? xe_place_from_ttm_type(mem_type, &requested); >>> ????? placement.num_placement = 1; >>> -??? placement.num_busy_placement = 1; >>> ????? placement.placement = &requested; >>> -??? placement.busy_placement = &requested; >>> ? ????? /* >>> ?????? * Stolen needs to be handled like below VRAM handling if we >>> ever need >>> diff --git a/include/drm/ttm/ttm_placement.h >>> b/include/drm/ttm/ttm_placement.h >>> index 8074d0f6cae5..b510a4812609 100644 >>> --- a/include/drm/ttm/ttm_placement.h >>> +++ b/include/drm/ttm/ttm_placement.h >>> @@ -64,6 +64,12 @@ >>> ? /* For multihop handling */ >>> ? #define TTM_PL_FLAG_TEMPORARY?? (1 << 2) >>> ? +/* Placement is never used during eviction */ >>> +#define TTM_PL_FLAG_DESIRED??? (1 << 3) >>> + >>> +/* Placement is only used during eviction */ >>> +#define TTM_PL_FLAG_FALLBACK??? (1 << 4) >>> + >>> ? /** >>> ?? * struct ttm_place >>> ?? * >>> @@ -86,16 +92,12 @@ struct ttm_place { >>> ?? * >>> ?? * @num_placement:??? number of preferred placements >>> ?? * @placement:??????? preferred placements >>> - * @num_busy_placement:??? number of preferred placements when need >>> to evict buffer >>> - * @busy_placement:??? preferred placements when need to evict buffer >>> ?? * >>> ?? * Structure indicating the placement you request for an object. >>> ?? */ >>> ? struct ttm_placement { >>> ????? unsigned??????? num_placement; >>> ????? const struct ttm_place??? *placement; >>> -??? unsigned??????? num_busy_placement; >>> -??? const struct ttm_place??? *busy_placement; >>> ? }; >>> ? ? #endif >>> diff --git a/include/drm/ttm/ttm_resource.h >>> b/include/drm/ttm/ttm_resource.h >>> index 78a226eba953..1afa13f0c22b 100644 >>> --- a/include/drm/ttm/ttm_resource.h >>> +++ b/include/drm/ttm/ttm_resource.h >>> @@ -365,12 +365,8 @@ bool ttm_resource_intersects(struct ttm_device >>> *bdev, >>> ?????????????????? struct ttm_resource *res, >>> ?????????????????? const struct ttm_place *place, >>> ?????????????????? size_t size); >>> -bool ttm_resource_compatible(struct ttm_device *bdev, >>> -???????????????? struct ttm_resource *res, >>> -???????????????? const struct ttm_place *place, >>> -???????????????? size_t size); >>> -bool ttm_resource_compat(struct ttm_resource *res, >>> -???????????? struct ttm_placement *placement); >>> +bool ttm_resource_compatible(struct ttm_resource *res, >>> +???????????????? struct ttm_placement *placement); >>> ? void ttm_resource_set_bo(struct ttm_resource *res, >>> ?????????????? struct ttm_buffer_object *bo);
Lucas De Marchi
2024-Jan-26 22:17 UTC
[PATCH 3/5] drm/ttm: replace busy placement with flags v6
On Thu, Jan 18, 2024 at 05:38:16PM +0100, Thomas Hellstr?m wrote:> >On 1/17/24 13:27, Thomas Hellstr?m wrote: >> >>On 1/17/24 11:47, Thomas Hellstr?m wrote: >>>Hi, Christian >>> >>>Xe changes look good. Will send the series to xe ci to check for >>>regressions. >> >>Hmm, there are some checkpatch warnings about author / SOB email >>mismatch, > >With those fixed, this patch is > >Reviewed-by: Thomas Hellstr?m <thomas.hellstrom at linux.intel.com>it actually broke drm-tip now that this is merged: ../drivers/gpu/drm/xe/xe_bo.c:41:10: error: ?struct ttm_placement? has no member named ?num_busy_placement?; did you mean ?num_placement? 41 | .num_busy_placement = 1, | ^~~~~~~~~~~~~~~~~~ | num_placement ../drivers/gpu/drm/xe/xe_bo.c:41:31: error: excess elements in struct initializer [-Werror] 41 | .num_busy_placement = 1, | ^ Apparently a conflict with another patch that got applied a few days ago: a201c6ee37d6 ("drm/xe/bo: Evict VRAM to TT rather than to system") Lucas De Marchi> > >> >>But worserthere are some regressions in the dma-buf ktest (it tests >>evicting of a dynamic dma-buf), >> >>https://patchwork.freedesktop.org/series/128873/ >> >>I'll take a look later today or tomorrow. > >These are from the next patch. Will continue the discussion there. > >/Thomas > > >> >>/Thomas >> >> >> >>> >>>/Thomas >>> >>> >>>On 1/12/24 13:51, Christian K?nig wrote: >>>>From: Somalapuram Amaranath <Amaranath.Somalapuram at amd.com> >>>> >>>>Instead of a list of separate busy placement add flags which indicate >>>>that a placement should only be used when there is room or if we >>>>need to >>>>evict. >>>> >>>>v2: add missing TTM_PL_FLAG_IDLE for i915 >>>>v3: fix auto build test ERROR on drm-tip/drm-tip >>>>v4: fix some typos pointed out by checkpatch >>>>v5: cleanup some rebase problems with VMWGFX >>>>v6: implement some missing VMWGFX functionality pointed out by Zack, >>>>???? rename the flags as suggested by Michel, rebase on drm-tip and >>>>???? adjust XE as well >>>> >>>>Signed-off-by: Christian K?nig <christian.koenig at amd.com> >>>>Signed-off-by: Somalapuram Amaranath <Amaranath.Somalapuram at amd.com> >>>>--- >>>>? drivers/gpu/drm/amd/amdgpu/amdgpu_object.c |? 6 +- >>>>? drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c??? | 11 +--- >>>>? drivers/gpu/drm/drm_gem_vram_helper.c????? |? 2 - >>>>? drivers/gpu/drm/i915/gem/i915_gem_ttm.c??? | 37 +++++------ >>>>? drivers/gpu/drm/loongson/lsdc_ttm.c??????? |? 2 - >>>>? drivers/gpu/drm/nouveau/nouveau_bo.c?????? | 59 +++++++---------- >>>>? drivers/gpu/drm/nouveau/nouveau_bo.h?????? |? 1 - >>>>? drivers/gpu/drm/qxl/qxl_object.c?????????? |? 2 - >>>>? drivers/gpu/drm/qxl/qxl_ttm.c????????????? |? 2 - >>>>? drivers/gpu/drm/radeon/radeon_object.c???? |? 2 - >>>>? drivers/gpu/drm/radeon/radeon_ttm.c??????? |? 8 +-- >>>>? drivers/gpu/drm/radeon/radeon_uvd.c??????? |? 1 - >>>>? drivers/gpu/drm/ttm/ttm_bo.c?????????????? | 21 ++++--- >>>>? drivers/gpu/drm/ttm/ttm_resource.c???????? | 73 >>>>+++++----------------- >>>>? drivers/gpu/drm/vmwgfx/vmwgfx_bo.c???????? | 33 +++++++--- >>>>? drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c |? 4 -- >>>>? drivers/gpu/drm/xe/xe_bo.c???????????????? | 33 +++++----- >>>>? include/drm/ttm/ttm_placement.h??????????? | 10 +-- >>>>? include/drm/ttm/ttm_resource.h???????????? |? 8 +-- >>>>? 19 files changed, 118 insertions(+), 197 deletions(-) >>>> >>>>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>>>b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>>>index 425cebcc5cbf..b671b0665492 100644 >>>>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>>>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c >>>>@@ -220,9 +220,6 @@ void amdgpu_bo_placement_from_domain(struct >>>>amdgpu_bo *abo, u32 domain) >>>>? ????? placement->num_placement = c; >>>>????? placement->placement = places; >>>>- >>>>-??? placement->num_busy_placement = c; >>>>-??? placement->busy_placement = places; >>>>? } >>>>? ? /** >>>>@@ -1397,8 +1394,7 @@ vm_fault_t >>>>amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) >>>>????????????????????? AMDGPU_GEM_DOMAIN_GTT); >>>>? ????? /* Avoid costly evictions; only set GTT as a busy placement */ >>>>-??? abo->placement.num_busy_placement = 1; >>>>-??? abo->placement.busy_placement = &abo->placements[1]; >>>>+??? abo->placements[0].flags |= TTM_PL_FLAG_DESIRED; >>>>? ????? r = ttm_bo_validate(bo, &abo->placement, &ctx); >>>>????? if (unlikely(r == -EBUSY || r == -ERESTARTSYS)) >>>>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>>>b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>>>index 75c9fd2c6c2a..8722beba494e 100644 >>>>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>>>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c >>>>@@ -102,23 +102,19 @@ static void amdgpu_evict_flags(struct >>>>ttm_buffer_object *bo, >>>>????? /* Don't handle scatter gather BOs */ >>>>????? if (bo->type == ttm_bo_type_sg) { >>>>????????? placement->num_placement = 0; >>>>-??????? placement->num_busy_placement = 0; >>>>????????? return; >>>>????? } >>>>? ????? /* Object isn't an AMDGPU object so ignore */ >>>>????? if (!amdgpu_bo_is_amdgpu_bo(bo)) { >>>>????????? placement->placement = &placements; >>>>-??????? placement->busy_placement = &placements; >>>>????????? placement->num_placement = 1; >>>>-??????? placement->num_busy_placement = 1; >>>>????????? return; >>>>????? } >>>>? ????? abo = ttm_to_amdgpu_bo(bo); >>>>????? if (abo->flags & AMDGPU_GEM_CREATE_DISCARDABLE) { >>>>????????? placement->num_placement = 0; >>>>-??????? placement->num_busy_placement = 0; >>>>????????? return; >>>>????? } >>>>? @@ -128,13 +124,13 @@ static void amdgpu_evict_flags(struct >>>>ttm_buffer_object *bo, >>>>????? case AMDGPU_PL_OA: >>>>????? case AMDGPU_PL_DOORBELL: >>>>????????? placement->num_placement = 0; >>>>-??????? placement->num_busy_placement = 0; >>>>????????? return; >>>>? ????? case TTM_PL_VRAM: >>>>????????? if (!adev->mman.buffer_funcs_enabled) { >>>>????????????? /* Move to system memory */ >>>>????????????? amdgpu_bo_placement_from_domain(abo, >>>>AMDGPU_GEM_DOMAIN_CPU); >>>>+ >>>>????????? } else if (!amdgpu_gmc_vram_full_visible(&adev->gmc) && >>>>???????????????? !(abo->flags & >>>>AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) && >>>>???????????????? amdgpu_bo_in_cpu_visible_vram(abo)) { >>>>@@ -149,8 +145,7 @@ static void amdgpu_evict_flags(struct >>>>ttm_buffer_object *bo, >>>>????????????????????????????? AMDGPU_GEM_DOMAIN_CPU); >>>>????????????? abo->placements[0].fpfn = >>>>adev->gmc.visible_vram_size >> PAGE_SHIFT; >>>>????????????? abo->placements[0].lpfn = 0; >>>>-??????????? abo->placement.busy_placement = &abo->placements[1]; >>>>-??????????? abo->placement.num_busy_placement = 1; >>>>+??????????? abo->placements[0].flags |= TTM_PL_FLAG_DESIRED; >>>>????????? } else { >>>>????????????? /* Move to GTT memory */ >>>>????????????? amdgpu_bo_placement_from_domain(abo, >>>>AMDGPU_GEM_DOMAIN_GTT | >>>>@@ -966,8 +961,6 @@ int amdgpu_ttm_alloc_gart(struct >>>>ttm_buffer_object *bo) >>>>????? /* allocate GART space */ >>>>????? placement.num_placement = 1; >>>>????? placement.placement = &placements; >>>>-??? placement.num_busy_placement = 1; >>>>-??? placement.busy_placement = &placements; >>>>????? placements.fpfn = 0; >>>>????? placements.lpfn = adev->gmc.gart_size >> PAGE_SHIFT; >>>>????? placements.mem_type = TTM_PL_TT; >>>>diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c >>>>b/drivers/gpu/drm/drm_gem_vram_helper.c >>>>index b67eafa55715..75f2eaf0d5b6 100644 >>>>--- a/drivers/gpu/drm/drm_gem_vram_helper.c >>>>+++ b/drivers/gpu/drm/drm_gem_vram_helper.c >>>>@@ -147,7 +147,6 @@ static void drm_gem_vram_placement(struct >>>>drm_gem_vram_object *gbo, >>>>????????? invariant_flags = TTM_PL_FLAG_TOPDOWN; >>>>? ????? gbo->placement.placement = gbo->placements; >>>>-??? gbo->placement.busy_placement = gbo->placements; >>>>? ????? if (pl_flag & DRM_GEM_VRAM_PL_FLAG_VRAM) { >>>>????????? gbo->placements[c].mem_type = TTM_PL_VRAM; >>>>@@ -160,7 +159,6 @@ static void drm_gem_vram_placement(struct >>>>drm_gem_vram_object *gbo, >>>>????? } >>>>? ????? gbo->placement.num_placement = c; >>>>-??? gbo->placement.num_busy_placement = c; >>>>? ????? for (i = 0; i < c; ++i) { >>>>????????? gbo->placements[i].fpfn = 0; >>>>diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>>>b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>>>index 6b69ef0cdbb4..80c6cafc8887 100644 >>>>--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>>>+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >>>>@@ -65,8 +65,6 @@ static const struct ttm_place sys_placement_flags = { >>>>? static struct ttm_placement i915_sys_placement = { >>>>????? .num_placement = 1, >>>>????? .placement = &sys_placement_flags, >>>>-??? .num_busy_placement = 1, >>>>-??? .busy_placement = &sys_placement_flags, >>>>? }; >>>>? ? /** >>>>@@ -157,32 +155,28 @@ i915_ttm_place_from_region(const struct >>>>intel_memory_region *mr, >>>>? ? static void >>>>? i915_ttm_placement_from_obj(const struct drm_i915_gem_object *obj, >>>>-??????????????? struct ttm_place *requested, >>>>-??????????????? struct ttm_place *busy, >>>>+??????????????? struct ttm_place *places, >>>>????????????????? struct ttm_placement *placement) >>>>? { >>>>????? unsigned int num_allowed = obj->mm.n_placements; >>>>????? unsigned int flags = obj->flags; >>>>????? unsigned int i; >>>>? -??? placement->num_placement = 1; >>>>+??? places[0].flags |= TTM_PL_FLAG_DESIRED; >>>>????? i915_ttm_place_from_region(num_allowed ? obj->mm.placements[0] : >>>>-?????????????????? obj->mm.region, requested, obj->bo_offset, >>>>+?????????????????? obj->mm.region, &places[0], obj->bo_offset, >>>>???????????????????? obj->base.size, flags); >>>>? ????? /* Cache this on object? */ >>>>-??? placement->num_busy_placement = num_allowed; >>>>-??? for (i = 0; i < placement->num_busy_placement; ++i) >>>>-??????? i915_ttm_place_from_region(obj->mm.placements[i], busy + i, >>>>-?????????????????????? obj->bo_offset, obj->base.size, flags); >>>>- >>>>-??? if (num_allowed == 0) { >>>>-??????? *busy = *requested; >>>>-??????? placement->num_busy_placement = 1; >>>>+??? for (i = 0; i < num_allowed; ++i) { >>>>+??????? i915_ttm_place_from_region(obj->mm.placements[i], >>>>+?????????????????????? &places[i + 1], obj->bo_offset, >>>>+?????????????????????? obj->base.size, flags); >>>>+??????? places[i + 1].flags |= TTM_PL_FLAG_FALLBACK; >>>>????? } >>>>? -??? placement->placement = requested; >>>>-??? placement->busy_placement = busy; >>>>+??? placement->num_placement = num_allowed + 1; >>>>+??? placement->placement = places; >>>>? } >>>>? ? static int i915_ttm_tt_shmem_populate(struct ttm_device *bdev, >>>>@@ -789,7 +783,8 @@ static int __i915_ttm_get_pages(struct >>>>drm_i915_gem_object *obj, >>>>????? int ret; >>>>? ????? /* First try only the requested placement. No eviction. */ >>>>-??? real_num_busy = fetch_and_zero(&placement->num_busy_placement); >>>>+??? real_num_busy = placement->num_placement; >>>>+??? placement->num_placement = 1; >>>>????? ret = ttm_bo_validate(bo, placement, &ctx); >>>>????? if (ret) { >>>>????????? ret = i915_ttm_err_to_gem(ret); >>>>@@ -805,7 +800,7 @@ static int __i915_ttm_get_pages(struct >>>>drm_i915_gem_object *obj, >>>>?????????? * If the initial attempt fails, allow all accepted >>>>placements, >>>>?????????? * evicting if necessary. >>>>?????????? */ >>>>-??????? placement->num_busy_placement = real_num_busy; >>>>+??????? placement->num_placement = real_num_busy; >>>>????????? ret = ttm_bo_validate(bo, placement, &ctx); >>>>????????? if (ret) >>>>????????????? return i915_ttm_err_to_gem(ret); >>>>@@ -839,7 +834,7 @@ static int __i915_ttm_get_pages(struct >>>>drm_i915_gem_object *obj, >>>>? ? static int i915_ttm_get_pages(struct drm_i915_gem_object *obj) >>>>? { >>>>-??? struct ttm_place requested, busy[I915_TTM_MAX_PLACEMENTS]; >>>>+??? struct ttm_place places[I915_TTM_MAX_PLACEMENTS + 1]; >>>>????? struct ttm_placement placement; >>>>? ????? /* restricted by sg_alloc_table */ >>>>@@ -849,7 +844,7 @@ static int i915_ttm_get_pages(struct >>>>drm_i915_gem_object *obj) >>>>????? GEM_BUG_ON(obj->mm.n_placements > I915_TTM_MAX_PLACEMENTS); >>>>? ????? /* Move to the requested placement. */ >>>>-??? i915_ttm_placement_from_obj(obj, &requested, busy, &placement); >>>>+??? i915_ttm_placement_from_obj(obj, places, &placement); >>>>? ????? return __i915_ttm_get_pages(obj, &placement); >>>>? } >>>>@@ -879,9 +874,7 @@ static int __i915_ttm_migrate(struct >>>>drm_i915_gem_object *obj, >>>>????? i915_ttm_place_from_region(mr, &requested, obj->bo_offset, >>>>???????????????????? obj->base.size, flags); >>>>????? placement.num_placement = 1; >>>>-??? placement.num_busy_placement = 1; >>>>????? placement.placement = &requested; >>>>-??? placement.busy_placement = &requested; >>>>? ????? ret = __i915_ttm_get_pages(obj, &placement); >>>>????? if (ret) >>>>diff --git a/drivers/gpu/drm/loongson/lsdc_ttm.c >>>>b/drivers/gpu/drm/loongson/lsdc_ttm.c >>>>index bf79dc55afa4..465f622ac05d 100644 >>>>--- a/drivers/gpu/drm/loongson/lsdc_ttm.c >>>>+++ b/drivers/gpu/drm/loongson/lsdc_ttm.c >>>>@@ -54,7 +54,6 @@ static void lsdc_bo_set_placement(struct >>>>lsdc_bo *lbo, u32 domain) >>>>????????? pflags |= TTM_PL_FLAG_TOPDOWN; >>>>? ????? lbo->placement.placement = lbo->placements; >>>>-??? lbo->placement.busy_placement = lbo->placements; >>>>? ????? if (domain & LSDC_GEM_DOMAIN_VRAM) { >>>>????????? lbo->placements[c].mem_type = TTM_PL_VRAM; >>>>@@ -77,7 +76,6 @@ static void lsdc_bo_set_placement(struct >>>>lsdc_bo *lbo, u32 domain) >>>>????? } >>>>? ????? lbo->placement.num_placement = c; >>>>-??? lbo->placement.num_busy_placement = c; >>>>? ????? for (i = 0; i < c; ++i) { >>>>????????? lbo->placements[i].fpfn = 0; >>>>diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c >>>>b/drivers/gpu/drm/nouveau/nouveau_bo.c >>>>index 00cc7d1abaa3..56dcd25db1ce 100644 >>>>--- a/drivers/gpu/drm/nouveau/nouveau_bo.c >>>>+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c >>>>@@ -404,27 +404,6 @@ nouveau_bo_new(struct nouveau_cli *cli, u64 >>>>size, int align, >>>>????? return 0; >>>>? } >>>>? -static void >>>>-set_placement_list(struct ttm_place *pl, unsigned *n, uint32_t domain) >>>>-{ >>>>-??? *n = 0; >>>>- >>>>-??? if (domain & NOUVEAU_GEM_DOMAIN_VRAM) { >>>>-??????? pl[*n].mem_type = TTM_PL_VRAM; >>>>-??????? pl[*n].flags = 0; >>>>-??????? (*n)++; >>>>-??? } >>>>-??? if (domain & NOUVEAU_GEM_DOMAIN_GART) { >>>>-??????? pl[*n].mem_type = TTM_PL_TT; >>>>-??????? pl[*n].flags = 0; >>>>-??????? (*n)++; >>>>-??? } >>>>-??? if (domain & NOUVEAU_GEM_DOMAIN_CPU) { >>>>-??????? pl[*n].mem_type = TTM_PL_SYSTEM; >>>>-??????? pl[(*n)++].flags = 0; >>>>-??? } >>>>-} >>>>- >>>>? static void >>>>? set_placement_range(struct nouveau_bo *nvbo, uint32_t domain) >>>>? { >>>>@@ -452,10 +431,6 @@ set_placement_range(struct nouveau_bo >>>>*nvbo, uint32_t domain) >>>>????????????? nvbo->placements[i].fpfn = fpfn; >>>>????????????? nvbo->placements[i].lpfn = lpfn; >>>>????????? } >>>>-??????? for (i = 0; i < nvbo->placement.num_busy_placement; ++i) { >>>>-??????????? nvbo->busy_placements[i].fpfn = fpfn; >>>>-??????????? nvbo->busy_placements[i].lpfn = lpfn; >>>>-??????? } >>>>????? } >>>>? } >>>>? @@ -463,15 +438,32 @@ void >>>>? nouveau_bo_placement_set(struct nouveau_bo *nvbo, uint32_t domain, >>>>?????????????? uint32_t busy) >>>>? { >>>>-??? struct ttm_placement *pl = &nvbo->placement; >>>>+??? unsigned int *n = &nvbo->placement.num_placement; >>>>+??? struct ttm_place *pl = nvbo->placements; >>>>? -??? pl->placement = nvbo->placements; >>>>-??? set_placement_list(nvbo->placements, &pl->num_placement, domain); >>>>+??? domain |= busy; >>>>? -??? pl->busy_placement = nvbo->busy_placements; >>>>-??? set_placement_list(nvbo->busy_placements, &pl->num_busy_placement, >>>>-?????????????? domain | busy); >>>>+??? *n = 0; >>>>+??? if (domain & NOUVEAU_GEM_DOMAIN_VRAM) { >>>>+??????? pl[*n].mem_type = TTM_PL_VRAM; >>>>+??????? pl[*n].flags = busy & NOUVEAU_GEM_DOMAIN_VRAM ? >>>>+??????????? TTM_PL_FLAG_FALLBACK : 0; >>>>+??????? (*n)++; >>>>+??? } >>>>+??? if (domain & NOUVEAU_GEM_DOMAIN_GART) { >>>>+??????? pl[*n].mem_type = TTM_PL_TT; >>>>+??????? pl[*n].flags = busy & NOUVEAU_GEM_DOMAIN_GART ? >>>>+??????????? TTM_PL_FLAG_FALLBACK : 0; >>>>+??????? (*n)++; >>>>+??? } >>>>+??? if (domain & NOUVEAU_GEM_DOMAIN_CPU) { >>>>+??????? pl[*n].mem_type = TTM_PL_SYSTEM; >>>>+??????? pl[*n].flags = busy & NOUVEAU_GEM_DOMAIN_CPU ? >>>>+??????????? TTM_PL_FLAG_FALLBACK : 0; >>>>+??????? (*n)++; >>>>+??? } >>>>? +??? nvbo->placement.placement = nvbo->placements; >>>>????? set_placement_range(nvbo, domain); >>>>? } >>>>? @@ -1314,11 +1306,6 @@ vm_fault_t >>>>nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo) >>>>????????????? nvbo->placements[i].lpfn = mappable; >>>>????????? } >>>>? -??????? for (i = 0; i < nvbo->placement.num_busy_placement; ++i) { >>>>-??????????? nvbo->busy_placements[i].fpfn = 0; >>>>-??????????? nvbo->busy_placements[i].lpfn = mappable; >>>>-??????? } >>>>- >>>>????????? nouveau_bo_placement_set(nvbo, NOUVEAU_GEM_DOMAIN_VRAM, 0); >>>>????? } >>>>? diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.h >>>>b/drivers/gpu/drm/nouveau/nouveau_bo.h >>>>index 70c551921a9e..e9dfab6a8156 100644 >>>>--- a/drivers/gpu/drm/nouveau/nouveau_bo.h >>>>+++ b/drivers/gpu/drm/nouveau/nouveau_bo.h >>>>@@ -15,7 +15,6 @@ struct nouveau_bo { >>>>????? struct ttm_placement placement; >>>>????? u32 valid_domains; >>>>????? struct ttm_place placements[3]; >>>>-??? struct ttm_place busy_placements[3]; >>>>????? bool force_coherent; >>>>????? struct ttm_bo_kmap_obj kmap; >>>>????? struct list_head head; >>>>diff --git a/drivers/gpu/drm/qxl/qxl_object.c >>>>b/drivers/gpu/drm/qxl/qxl_object.c >>>>index 06a58dad5f5c..1e46b0a6e478 100644 >>>>--- a/drivers/gpu/drm/qxl/qxl_object.c >>>>+++ b/drivers/gpu/drm/qxl/qxl_object.c >>>>@@ -66,7 +66,6 @@ void qxl_ttm_placement_from_domain(struct >>>>qxl_bo *qbo, u32 domain) >>>>????????? pflag |= TTM_PL_FLAG_TOPDOWN; >>>>? ????? qbo->placement.placement = qbo->placements; >>>>-??? qbo->placement.busy_placement = qbo->placements; >>>>????? if (domain == QXL_GEM_DOMAIN_VRAM) { >>>>????????? qbo->placements[c].mem_type = TTM_PL_VRAM; >>>>????????? qbo->placements[c++].flags = pflag; >>>>@@ -86,7 +85,6 @@ void qxl_ttm_placement_from_domain(struct >>>>qxl_bo *qbo, u32 domain) >>>>????????? qbo->placements[c++].flags = 0; >>>>????? } >>>>????? qbo->placement.num_placement = c; >>>>-??? qbo->placement.num_busy_placement = c; >>>>????? for (i = 0; i < c; ++i) { >>>>????????? qbo->placements[i].fpfn = 0; >>>>????????? qbo->placements[i].lpfn = 0; >>>>diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c >>>>b/drivers/gpu/drm/qxl/qxl_ttm.c >>>>index 1a82629bce3f..765a144cea14 100644 >>>>--- a/drivers/gpu/drm/qxl/qxl_ttm.c >>>>+++ b/drivers/gpu/drm/qxl/qxl_ttm.c >>>>@@ -60,9 +60,7 @@ static void qxl_evict_flags(struct >>>>ttm_buffer_object *bo, >>>>? ????? if (!qxl_ttm_bo_is_qxl_bo(bo)) { >>>>????????? placement->placement = &placements; >>>>-??????? placement->busy_placement = &placements; >>>>????????? placement->num_placement = 1; >>>>-??????? placement->num_busy_placement = 1; >>>>????????? return; >>>>????? } >>>>????? qbo = to_qxl_bo(bo); >>>>diff --git a/drivers/gpu/drm/radeon/radeon_object.c >>>>b/drivers/gpu/drm/radeon/radeon_object.c >>>>index 10c0fbd9d2b4..a955f8a2f7fe 100644 >>>>--- a/drivers/gpu/drm/radeon/radeon_object.c >>>>+++ b/drivers/gpu/drm/radeon/radeon_object.c >>>>@@ -78,7 +78,6 @@ void radeon_ttm_placement_from_domain(struct >>>>radeon_bo *rbo, u32 domain) >>>>????? u32 c = 0, i; >>>>? ????? rbo->placement.placement = rbo->placements; >>>>-??? rbo->placement.busy_placement = rbo->placements; >>>>????? if (domain & RADEON_GEM_DOMAIN_VRAM) { >>>>????????? /* Try placing BOs which don't need CPU access outside of the >>>>?????????? * CPU accessible part of VRAM >>>>@@ -114,7 +113,6 @@ void radeon_ttm_placement_from_domain(struct >>>>radeon_bo *rbo, u32 domain) >>>>????? } >>>>? ????? rbo->placement.num_placement = c; >>>>-??? rbo->placement.num_busy_placement = c; >>>>? ????? for (i = 0; i < c; ++i) { >>>>????????? if ((rbo->flags & RADEON_GEM_CPU_ACCESS) && >>>>diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c >>>>b/drivers/gpu/drm/radeon/radeon_ttm.c >>>>index de4e6d78f1e1..2078b0000e22 100644 >>>>--- a/drivers/gpu/drm/radeon/radeon_ttm.c >>>>+++ b/drivers/gpu/drm/radeon/radeon_ttm.c >>>>@@ -92,9 +92,7 @@ static void radeon_evict_flags(struct >>>>ttm_buffer_object *bo, >>>>? ????? if (!radeon_ttm_bo_is_radeon_bo(bo)) { >>>>????????? placement->placement = &placements; >>>>-??????? placement->busy_placement = &placements; >>>>????????? placement->num_placement = 1; >>>>-??????? placement->num_busy_placement = 1; >>>>????????? return; >>>>????? } >>>>????? rbo = container_of(bo, struct radeon_bo, tbo); >>>>@@ -114,15 +112,11 @@ static void radeon_evict_flags(struct >>>>ttm_buffer_object *bo, >>>>?????????????? */ >>>>????????????? radeon_ttm_placement_from_domain(rbo, >>>>RADEON_GEM_DOMAIN_VRAM | >>>>?????????????????????????????? RADEON_GEM_DOMAIN_GTT); >>>>-??????????? rbo->placement.num_busy_placement = 0; >>>>????????????? for (i = 0; i < rbo->placement.num_placement; i++) { >>>>????????????????? if (rbo->placements[i].mem_type == TTM_PL_VRAM) { >>>>????????????????????? if (rbo->placements[i].fpfn < fpfn) >>>>????????????????????????? rbo->placements[i].fpfn = fpfn; >>>>-??????????????? } else { >>>>-??????????????????? rbo->placement.busy_placement >>>>-??????????????????????? &rbo->placements[i]; >>>>-??????????????????? rbo->placement.num_busy_placement = 1; >>>>+??????????????????? rbo->placements[0].flags |= TTM_PL_FLAG_DESIRED; >>>>????????????????? } >>>>????????????? } >>>>????????? } else >>>>diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c >>>>b/drivers/gpu/drm/radeon/radeon_uvd.c >>>>index a2cda184b2b2..058a1c8451b2 100644 >>>>--- a/drivers/gpu/drm/radeon/radeon_uvd.c >>>>+++ b/drivers/gpu/drm/radeon/radeon_uvd.c >>>>@@ -324,7 +324,6 @@ void >>>>radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo, >>>>????? rbo->placements[1].fpfn += (256 * 1024 * 1024) >> PAGE_SHIFT; >>>>????? rbo->placements[1].lpfn += (256 * 1024 * 1024) >> PAGE_SHIFT; >>>>????? rbo->placement.num_placement++; >>>>-??? rbo->placement.num_busy_placement++; >>>>? } >>>>? ? void radeon_uvd_free_handles(struct radeon_device *rdev, >>>>struct drm_file *filp) >>>>diff --git a/drivers/gpu/drm/ttm/ttm_bo.c >>>>b/drivers/gpu/drm/ttm/ttm_bo.c >>>>index 8c1eaa74fa21..a5e11a92e0b9 100644 >>>>--- a/drivers/gpu/drm/ttm/ttm_bo.c >>>>+++ b/drivers/gpu/drm/ttm/ttm_bo.c >>>>@@ -410,8 +410,8 @@ static int ttm_bo_bounce_temp_buffer(struct >>>>ttm_buffer_object *bo, >>>>????? struct ttm_resource *hop_mem; >>>>????? int ret; >>>>? -??? hop_placement.num_placement = >>>>hop_placement.num_busy_placement = 1; >>>>-??? hop_placement.placement = hop_placement.busy_placement = hop; >>>>+??? hop_placement.num_placement = 1; >>>>+??? hop_placement.placement = hop; >>>>? ????? /* find space in the bounce domain */ >>>>????? ret = ttm_bo_mem_space(bo, &hop_placement, &hop_mem, ctx); >>>>@@ -440,10 +440,9 @@ static int ttm_bo_evict(struct >>>>ttm_buffer_object *bo, >>>>????? dma_resv_assert_held(bo->base.resv); >>>>? ????? placement.num_placement = 0; >>>>-??? placement.num_busy_placement = 0; >>>>????? bdev->funcs->evict_flags(bo, &placement); >>>>? -??? if (!placement.num_placement && !placement.num_busy_placement) { >>>>+??? if (!placement.num_placement) { >>>>????????? ret = ttm_bo_wait_ctx(bo, ctx); >>>>????????? if (ret) >>>>????????????? return ret; >>>>@@ -791,6 +790,9 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo, >>>>????????? const struct ttm_place *place = &placement->placement[i]; >>>>????????? struct ttm_resource_manager *man; >>>>? +??????? if (place->flags & TTM_PL_FLAG_FALLBACK) >>>>+??????????? continue; >>>>+ >>>>????????? man = ttm_manager_type(bdev, place->mem_type); >>>>????????? if (!man || !ttm_resource_manager_used(man)) >>>>????????????? continue; >>>>@@ -813,10 +815,13 @@ int ttm_bo_mem_space(struct >>>>ttm_buffer_object *bo, >>>>????????? return 0; >>>>????? } >>>>? -??? for (i = 0; i < placement->num_busy_placement; ++i) { >>>>-??????? const struct ttm_place *place = &placement->busy_placement[i]; >>>>+??? for (i = 0; i < placement->num_placement; ++i) { >>>>+??????? const struct ttm_place *place = &placement->placement[i]; >>>>????????? struct ttm_resource_manager *man; >>>>? +??????? if (place->flags & TTM_PL_FLAG_DESIRED) >>>>+??????????? continue; >>>>+ >>>>????????? man = ttm_manager_type(bdev, place->mem_type); >>>>????????? if (!man || !ttm_resource_manager_used(man)) >>>>????????????? continue; >>>>@@ -904,11 +909,11 @@ int ttm_bo_validate(struct ttm_buffer_object *bo, >>>>????? /* >>>>?????? * Remove the backing store if no placement is given. >>>>?????? */ >>>>-??? if (!placement->num_placement && !placement->num_busy_placement) >>>>+??? if (!placement->num_placement) >>>>????????? return ttm_bo_pipeline_gutting(bo); >>>>? ????? /* Check whether we need to move buffer. */ >>>>-??? if (bo->resource && ttm_resource_compat(bo->resource, placement)) >>>>+??? if (bo->resource && ttm_resource_compatible(bo->resource, >>>>placement)) >>>>????????? return 0; >>>>? ????? /* Moving of pinned BOs is forbidden */ >>>>diff --git a/drivers/gpu/drm/ttm/ttm_resource.c >>>>b/drivers/gpu/drm/ttm/ttm_resource.c >>>>index 02b96d23fdb9..fb14f7716cf8 100644 >>>>--- a/drivers/gpu/drm/ttm/ttm_resource.c >>>>+++ b/drivers/gpu/drm/ttm/ttm_resource.c >>>>@@ -291,37 +291,15 @@ bool ttm_resource_intersects(struct >>>>ttm_device *bdev, >>>>? } >>>>? ? /** >>>>- * ttm_resource_compatible - test for compatibility >>>>+ * ttm_resource_compatible - check if resource is compatible >>>>with placement >>>>?? * >>>>- * @bdev: TTM device structure >>>>- * @res: The resource to test >>>>- * @place: The placement to test >>>>- * @size: How many bytes the new allocation needs. >>>>- * >>>>- * Test if @res compatible with @place and @size. >>>>+ * @res: the resource to check >>>>+ * @placement: the placement to check against >>>>?? * >>>>- * Returns true if the res placement compatible with @place and @size. >>>>+ * Returns true if the placement is compatible. >>>>?? */ >>>>-bool ttm_resource_compatible(struct ttm_device *bdev, >>>>-???????????????? struct ttm_resource *res, >>>>-???????????????? const struct ttm_place *place, >>>>-???????????????? size_t size) >>>>-{ >>>>-??? struct ttm_resource_manager *man; >>>>- >>>>-??? if (!res || !place) >>>>-??????? return false; >>>>- >>>>-??? man = ttm_manager_type(bdev, res->mem_type); >>>>-??? if (!man->func->compatible) >>>>-??????? return true; >>>>- >>>>-??? return man->func->compatible(man, res, place, size); >>>>-} >>>>- >>>>-static bool ttm_resource_places_compat(struct ttm_resource *res, >>>>-?????????????????????? const struct ttm_place *places, >>>>-?????????????????????? unsigned num_placement) >>>>+bool ttm_resource_compatible(struct ttm_resource *res, >>>>+???????????????? struct ttm_placement *placement) >>>>? { >>>>????? struct ttm_buffer_object *bo = res->bo; >>>>????? struct ttm_device *bdev = bo->bdev; >>>>@@ -330,44 +308,25 @@ static bool >>>>ttm_resource_places_compat(struct ttm_resource *res, >>>>????? if (res->placement & TTM_PL_FLAG_TEMPORARY) >>>>????????? return false; >>>>? -??? for (i = 0; i < num_placement; i++) { >>>>-??????? const struct ttm_place *heap = &places[i]; >>>>+??? for (i = 0; i < placement->num_placement; i++) { >>>>+??????? const struct ttm_place *place = &placement->placement[i]; >>>>+??????? struct ttm_resource_manager *man; >>>>? -??????? if (!ttm_resource_compatible(bdev, res, heap, >>>>bo->base.size)) >>>>+??????? if (res->mem_type != place->mem_type) >>>>+??????????? continue; >>>>+ >>>>+??????? man = ttm_manager_type(bdev, res->mem_type); >>>>+??????? if (man->func->compatible && >>>>+??????????? !man->func->compatible(man, res, place, bo->base.size)) >>>>????????????? continue; >>>>? -??????? if ((res->mem_type == heap->mem_type) && >>>>-??????????? (!(heap->flags & TTM_PL_FLAG_CONTIGUOUS) || >>>>+??????? if ((!(place->flags & TTM_PL_FLAG_CONTIGUOUS) || >>>>?????????????? (res->placement & TTM_PL_FLAG_CONTIGUOUS))) >>>>????????????? return true; >>>>????? } >>>>????? return false; >>>>? } >>>>? -/** >>>>- * ttm_resource_compat - check if resource is compatible with >>>>placement >>>>- * >>>>- * @res: the resource to check >>>>- * @placement: the placement to check against >>>>- * >>>>- * Returns true if the placement is compatible. >>>>- */ >>>>-bool ttm_resource_compat(struct ttm_resource *res, >>>>-???????????? struct ttm_placement *placement) >>>>-{ >>>>-??? if (ttm_resource_places_compat(res, placement->placement, >>>>-?????????????????????? placement->num_placement)) >>>>-??????? return true; >>>>- >>>>-??? if ((placement->busy_placement != placement->placement || >>>>-???????? placement->num_busy_placement > placement->num_placement) && >>>>-??????? ttm_resource_places_compat(res, placement->busy_placement, >>>>-?????????????????????? placement->num_busy_placement)) >>>>-??????? return true; >>>>- >>>>-??? return false; >>>>-} >>>>- >>>>? void ttm_resource_set_bo(struct ttm_resource *res, >>>>?????????????? struct ttm_buffer_object *bo) >>>>? { >>>>diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >>>>b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >>>>index 2bfac3aad7b7..bfd41ce3c8f4 100644 >>>>--- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >>>>+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c >>>>@@ -742,9 +742,21 @@ void vmw_bo_move_notify(struct >>>>ttm_buffer_object *bo, >>>>????????? vmw_resource_unbind_list(vbo); >>>>? } >>>>? +static u32 placement_flags(u32 domain, u32 desired, u32 fallback) >>>>+{ >>>>+??? if (desired & fallback & domain) >>>>+??????? return 0; >>>>+ >>>>+??? if (desired & domain) >>>>+??????? return TTM_PL_FLAG_DESIRED; >>>>+ >>>>+??? return TTM_PL_FLAG_FALLBACK; >>>>+} >>>>+ >>>>? static u32 >>>>-set_placement_list(struct ttm_place *pl, u32 domain) >>>>+set_placement_list(struct ttm_place *pl, u32 desired, u32 fallback) >>>>? { >>>>+??? u32 domain = desired | fallback; >>>>????? u32 n = 0; >>>>? ????? /* >>>>@@ -752,35 +764,40 @@ set_placement_list(struct ttm_place *pl, >>>>u32 domain) >>>>?????? */ >>>>????? if (domain & VMW_BO_DOMAIN_MOB) { >>>>????????? pl[n].mem_type = VMW_PL_MOB; >>>>-??????? pl[n].flags = 0; >>>>+??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_MOB, desired, >>>>+????????????????????????? fallback); >>>>????????? pl[n].fpfn = 0; >>>>????????? pl[n].lpfn = 0; >>>>????????? n++; >>>>????? } >>>>????? if (domain & VMW_BO_DOMAIN_GMR) { >>>>????????? pl[n].mem_type = VMW_PL_GMR; >>>>-??????? pl[n].flags = 0; >>>>+??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_GMR, desired, >>>>+????????????????????????? fallback); >>>>????????? pl[n].fpfn = 0; >>>>????????? pl[n].lpfn = 0; >>>>????????? n++; >>>>????? } >>>>????? if (domain & VMW_BO_DOMAIN_VRAM) { >>>>????????? pl[n].mem_type = TTM_PL_VRAM; >>>>-??????? pl[n].flags = 0; >>>>+??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_VRAM, desired, >>>>+????????????????????????? fallback); >>>>????????? pl[n].fpfn = 0; >>>>????????? pl[n].lpfn = 0; >>>>????????? n++; >>>>????? } >>>>????? if (domain & VMW_BO_DOMAIN_WAITABLE_SYS) { >>>>????????? pl[n].mem_type = VMW_PL_SYSTEM; >>>>-??????? pl[n].flags = 0; >>>>+??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_WAITABLE_SYS, >>>>+????????????????????????? desired, fallback); >>>>????????? pl[n].fpfn = 0; >>>>????????? pl[n].lpfn = 0; >>>>????????? n++; >>>>????? } >>>>????? if (domain & VMW_BO_DOMAIN_SYS) { >>>>????????? pl[n].mem_type = TTM_PL_SYSTEM; >>>>-??????? pl[n].flags = 0; >>>>+??????? pl[n].flags = placement_flags(VMW_BO_DOMAIN_SYS, desired, >>>>+????????????????????????? fallback); >>>>????????? pl[n].fpfn = 0; >>>>????????? pl[n].lpfn = 0; >>>>????????? n++; >>>>@@ -806,7 +823,7 @@ void vmw_bo_placement_set(struct vmw_bo *bo, >>>>u32 domain, u32 busy_domain) >>>>????? u32 i; >>>>? ????? pl->placement = bo->places; >>>>-??? pl->num_placement = set_placement_list(bo->places, domain); >>>>+??? pl->num_placement = set_placement_list(bo->places, domain, >>>>busy_domain); >>>>? ????? if (drm_debug_enabled(DRM_UT_DRIVER) && bo->tbo.resource) { >>>>????????? for (i = 0; i < pl->num_placement; ++i) { >>>>@@ -821,8 +838,6 @@ void vmw_bo_placement_set(struct vmw_bo *bo, >>>>u32 domain, u32 busy_domain) >>>>?????????????????? __func__, bo->tbo.resource->mem_type, domain); >>>>????? } >>>>? -??? pl->busy_placement = bo->busy_places; >>>>-??? pl->num_busy_placement = >>>>set_placement_list(bo->busy_places, busy_domain); >>>>? } >>>>? ? void vmw_bo_placement_set_default_accelerated(struct vmw_bo *bo) >>>>diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >>>>b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >>>>index a84fffcef8e1..4d23d0a70bcb 100644 >>>>--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >>>>+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c >>>>@@ -46,15 +46,11 @@ static const struct ttm_place >>>>sys_placement_flags = { >>>>? struct ttm_placement vmw_vram_placement = { >>>>????? .num_placement = 1, >>>>????? .placement = &vram_placement_flags, >>>>-??? .num_busy_placement = 1, >>>>-??? .busy_placement = &vram_placement_flags >>>>? }; >>>>? ? struct ttm_placement vmw_sys_placement = { >>>>????? .num_placement = 1, >>>>????? .placement = &sys_placement_flags, >>>>-??? .num_busy_placement = 1, >>>>-??? .busy_placement = &sys_placement_flags >>>>? }; >>>>? ? const size_t vmw_tt_size = sizeof(struct vmw_ttm_tt); >>>>diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c >>>>index 8e4a3b1f6b93..1e5edc7f0b85 100644 >>>>--- a/drivers/gpu/drm/xe/xe_bo.c >>>>+++ b/drivers/gpu/drm/xe/xe_bo.c >>>>@@ -38,22 +38,26 @@ static const struct ttm_place >>>>sys_placement_flags = { >>>>? static struct ttm_placement sys_placement = { >>>>????? .num_placement = 1, >>>>????? .placement = &sys_placement_flags, >>>>-??? .num_busy_placement = 1, >>>>-??? .busy_placement = &sys_placement_flags, >>>>? }; >>>>? -static const struct ttm_place tt_placement_flags = { >>>>-??? .fpfn = 0, >>>>-??? .lpfn = 0, >>>>-??? .mem_type = XE_PL_TT, >>>>-??? .flags = 0, >>>>+static const struct ttm_place tt_placement_flags[] = { >>>>+??? { >>>>+??????? .fpfn = 0, >>>>+??????? .lpfn = 0, >>>>+??????? .mem_type = XE_PL_TT, >>>>+??????? .flags = TTM_PL_FLAG_DESIRED, >>>>+??? }, >>>>+??? { >>>>+??????? .fpfn = 0, >>>>+??????? .lpfn = 0, >>>>+??????? .mem_type = XE_PL_SYSTEM, >>>>+??????? .flags = TTM_PL_FLAG_FALLBACK, >>>>+??? } >>>>? }; >>>>? ? static struct ttm_placement tt_placement = { >>>>-??? .num_placement = 1, >>>>-??? .placement = &tt_placement_flags, >>>>-??? .num_busy_placement = 1, >>>>-??? .busy_placement = &sys_placement_flags, >>>>+??? .num_placement = 2, >>>>+??? .placement = tt_placement_flags, >>>>? }; >>>>? ? bool mem_type_is_vram(u32 mem_type) >>>>@@ -230,8 +234,6 @@ static int >>>>__xe_bo_placement_for_flags(struct xe_device *xe, struct xe_bo >>>>*bo, >>>>????? bo->placement = (struct ttm_placement) { >>>>????????? .num_placement = c, >>>>????????? .placement = bo->placements, >>>>-??????? .num_busy_placement = c, >>>>-??????? .busy_placement = bo->placements, >>>>????? }; >>>>? ????? return 0; >>>>@@ -251,7 +253,6 @@ static void xe_evict_flags(struct >>>>ttm_buffer_object *tbo, >>>>????????? /* Don't handle scatter gather BOs */ >>>>????????? if (tbo->type == ttm_bo_type_sg) { >>>>????????????? placement->num_placement = 0; >>>>-??????????? placement->num_busy_placement = 0; >>>>????????????? return; >>>>????????? } >>>>? @@ -1353,8 +1354,6 @@ static int >>>>__xe_bo_fixed_placement(struct xe_device *xe, >>>>????? bo->placement = (struct ttm_placement) { >>>>????????? .num_placement = 1, >>>>????????? .placement = place, >>>>-??????? .num_busy_placement = 1, >>>>-??????? .busy_placement = place, >>>>????? }; >>>>? ????? return 0; >>>>@@ -2112,9 +2111,7 @@ int xe_bo_migrate(struct xe_bo *bo, u32 mem_type) >>>>? ????? xe_place_from_ttm_type(mem_type, &requested); >>>>????? placement.num_placement = 1; >>>>-??? placement.num_busy_placement = 1; >>>>????? placement.placement = &requested; >>>>-??? placement.busy_placement = &requested; >>>>? ????? /* >>>>?????? * Stolen needs to be handled like below VRAM handling if >>>>we ever need >>>>diff --git a/include/drm/ttm/ttm_placement.h >>>>b/include/drm/ttm/ttm_placement.h >>>>index 8074d0f6cae5..b510a4812609 100644 >>>>--- a/include/drm/ttm/ttm_placement.h >>>>+++ b/include/drm/ttm/ttm_placement.h >>>>@@ -64,6 +64,12 @@ >>>>? /* For multihop handling */ >>>>? #define TTM_PL_FLAG_TEMPORARY?? (1 << 2) >>>>? +/* Placement is never used during eviction */ >>>>+#define TTM_PL_FLAG_DESIRED??? (1 << 3) >>>>+ >>>>+/* Placement is only used during eviction */ >>>>+#define TTM_PL_FLAG_FALLBACK??? (1 << 4) >>>>+ >>>>? /** >>>>?? * struct ttm_place >>>>?? * >>>>@@ -86,16 +92,12 @@ struct ttm_place { >>>>?? * >>>>?? * @num_placement:??? number of preferred placements >>>>?? * @placement:??????? preferred placements >>>>- * @num_busy_placement:??? number of preferred placements when >>>>need to evict buffer >>>>- * @busy_placement:??? preferred placements when need to evict buffer >>>>?? * >>>>?? * Structure indicating the placement you request for an object. >>>>?? */ >>>>? struct ttm_placement { >>>>????? unsigned??????? num_placement; >>>>????? const struct ttm_place??? *placement; >>>>-??? unsigned??????? num_busy_placement; >>>>-??? const struct ttm_place??? *busy_placement; >>>>? }; >>>>? ? #endif >>>>diff --git a/include/drm/ttm/ttm_resource.h >>>>b/include/drm/ttm/ttm_resource.h >>>>index 78a226eba953..1afa13f0c22b 100644 >>>>--- a/include/drm/ttm/ttm_resource.h >>>>+++ b/include/drm/ttm/ttm_resource.h >>>>@@ -365,12 +365,8 @@ bool ttm_resource_intersects(struct >>>>ttm_device *bdev, >>>>?????????????????? struct ttm_resource *res, >>>>?????????????????? const struct ttm_place *place, >>>>?????????????????? size_t size); >>>>-bool ttm_resource_compatible(struct ttm_device *bdev, >>>>-???????????????? struct ttm_resource *res, >>>>-???????????????? const struct ttm_place *place, >>>>-???????????????? size_t size); >>>>-bool ttm_resource_compat(struct ttm_resource *res, >>>>-???????????? struct ttm_placement *placement); >>>>+bool ttm_resource_compatible(struct ttm_resource *res, >>>>+???????????????? struct ttm_placement *placement); >>>>? void ttm_resource_set_bo(struct ttm_resource *res, >>>>?????????????? struct ttm_buffer_object *bo);
Lucas De Marchi
2024-Jan-26 22:23 UTC
[PATCH 3/5] drm/ttm: replace busy placement with flags v6
On Fri, Jan 26, 2024 at 04:16:58PM -0600, Lucas De Marchi wrote:>On Thu, Jan 18, 2024 at 05:38:16PM +0100, Thomas Hellstr?m wrote: >> >>On 1/17/24 13:27, Thomas Hellstr?m wrote: >>> >>>On 1/17/24 11:47, Thomas Hellstr?m wrote: >>>>Hi, Christian >>>> >>>>Xe changes look good. Will send the series to xe ci to check for >>>>regressions. >>> >>>Hmm, there are some checkpatch warnings about author / SOB email >>>mismatch, >> >>With those fixed, this patch is >> >>Reviewed-by: Thomas Hellstr?m <thomas.hellstrom at linux.intel.com> > > >it actually broke drm-tip now that this is merged: > >../drivers/gpu/drm/xe/xe_bo.c:41:10: error: ?struct ttm_placement? has no member named ?num_busy_placement?; did you mean ?num_placement? > 41 | .num_busy_placement = 1, > | ^~~~~~~~~~~~~~~~~~ > | num_placement >../drivers/gpu/drm/xe/xe_bo.c:41:31: error: excess elements in struct initializer [-Werror] > 41 | .num_busy_placement = 1, > | ^ > > >Apparently a conflict with another patch that got applied a few days >ago: a201c6ee37d6 ("drm/xe/bo: Evict VRAM to TT rather than to system")oh, no... apparently that commit is from a long time ago. The problem was that drm-misc-next was not yet in sync with drm-next. Thomas, do you have a fixup for this to put in rerere? Lucas De Marchi