[PATCH v2 6/6] drm/xe/svm: Migrate folios when possible

Francois Dugast francois.dugast at intel.com
Mon Jul 28 14:10:10 UTC 2025


On Fri, Jul 25, 2025 at 04:14:17PM -0700, Matthew Brost wrote:
> On Fri, Jul 25, 2025 at 05:39:30PM +0200, Francois Dugast wrote:
> > The DMA mapping can now correspond to a folio (order > 0), so move the
> > iterator by the number of pages in the folio in order to migrate all
> > pages at once. This will improve efficiency compared to migrating pages
> > one by one.
> > 
> > For this to work, the BOs must be contiguous in memory.
> > 
> 
> I'd mention since SVM BOs are a max of 2M and it is very unlikely
> forcing to continuous has any negative affects (e.g., extra eviction),
> it greatly simplifies the code, and 2M contiguous memory will enable 2M
> device pages which is huge perf win.

Sure, will add.

> 
> We might need a small adjustment to populate_devmem_pfn to communicate
> contigous memory was found to drm_pagemap too as our driver can easily
> allocate contiguous memory, but we shouldn't assume other drivers can
> do so. This can be done in follow up which adds the 2M device page
> support.

Do I understand correctly: change populate_devmem_pfn() to provide the
information to the caller in drm_pagemap whether the allocated memory
is contiguous or not, so that it can let the driver know when calling
copy_to_devmem(). This way a fallback can be used in the driver when
the memory is not contiguous (not implemented below because this seems
not necessary in Xe).

> 
> > Signed-off-by: Francois Dugast <francois.dugast at intel.com>
> > ---
> >  drivers/gpu/drm/xe/xe_bo.c  | 2 ++
> >  drivers/gpu/drm/xe/xe_svm.c | 5 +++++
> >  2 files changed, 7 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> > index ffca1cea5585..59994a978a8c 100644
> > --- a/drivers/gpu/drm/xe/xe_bo.c
> > +++ b/drivers/gpu/drm/xe/xe_bo.c
> > @@ -200,6 +200,8 @@ static bool force_contiguous(u32 bo_flags)
> >  	else if (bo_flags & XE_BO_FLAG_PINNED &&
> >  		 !(bo_flags & XE_BO_FLAG_PINNED_LATE_RESTORE))
> >  		return true; /* needs vmap */
> > +	else if (bo_flags & XE_BO_FLAG_CPU_ADDR_MIRROR)
> > +		return true;
> >  
> >  	/*
> >  	 * For eviction / restore on suspend / resume objects pinned in VRAM
> > diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
> > index 1d097e76aabc..2759db5f7407 100644
> > --- a/drivers/gpu/drm/xe/xe_svm.c
> > +++ b/drivers/gpu/drm/xe/xe_svm.c
> > @@ -382,6 +382,11 @@ static int xe_svm_copy(struct page **pages,
> >  				pos = i;
> >  			}
> >  
> > +			if (pagemap_addr[i].order) {
> > +				i += NR_PAGES(pagemap_addr[i].order);
> 
> I think this needs to be NR_PAGES(pagemap_addr[i].order) - 1, right?

Yes correct because i is already incremented by 1 at this point.

> 
> > +				last = (i + 1) == npages;
> 
> Then set the chunk here too?
> 
> > +			}
> > +
> >  			match = vram_addr + PAGE_SIZE * (i - pos) == __vram_addr;
> 
> I think the match can be dropped actually and just assume it is true if
> we are allocating continuous memory now.

True, let me try this.

Francois

> 
> Matt
> 
> >  		}
> >  
> > -- 
> > 2.43.0
> > 


More information about the Intel-xe mailing list