[PATCH 3/5] drm/ttm: replace busy placement with flags v6

Lucas De Marchi lucas.demarchi at intel.com
Fri Jan 26 22:17:24 UTC 2024


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);


More information about the Nouveau mailing list