Message ID | 20220804085952.6137-4-Arunpravin.PaneerSelvam@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v4,1/6] drm/ttm: Add new callbacks to ttm res mgr | expand |
On 04/08/2022 09:59, Arunpravin Paneer Selvam wrote: > Implemented a new intersect and compatible callback function > fetching start offset from drm buddy allocator. > > v3: move the bits that are specific to buddy_man (Matthew) > v4: consider the block size /range (Matthew) > > Signed-off-by: Christian König <christian.koenig@amd.com> > Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> > --- > drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 41 +---------- > drivers/gpu/drm/i915/i915_ttm_buddy_manager.c | 73 +++++++++++++++++++ > 2 files changed, 74 insertions(+), 40 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > index 70e2ed4e99df..bf5fd6886ca0 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > @@ -379,7 +379,6 @@ static bool i915_ttm_eviction_valuable(struct ttm_buffer_object *bo, > const struct ttm_place *place) > { > struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); > - struct ttm_resource *res = bo->resource; > > if (!obj) > return false; > @@ -396,45 +395,7 @@ static bool i915_ttm_eviction_valuable(struct ttm_buffer_object *bo, > if (!i915_gem_object_evictable(obj)) > return false; > > - switch (res->mem_type) { > - case I915_PL_LMEM0: { > - struct ttm_resource_manager *man = > - ttm_manager_type(bo->bdev, res->mem_type); > - struct i915_ttm_buddy_resource *bman_res = > - to_ttm_buddy_resource(res); > - struct drm_buddy *mm = bman_res->mm; > - struct drm_buddy_block *block; > - > - if (!place->fpfn && !place->lpfn) > - return true; > - > - GEM_BUG_ON(!place->lpfn); > - > - /* > - * If we just want something mappable then we can quickly check > - * if the current victim resource is using any of the CPU > - * visible portion. > - */ > - if (!place->fpfn && > - place->lpfn == i915_ttm_buddy_man_visible_size(man)) > - return bman_res->used_visible_size > 0; > - > - /* Real range allocation */ > - list_for_each_entry(block, &bman_res->blocks, link) { > - unsigned long fpfn = > - drm_buddy_block_offset(block) >> PAGE_SHIFT; > - unsigned long lpfn = fpfn + > - (drm_buddy_block_size(mm, block) >> PAGE_SHIFT); > - > - if (place->fpfn < lpfn && place->lpfn > fpfn) > - return true; > - } > - return false; > - } default: > - break; > - } > - > - return true; > + return ttm_bo_eviction_valuable(bo, place); > } > > static void i915_ttm_evict_flags(struct ttm_buffer_object *bo, > diff --git a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c > index a5109548abc0..9def01d5f368 100644 > --- a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c > +++ b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c > @@ -178,6 +178,77 @@ static void i915_ttm_buddy_man_free(struct ttm_resource_manager *man, > kfree(bman_res); > } > > +static bool i915_ttm_buddy_man_intersects(struct ttm_resource_manager *man, > + struct ttm_resource *res, > + const struct ttm_place *place, > + size_t size) > +{ > + struct i915_ttm_buddy_resource *bman_res = to_ttm_buddy_resource(res); > + struct i915_ttm_buddy_manager *bman = to_buddy_manager(man); > + struct drm_buddy *mm = &bman->mm; > + struct drm_buddy_block *block; > + > + if (!place->fpfn && !place->lpfn) > + return true; > + > + GEM_BUG_ON(!place->lpfn); > + > + /* > + * If we just want something mappable then we can quickly check > + * if the current victim resource is using any of the CP Nit: s/CP/CPU/ Reviewed-by: Matthew Auld <matthew.auld@intel.com> > + * visible portion. > + */ > + if (!place->fpfn && > + place->lpfn == i915_ttm_buddy_man_visible_size(man)) > + return bman_res->used_visible_size > 0; > + > + /* Check each drm buddy block individually */ > + list_for_each_entry(block, &bman_res->blocks, link) { > + unsigned long fpfn = > + drm_buddy_block_offset(block) >> PAGE_SHIFT; > + unsigned long lpfn = fpfn + > + (drm_buddy_block_size(mm, block) >> PAGE_SHIFT); > + > + if (place->fpfn < lpfn && place->lpfn > fpfn) > + return true; > + } > + > + return false; > +} > + > +static bool i915_ttm_buddy_man_compatible(struct ttm_resource_manager *man, > + struct ttm_resource *res, > + const struct ttm_place *place, > + size_t size) > +{ > + struct i915_ttm_buddy_resource *bman_res = to_ttm_buddy_resource(res); > + struct i915_ttm_buddy_manager *bman = to_buddy_manager(man); > + struct drm_buddy *mm = &bman->mm; > + struct drm_buddy_block *block; > + > + if (!place->fpfn && !place->lpfn) > + return true; > + > + GEM_BUG_ON(!place->lpfn); > + > + if (!place->fpfn && > + place->lpfn == i915_ttm_buddy_man_visible_size(man)) > + return bman_res->used_visible_size == res->num_pages; > + > + /* Check each drm buddy block individually */ > + list_for_each_entry(block, &bman_res->blocks, link) { > + unsigned long fpfn = > + drm_buddy_block_offset(block) >> PAGE_SHIFT; > + unsigned long lpfn = fpfn + > + (drm_buddy_block_size(mm, block) >> PAGE_SHIFT); > + > + if (fpfn < place->fpfn || lpfn > place->lpfn) > + return false; > + } > + > + return true; > +} > + > static void i915_ttm_buddy_man_debug(struct ttm_resource_manager *man, > struct drm_printer *printer) > { > @@ -205,6 +276,8 @@ static void i915_ttm_buddy_man_debug(struct ttm_resource_manager *man, > static const struct ttm_resource_manager_func i915_ttm_buddy_manager_func = { > .alloc = i915_ttm_buddy_man_alloc, > .free = i915_ttm_buddy_man_free, > + .intersects = i915_ttm_buddy_man_intersects, > + .compatible = i915_ttm_buddy_man_compatible, > .debug = i915_ttm_buddy_man_debug, > }; >
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c index 70e2ed4e99df..bf5fd6886ca0 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c @@ -379,7 +379,6 @@ static bool i915_ttm_eviction_valuable(struct ttm_buffer_object *bo, const struct ttm_place *place) { struct drm_i915_gem_object *obj = i915_ttm_to_gem(bo); - struct ttm_resource *res = bo->resource; if (!obj) return false; @@ -396,45 +395,7 @@ static bool i915_ttm_eviction_valuable(struct ttm_buffer_object *bo, if (!i915_gem_object_evictable(obj)) return false; - switch (res->mem_type) { - case I915_PL_LMEM0: { - struct ttm_resource_manager *man = - ttm_manager_type(bo->bdev, res->mem_type); - struct i915_ttm_buddy_resource *bman_res = - to_ttm_buddy_resource(res); - struct drm_buddy *mm = bman_res->mm; - struct drm_buddy_block *block; - - if (!place->fpfn && !place->lpfn) - return true; - - GEM_BUG_ON(!place->lpfn); - - /* - * If we just want something mappable then we can quickly check - * if the current victim resource is using any of the CPU - * visible portion. - */ - if (!place->fpfn && - place->lpfn == i915_ttm_buddy_man_visible_size(man)) - return bman_res->used_visible_size > 0; - - /* Real range allocation */ - list_for_each_entry(block, &bman_res->blocks, link) { - unsigned long fpfn = - drm_buddy_block_offset(block) >> PAGE_SHIFT; - unsigned long lpfn = fpfn + - (drm_buddy_block_size(mm, block) >> PAGE_SHIFT); - - if (place->fpfn < lpfn && place->lpfn > fpfn) - return true; - } - return false; - } default: - break; - } - - return true; + return ttm_bo_eviction_valuable(bo, place); } static void i915_ttm_evict_flags(struct ttm_buffer_object *bo, diff --git a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c index a5109548abc0..9def01d5f368 100644 --- a/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c +++ b/drivers/gpu/drm/i915/i915_ttm_buddy_manager.c @@ -178,6 +178,77 @@ static void i915_ttm_buddy_man_free(struct ttm_resource_manager *man, kfree(bman_res); } +static bool i915_ttm_buddy_man_intersects(struct ttm_resource_manager *man, + struct ttm_resource *res, + const struct ttm_place *place, + size_t size) +{ + struct i915_ttm_buddy_resource *bman_res = to_ttm_buddy_resource(res); + struct i915_ttm_buddy_manager *bman = to_buddy_manager(man); + struct drm_buddy *mm = &bman->mm; + struct drm_buddy_block *block; + + if (!place->fpfn && !place->lpfn) + return true; + + GEM_BUG_ON(!place->lpfn); + + /* + * If we just want something mappable then we can quickly check + * if the current victim resource is using any of the CP + * visible portion. + */ + if (!place->fpfn && + place->lpfn == i915_ttm_buddy_man_visible_size(man)) + return bman_res->used_visible_size > 0; + + /* Check each drm buddy block individually */ + list_for_each_entry(block, &bman_res->blocks, link) { + unsigned long fpfn = + drm_buddy_block_offset(block) >> PAGE_SHIFT; + unsigned long lpfn = fpfn + + (drm_buddy_block_size(mm, block) >> PAGE_SHIFT); + + if (place->fpfn < lpfn && place->lpfn > fpfn) + return true; + } + + return false; +} + +static bool i915_ttm_buddy_man_compatible(struct ttm_resource_manager *man, + struct ttm_resource *res, + const struct ttm_place *place, + size_t size) +{ + struct i915_ttm_buddy_resource *bman_res = to_ttm_buddy_resource(res); + struct i915_ttm_buddy_manager *bman = to_buddy_manager(man); + struct drm_buddy *mm = &bman->mm; + struct drm_buddy_block *block; + + if (!place->fpfn && !place->lpfn) + return true; + + GEM_BUG_ON(!place->lpfn); + + if (!place->fpfn && + place->lpfn == i915_ttm_buddy_man_visible_size(man)) + return bman_res->used_visible_size == res->num_pages; + + /* Check each drm buddy block individually */ + list_for_each_entry(block, &bman_res->blocks, link) { + unsigned long fpfn = + drm_buddy_block_offset(block) >> PAGE_SHIFT; + unsigned long lpfn = fpfn + + (drm_buddy_block_size(mm, block) >> PAGE_SHIFT); + + if (fpfn < place->fpfn || lpfn > place->lpfn) + return false; + } + + return true; +} + static void i915_ttm_buddy_man_debug(struct ttm_resource_manager *man, struct drm_printer *printer) { @@ -205,6 +276,8 @@ static void i915_ttm_buddy_man_debug(struct ttm_resource_manager *man, static const struct ttm_resource_manager_func i915_ttm_buddy_manager_func = { .alloc = i915_ttm_buddy_man_alloc, .free = i915_ttm_buddy_man_free, + .intersects = i915_ttm_buddy_man_intersects, + .compatible = i915_ttm_buddy_man_compatible, .debug = i915_ttm_buddy_man_debug, };