Skip to content

Commit 187e16f

Browse files
author
Thomas Hellström
committed
drm/xe: Work around clang multiple goto-label error
When using drm_exec_retry_on_contention(), clang may consider all labels for which we take addresses in a function as potential retry goto targets, although strictly only one is possible. It will then in some situations generate false positive errors. In this case, the compiler, for some architectures, consider the might_lock(&m->job_mutex); as a potential goto target from drm_exec_retry_on_contention(), and errors. Work around that by moving the xe_validate / drm_exec transaction to a separate function. v2: - New commit message based on analysis of Nathan Chancellor Fixes: 59eabff ("drm/xe: Convert xe_bo_create_pin_map() for exhaustive eviction") Cc: Matthew Brost <matthew.brost@intel.com> Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202509101853.nDmyxTEM-lkp@intel.com/ Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com> Reviewed-by: Nathan Chancellor <nathan@kernel.org> Tested-by: Nathan Chancellor <nathan@kernel.org> # build Link: https://lore.kernel.org/r/20250911080324.180307-1-thomas.hellstrom@linux.intel.com
1 parent fb3c27a commit 187e16f

1 file changed

Lines changed: 19 additions & 10 deletions

File tree

drivers/gpu/drm/xe/xe_migrate.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,24 @@ struct xe_migrate *xe_migrate_alloc(struct xe_tile *tile)
394394
return m;
395395
}
396396

397+
static int xe_migrate_lock_prepare_vm(struct xe_tile *tile, struct xe_migrate *m, struct xe_vm *vm)
398+
{
399+
struct xe_device *xe = tile_to_xe(tile);
400+
struct xe_validation_ctx ctx;
401+
struct drm_exec exec;
402+
int err = 0;
403+
404+
xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) {
405+
err = xe_vm_drm_exec_lock(vm, &exec);
406+
drm_exec_retry_on_contention(&exec);
407+
err = xe_migrate_prepare_vm(tile, m, vm, &exec);
408+
drm_exec_retry_on_contention(&exec);
409+
xe_validation_retry_on_oom(&ctx, &err);
410+
}
411+
412+
return err;
413+
}
414+
397415
/**
398416
* xe_migrate_init() - Initialize a migrate context
399417
* @m: The migration context
@@ -405,8 +423,6 @@ int xe_migrate_init(struct xe_migrate *m)
405423
struct xe_tile *tile = m->tile;
406424
struct xe_gt *primary_gt = tile->primary_gt;
407425
struct xe_device *xe = tile_to_xe(tile);
408-
struct xe_validation_ctx ctx;
409-
struct drm_exec exec;
410426
struct xe_vm *vm;
411427
int err;
412428

@@ -416,14 +432,7 @@ int xe_migrate_init(struct xe_migrate *m)
416432
if (IS_ERR(vm))
417433
return PTR_ERR(vm);
418434

419-
err = 0;
420-
xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) {
421-
err = xe_vm_drm_exec_lock(vm, &exec);
422-
drm_exec_retry_on_contention(&exec);
423-
err = xe_migrate_prepare_vm(tile, m, vm, &exec);
424-
drm_exec_retry_on_contention(&exec);
425-
xe_validation_retry_on_oom(&ctx, &err);
426-
}
435+
err = xe_migrate_lock_prepare_vm(tile, m, vm);
427436
if (err)
428437
return err;
429438

0 commit comments

Comments
 (0)