[Intel-xe] [PATCH v2 6/6] drm/xe/buddy: add compatible and intersects hooks

Gwan-gyeong Mun gwan-gyeong.mun at intel.com
Mon Mar 20 14:15:33 UTC 2023



On 3/8/23 12:17 PM, Matthew Auld wrote:
> Copy this from i915. We need .compatible for lmem -> lmem transfers, so
> they don't just get nooped by ttm, if need to move something from
> mappable to non-mappble or vice versa. The .intersects is needed for
> eviction, to determine if a victim resource is worth eviction. e.g if we
> need mappable space there is no point in evicting a resource that has
> zero mappable pages.
> 
> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
> Reviewed-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
> ---
>   drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 62 ++++++++++++++++++++++++++++
>   1 file changed, 62 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> index f703e962f499..8dd33ac65499 100644
> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
> @@ -230,9 +230,71 @@ static void xe_ttm_vram_mgr_debug(struct ttm_resource_manager *man,
>   	drm_printf(printer, "man size:%llu\n", man->size);
>   }
>   
> +static bool xe_ttm_vram_mgr_intersects(struct ttm_resource_manager *man,
> +				       struct ttm_resource *res,
> +				       const struct ttm_place *place,
> +				       size_t size)
> +{
> +	struct xe_ttm_vram_mgr *mgr = to_xe_ttm_vram_mgr(man);
> +	struct xe_ttm_vram_mgr_resource *vres =
> +		to_xe_ttm_vram_mgr_resource(res);
> +	struct drm_buddy *mm = &mgr->mm;
> +	struct drm_buddy_block *block;
> +
> +	if (!place->fpfn && !place->lpfn)
> +		return true;
> +Hi Matt,
I understand that ttm_resource_intersects() returns true in the 
following case,

if (!place || !man->func->intersects)
		return true;

so this line can handle it like this, but in a real scenario, is it 
possible to have a situation where place->fpfn==0 and place->lpfn==0?

Except for the routine that does the same check in 
xe_ttm_vram_mgr_compatible(), the rest of it looks good.

br,
G.G.
> +	if (!place->fpfn && place->lpfn == mgr->visible_size >> PAGE_SHIFT)
> +		return vres->used_visible_size > 0;
> +
> +	list_for_each_entry(block, &vres->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 xe_ttm_vram_mgr_compatible(struct ttm_resource_manager *man,
> +				       struct ttm_resource *res,
> +				       const struct ttm_place *place,
> +				       size_t size)
> +{
> +	struct xe_ttm_vram_mgr *mgr = to_xe_ttm_vram_mgr(man);
> +	struct xe_ttm_vram_mgr_resource *vres =
> +		to_xe_ttm_vram_mgr_resource(res);
> +	struct drm_buddy *mm = &mgr->mm;
> +	struct drm_buddy_block *block;
> +
> +	if (!place->fpfn && !place->lpfn)
> +		return true;
> +
> +	if (!place->fpfn && place->lpfn == mgr->visible_size >> PAGE_SHIFT)
> +		return vres->used_visible_size == size;
> +
> +	list_for_each_entry(block, &vres->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 const struct ttm_resource_manager_func xe_ttm_vram_mgr_func = {
>   	.alloc	= xe_ttm_vram_mgr_new,
>   	.free	= xe_ttm_vram_mgr_del,
> +	.intersects = xe_ttm_vram_mgr_intersects,
> +	.compatible = xe_ttm_vram_mgr_compatible,
>   	.debug	= xe_ttm_vram_mgr_debug
>   };
>   


More information about the Intel-xe mailing list