[PATCH 1/4] drm/xe: Simplify migration kunit tests

Matthew Brost matthew.brost at intel.com
Fri May 2 16:54:57 UTC 2025


On Fri, May 02, 2025 at 11:35:10AM +0200, Maarten Lankhorst wrote:
> Create a macro for creating a pinned user bo, similar to

s/macro/function/

> xe_bo_create_pin_map,
> and use the same destructor, xe_bo_unpin_map_no_vm to destroy.
> 
> This reduces the amount of churn in the tests, and makes
> it easier to read and add more.
> 
> Signed-off-by: Maarten Lankhorst <dev at lankhorst.se>

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

> ---
>  drivers/gpu/drm/xe/tests/xe_migrate.c | 174 +++++++++++---------------
>  1 file changed, 72 insertions(+), 102 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/tests/xe_migrate.c b/drivers/gpu/drm/xe/tests/xe_migrate.c
> index 4a65e3103f77b..12a3318b1a5d5 100644
> --- a/drivers/gpu/drm/xe/tests/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/tests/xe_migrate.c
> @@ -333,9 +333,9 @@ static void xe_migrate_sanity_test(struct xe_migrate *m, struct kunit *test)
>  	xe_bo_vunmap(m->pt_bo);
>  }
>  
> -static int migrate_test_run_device(struct xe_device *xe)
> +static void xe_migrate_sanity_kunit(struct kunit *test)
>  {
> -	struct kunit *test = kunit_get_current_test();
> +	struct xe_device *xe = test->priv;
>  	struct xe_tile *tile;
>  	int id;
>  
> @@ -351,15 +351,6 @@ static int migrate_test_run_device(struct xe_device *xe)
>  	}
>  
>  	xe_pm_runtime_put(xe);
> -
> -	return 0;
> -}
> -
> -static void xe_migrate_sanity_kunit(struct kunit *test)
> -{
> -	struct xe_device *xe = test->priv;
> -
> -	migrate_test_run_device(xe);
>  }
>  
>  static struct dma_fence *blt_copy(struct xe_tile *tile,
> @@ -511,7 +502,7 @@ static void test_migrate(struct xe_device *xe, struct xe_tile *tile,
>  	kunit_info(test, "Evict vram buffer object\n");
>  	ret = xe_bo_evict(vram_bo);
>  	if (ret) {
> -		KUNIT_FAIL(test, "Failed to evict bo.\n");
> +		KUNIT_FAIL(test, "Failed to evict bo: %pe.\n", ERR_PTR(ret));
>  		return;
>  	}
>  
> @@ -631,124 +622,112 @@ static void test_clear(struct xe_device *xe, struct xe_tile *tile,
>  	dma_fence_put(fence);
>  }
>  
> -static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *tile,
> -				       struct kunit *test)
> +static struct xe_bo *migratable_bo_create_pin_map(struct kunit *test, struct xe_device *xe, struct xe_vm *vm, u64 size, u32 caching, u32 flags)
>  {
> -	struct xe_bo *sys_bo, *vram_bo = NULL, *ccs_bo = NULL;
> -	unsigned int bo_flags = XE_BO_FLAG_VRAM_IF_DGFX(tile);
> -	long ret;
> -
> -	sys_bo = xe_bo_create_user(xe, NULL, NULL, SZ_4M,
> -				   DRM_XE_GEM_CPU_CACHING_WC,
> -				   XE_BO_FLAG_SYSTEM |
> -				   XE_BO_FLAG_NEEDS_CPU_ACCESS |
> -				   XE_BO_FLAG_PINNED);
> +	struct xe_bo *bo = xe_bo_create_user(xe, NULL, vm, size, caching, flags | XE_BO_FLAG_PINNED);
> +	int ret;
>  
> -	if (IS_ERR(sys_bo)) {
> -		KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n",
> -			   PTR_ERR(sys_bo));
> -		return;
> +	if (IS_ERR(bo)) {
> +		KUNIT_FAIL(test, "xe_bo_create_user(%x) failed with err=%ld\n",
> +			   flags, PTR_ERR(bo));
> +		return bo;
>  	}
>  
> -	xe_bo_lock(sys_bo, false);
> -	ret = xe_bo_validate(sys_bo, NULL, false);
> -	if (ret) {
> -		KUNIT_FAIL(test, "Failed to validate system bo for: %li\n", ret);
> -		goto free_sysbo;
> -	}
> +	if (!vm)
> +		xe_bo_lock(bo, false);
>  
> -	ret = xe_bo_vmap(sys_bo);
> +	ret = xe_bo_validate(bo, NULL, false);
>  	if (ret) {
> -		KUNIT_FAIL(test, "Failed to vmap system bo: %li\n", ret);
> -		goto free_sysbo;
> +		KUNIT_FAIL(test, "Failed to validate bo(%x) for: %i\n", flags, ret);
> +		goto out_unlock;
>  	}
> -	xe_bo_unlock(sys_bo);
>  
> -	ccs_bo = xe_bo_create_user(xe, NULL, NULL, SZ_4M,
> -				   DRM_XE_GEM_CPU_CACHING_WC,
> -				   bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS |
> -				   XE_BO_FLAG_PINNED);
> +	ttm_bo_pin(&bo->ttm);
>  
> -	if (IS_ERR(ccs_bo)) {
> -		KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n",
> -			   PTR_ERR(ccs_bo));
> -		return;
> -	}
> -
> -	xe_bo_lock(ccs_bo, false);
> -	ret = xe_bo_validate(ccs_bo, NULL, false);
> +	if (flags & XE_BO_FLAG_NEEDS_CPU_ACCESS)
> +		ret = xe_bo_vmap(bo);
>  	if (ret) {
> -		KUNIT_FAIL(test, "Failed to validate system bo for: %li\n", ret);
> -		goto free_ccsbo;
> +		KUNIT_FAIL(test, "Failed to vmap bo(%x): %i\n", flags, ret);
> +		ttm_bo_unpin(&bo->ttm);
>  	}
>  
> -	ret = xe_bo_vmap(ccs_bo);
> +out_unlock:
> +	if (!vm)
> +		xe_bo_unlock(bo);
>  	if (ret) {
> -		KUNIT_FAIL(test, "Failed to vmap system bo: %li\n", ret);
> -		goto free_ccsbo;
> +		xe_bo_put(bo);
> +		bo = ERR_PTR(ret);
>  	}
> -	xe_bo_unlock(ccs_bo);
> +	return bo;
> +}
> +
> +static void bo_unpin_map_user(struct xe_bo *bo)
> +{
> +	if (!bo->vm)
> +		xe_bo_lock(bo, false);
> +	ttm_bo_set_bulk_move(&bo->ttm, NULL);
> +	ttm_bo_unpin(&bo->ttm);
> +	if (!bo->vm)
> +		xe_bo_unlock(bo);
> +	xe_bo_put(bo);
> +}
>  
> -	vram_bo = xe_bo_create_user(xe, NULL, NULL, SZ_4M,
> -				    DRM_XE_GEM_CPU_CACHING_WC,
> -				    bo_flags | XE_BO_FLAG_NEEDS_CPU_ACCESS |
> -				    XE_BO_FLAG_PINNED);
> -	if (IS_ERR(vram_bo)) {
> -		KUNIT_FAIL(test, "xe_bo_create() failed with err=%ld\n",
> -			   PTR_ERR(vram_bo));
> +static void validate_ccs_test_run_tile(struct xe_device *xe, struct xe_tile *tile,
> +				       struct kunit *test)
> +{
> +	struct xe_bo *sys_bo, *vram_bo = NULL, *ccs_bo = NULL;
> +	unsigned int bo_flags =
> +		XE_BO_FLAG_VRAM_IF_DGFX(tile) | XE_BO_FLAG_NEEDS_CPU_ACCESS;
> +
> +	sys_bo = migratable_bo_create_pin_map(test, xe, NULL, SZ_4M,
> +					      DRM_XE_GEM_CPU_CACHING_WC,
> +					      XE_BO_FLAG_SYSTEM |
> +					      XE_BO_FLAG_NEEDS_CPU_ACCESS);
> +	if (IS_ERR(sys_bo))
>  		return;
> -	}
>  
> -	xe_bo_lock(vram_bo, false);
> -	ret = xe_bo_validate(vram_bo, NULL, false);
> -	if (ret) {
> -		KUNIT_FAIL(test, "Failed to validate vram bo for: %li\n", ret);
> -		goto free_vrambo;
> -	}
> +	ccs_bo = migratable_bo_create_pin_map(test, xe, NULL, SZ_4M,
> +					      DRM_XE_GEM_CPU_CACHING_WC,
> +					      bo_flags);
> +	if (IS_ERR(ccs_bo))
> +		goto free_sysbo;
>  
> -	ret = xe_bo_vmap(vram_bo);
> -	if (ret) {
> -		KUNIT_FAIL(test, "Failed to vmap vram bo: %li\n", ret);
> -		goto free_vrambo;
> -	}
> +	vram_bo = migratable_bo_create_pin_map(test, xe, NULL, SZ_4M,
> +					       DRM_XE_GEM_CPU_CACHING_WC,
> +					       bo_flags);
> +	if (IS_ERR(vram_bo))
> +		goto free_ccsbo;
>  
> +	xe_bo_lock(vram_bo, false);
>  	test_clear(xe, tile, sys_bo, vram_bo, test);
> -	test_migrate(xe, tile, sys_bo, vram_bo, ccs_bo, test);
> -	xe_bo_unlock(vram_bo);
>  
> -	xe_bo_lock(vram_bo, false);
> -	xe_bo_vunmap(vram_bo);
> +	/* For migration test needs to be unpinned */
> +	ttm_bo_unpin(&vram_bo->ttm);
> +	test_migrate(xe, tile, sys_bo, vram_bo, ccs_bo, test);
> +	ttm_bo_pin(&vram_bo->ttm);
>  	xe_bo_unlock(vram_bo);
>  
> -	xe_bo_lock(ccs_bo, false);
> -	xe_bo_vunmap(ccs_bo);
> -	xe_bo_unlock(ccs_bo);
> -
> -	xe_bo_lock(sys_bo, false);
> -	xe_bo_vunmap(sys_bo);
> -	xe_bo_unlock(sys_bo);
> -free_vrambo:
> -	xe_bo_put(vram_bo);
> +	bo_unpin_map_user(vram_bo);
>  free_ccsbo:
> -	xe_bo_put(ccs_bo);
> +	bo_unpin_map_user(ccs_bo);
>  free_sysbo:
> -	xe_bo_put(sys_bo);
> +	bo_unpin_map_user(sys_bo);
>  }
>  
> -static int validate_ccs_test_run_device(struct xe_device *xe)
> +static void xe_validate_ccs_kunit(struct kunit *test)
>  {
> -	struct kunit *test = kunit_get_current_test();
> +	struct xe_device *xe = test->priv;
>  	struct xe_tile *tile;
>  	int id;
>  
>  	if (!xe_device_has_flat_ccs(xe)) {
>  		kunit_skip(test, "non-flat-ccs device\n");
> -		return 0;
> +		return;
>  	}
>  
>  	if (!(GRAPHICS_VER(xe) >= 20 && IS_DGFX(xe))) {
>  		kunit_skip(test, "non-xe2 discrete device\n");
> -		return 0;
> +		return;
>  	}
>  
>  	xe_pm_runtime_get(xe);
> @@ -757,15 +736,6 @@ static int validate_ccs_test_run_device(struct xe_device *xe)
>  		validate_ccs_test_run_tile(xe, tile, test);
>  
>  	xe_pm_runtime_put(xe);
> -
> -	return 0;
> -}
> -
> -static void xe_validate_ccs_kunit(struct kunit *test)
> -{
> -	struct xe_device *xe = test->priv;
> -
> -	validate_ccs_test_run_device(xe);
>  }
>  
>  static struct kunit_case xe_migrate_tests[] = {
> -- 
> 2.45.2
> 


More information about the Intel-xe mailing list