[PATCH v2 5/6] drm/xe/migrate: Populate struct drm_pagemap_addr array

Matthew Brost matthew.brost at intel.com
Fri Jul 25 23:04:26 UTC 2025


On Fri, Jul 25, 2025 at 05:39:29PM +0200, Francois Dugast wrote:
> Ensure all addresses are populated in the array as this is expected
> when creating the copy batch.
> 
> Signed-off-by: Francois Dugast <francois.dugast at intel.com>

Nice, this looks like the correct place to W/A the migrate layer not yet
support 2M GPU pages.

I have something for this locally and will post after this series
merges. Maybe meantion in commit message a follow up properly fix this
one.

This patch LGTM, with that:
Reviewed-by: Matthew Brost <matthew.brost at intel.com>

> ---
>  drivers/gpu/drm/xe/xe_migrate.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
> index c33bd1b139c9..998b37852ac7 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/xe_migrate.c
> @@ -1797,6 +1797,7 @@ static struct dma_fence *xe_migrate_vram(struct xe_migrate *m,
>  	unsigned int pitch = len >= PAGE_SIZE && !(len & ~PAGE_MASK) ?
>  		PAGE_SIZE : 4;
>  	int err;
> +	unsigned long i, j;
>  
>  	if (drm_WARN_ON(&xe->drm, (len & XE_CACHELINE_MASK) ||
>  			(sram_offset | vram_addr) & XE_CACHELINE_MASK))
> @@ -1813,6 +1814,24 @@ static struct dma_fence *xe_migrate_vram(struct xe_migrate *m,
>  		return ERR_PTR(err);
>  	}
>  
> +	/*
> +	 * If the order of a struct drm_pagemap_addr entry is greater than 0,
> +	 * the entry is populated by GPU pagemap but subsequent entries within
> +	 * the range of that order are not populated.
> +	 * build_pt_update_batch_sram() expects a fully populated array of
> +	 * struct drm_pagemap_addr. Ensure this is the case even with higher
> +	 * orders.
> +	 */
> +	for (i = 0; i < npages;) {
> +		unsigned int order = sram_addr[i].order;
> +
> +		for (j = 1; j < NR_PAGES(order) && i + j < npages; j++)
> +			if (!sram_addr[i + j].addr)
> +				sram_addr[i + j].addr = sram_addr[i].addr + j * PAGE_SIZE;
> +
> +		i += NR_PAGES(order);
> +	}
> +
>  	build_pt_update_batch_sram(m, bb, pt_slot * XE_PAGE_SIZE,
>  				   sram_addr, len + sram_offset);
>  
> -- 
> 2.43.0
> 


More information about the Intel-xe mailing list