[PATCH v10 4/5] drm/xe: Split xe_migrate allocation from initialization

Matthew Brost matthew.brost at intel.com
Wed Jul 9 17:34:23 UTC 2025


On Wed, Jul 09, 2025 at 02:15:42PM +0200, Piórkowski, Piotr wrote:
> From: Piotr Piórkowski <piotr.piorkowski at intel.com>
> 
> Currently xe_migrate allocation and initialization are combined in
> xe_migrate_init(). This creates a problem because the migration
> context cannot be passed to other objects before.
> Let's separate allocation and initialization so that we can pass
> the migration object pointer to other structures before initialization.
> 
> Signed-off-by: Piotr Piórkowski <piotr.piorkowski at intel.com>

Reviewed-by: Matthew Brost <matthew.brost at intel.com>

> ---
>  drivers/gpu/drm/xe/xe_migrate.c | 25 ++++++++++++++++++-------
>  drivers/gpu/drm/xe/xe_migrate.h |  1 +
>  drivers/gpu/drm/xe/xe_tile.c    |  4 ++++
>  3 files changed, 23 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
> index 6272e2bb0482..8ba62c5a39a9 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/xe_migrate.c
> @@ -389,6 +389,23 @@ static bool xe_migrate_needs_ccs_emit(struct xe_device *xe)
>  	return xe_device_has_flat_ccs(xe) && !(GRAPHICS_VER(xe) >= 20 && IS_DGFX(xe));
>  }
>  
> +/**
> + * xe_migrate_alloc - Allocate a migrate struct for a given &xe_tile
> + * @tile: &xe_tile
> + *
> + * Allocates a &xe_migrate for a given tile.
> + *
> + * Return: &xe_migrate on success, or NULL when out of memory.
> + */
> +struct xe_migrate *xe_migrate_alloc(struct xe_tile *tile)
> +{
> +	struct xe_migrate *migrate = drmm_kzalloc(&tile_to_xe(tile)->drm, sizeof(*migrate),
> +						  GFP_KERNEL);
> +	if (migrate)
> +		migrate->tile = tile;
> +	return migrate;
> +}
> +
>  /**
>   * xe_migrate_init() - Initialize a migrate context
>   * @tile: Back-pointer to the tile we're initializing for.
> @@ -399,16 +416,10 @@ struct xe_migrate *xe_migrate_init(struct xe_tile *tile)
>  {
>  	struct xe_device *xe = tile_to_xe(tile);
>  	struct xe_gt *primary_gt = tile->primary_gt;
> -	struct xe_migrate *m;
> +	struct xe_migrate *m = tile->migrate;
>  	struct xe_vm *vm;
>  	int err;
>  
> -	m = devm_kzalloc(xe->drm.dev, sizeof(*m), GFP_KERNEL);
> -	if (!m)
> -		return ERR_PTR(-ENOMEM);
> -
> -	m->tile = tile;
> -
>  	/* Special layout, prepared below.. */
>  	vm = xe_vm_create(xe, XE_VM_FLAG_MIGRATION |
>  			  XE_VM_FLAG_SET_TILE_ID(tile));
> diff --git a/drivers/gpu/drm/xe/xe_migrate.h b/drivers/gpu/drm/xe/xe_migrate.h
> index fb9839c1bae0..74c60f55004a 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.h
> +++ b/drivers/gpu/drm/xe/xe_migrate.h
> @@ -93,6 +93,7 @@ struct xe_migrate_pt_update {
>  	u8 tile_id;
>  };
>  
> +struct xe_migrate *xe_migrate_alloc(struct xe_tile *tile);
>  struct xe_migrate *xe_migrate_init(struct xe_tile *tile);
>  
>  struct dma_fence *xe_migrate_to_vram(struct xe_migrate *m,
> diff --git a/drivers/gpu/drm/xe/xe_tile.c b/drivers/gpu/drm/xe/xe_tile.c
> index bd2ff91a7d1c..171de6a4ba95 100644
> --- a/drivers/gpu/drm/xe/xe_tile.c
> +++ b/drivers/gpu/drm/xe/xe_tile.c
> @@ -94,6 +94,10 @@ static int xe_tile_alloc(struct xe_tile *tile)
>  	if (!tile->mem.ggtt)
>  		return -ENOMEM;
>  
> +	tile->migrate = xe_migrate_alloc(tile);
> +	if (!tile->migrate)
> +		return -ENOMEM;
> +
>  	return 0;
>  }
>  
> -- 
> 2.34.1
> 


More information about the Intel-xe mailing list