Subject: linux-next: manual merge of the drm tree with Linus' tree

From: Stephen Rothwell <[email-masked]>
Date: Wed, 21 May 2025 14:13:18 +1000

Hi all,

Today's linux-next merge of the drm tree got a conflict in:

  drivers/gpu/drm/xe/xe_svm.c

between commit:

  794f5493f518 ("drm/xe: Strict migration policy for atomic SVM faults")

from Linus' tree and commit:

  80bcbdfc8cf5 ("drm/xe/svm: Add stats for SVM page faults")

from the drm tree.

I fixed it up (see below) and can carry the fix as necessary. This
is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.

-- 
Cheers,
Stephen Rothwell

diff --cc drivers/gpu/drm/xe/xe_svm.c
index 975094c1a582,d25f02c8d7fc..000000000000
--- a/drivers/gpu/drm/xe/xe_svm.c
+++ b/drivers/gpu/drm/xe/xe_svm.c
@@@ -654,18 -650,12 +659,19 @@@ void xe_svm_fini(struct xe_vm *vm
  }
  
  static bool xe_svm_range_is_valid(struct xe_svm_range *range,
 -				  struct xe_tile *tile)
 +				  struct xe_tile *tile,
 +				  bool devmem_only)
  {
 -	return (range->tile_present & ~range->tile_invalidated) & BIT(tile->id);
 +	/*
 +	 * Advisory only check whether the range currently has a valid mapping,
 +	 * READ_ONCE pairs with WRITE_ONCE in xe_pt.c
 +	 */
 +	return ((READ_ONCE(range->tile_present) &
 +		 ~READ_ONCE(range->tile_invalidated)) & BIT(tile->id)) &&
 +		(!devmem_only || xe_svm_range_in_vram(range));
  }
  
+ #if IS_ENABLED(CONFIG_DRM_XE_DEVMEM_MIRROR)
  static struct xe_vram_region *tile_to_vr(struct xe_tile *tile)
  {
  	return &tile->mem.vram;
@@@ -727,37 -717,15 +733,45 @@@ unlock
  
  	return err;
  }
+ #else
+ static int xe_svm_alloc_vram(struct xe_vm *vm, struct xe_tile *tile,
+ 			     struct xe_svm_range *range,
+ 			     const struct drm_gpusvm_ctx *ctx)
+ {
+ 	return -EOPNOTSUPP;
+ }
+ #endif
  
 +static bool supports_4K_migration(struct xe_device *xe)
 +{
 +	if (xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K)
 +		return false;
 +
 +	return true;
 +}
 +
 +static bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range,
 +					       struct xe_vma *vma)
 +{
 +	struct xe_vm *vm = range_to_vm(&range->base);
 +	u64 range_size = xe_svm_range_size(range);
 +
 +	if (!range->base.flags.migrate_devmem)
 +		return false;
 +
 +	if (xe_svm_range_in_vram(range)) {
 +		drm_dbg(&vm->xe->drm, "Range is already in VRAM\n");
 +		return false;
 +	}
 +
 +	if (range_size <= SZ_64K && !supports_4K_migration(vm->xe)) {
 +		drm_dbg(&vm->xe->drm, "Platform doesn't support SZ_4K range migration\n");
 +		return false;
 +	}
 +
 +	return true;
 +}
 +
  /**
   * xe_svm_handle_pagefault() - SVM handle page fault
   * @vm: The VM.
@@@ -790,7 -754,7 +804,8 @@@ int xe_svm_handle_pagefault(struct xe_v
  	struct drm_gpusvm_range *r;
  	struct drm_exec exec;
  	struct dma_fence *fence;
 +	int migrate_try_count = ctx.devmem_only ? 3 : 1;
+ 	struct xe_tile *tile = gt_to_tile(gt);
  	ktime_t end = 0;
  	int err;