* [drm-xe:drm-xe-next 11/13] drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets
@ 2025-09-10 10:33 kernel test robot
2025-09-10 15:16 ` Thomas Hellström
0 siblings, 1 reply; 4+ messages in thread
From: kernel test robot @ 2025-09-10 10:33 UTC (permalink / raw)
To: Thomas Hellström; +Cc: llvm, oe-kbuild-all, intel-xe, Matthew Brost
tree: https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-next
head: 844150c255c94230aec41f88db8e2875cb97439e
commit: 59eabff2a3524d7f3bf6c24890cd197c4c116fcb [11/13] drm/xe: Convert xe_bo_create_pin_map() for exhaustive eviction
config: loongarch-randconfig-001-20250910 (https://download.01.org/0day-ci/archive/20250910/202509101853.nDmyxTEM-lkp@intel.com/config)
compiler: clang version 18.1.8 (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7ab81f3d7ff)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250910/202509101853.nDmyxTEM-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509101853.nDmyxTEM-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets
422 | drm_exec_retry_on_contention(&exec);
| ^
include/drm/drm_exec.h:123:4: note: expanded from macro 'drm_exec_retry_on_contention'
123 | goto *__drm_exec_retry_ptr; \
| ^
drivers/gpu/drm/xe/xe_migrate.c:465:2: note: possible target of indirect goto statement
465 | might_lock(&m->job_mutex);
| ^
include/linux/lockdep.h:552:51: note: expanded from macro 'might_lock'
552 | lock_acquire(&(lock)->dep_map, 0, 0, 0, 1, NULL, _THIS_IP_); \
| ^
include/linux/instruction_pointer.h:10:41: note: expanded from macro '_THIS_IP_'
10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
| ^
drivers/gpu/drm/xe/xe_migrate.c:420:2: note: jump exits scope of variable with __attribute__((cleanup))
420 | xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) {
| ^
drivers/gpu/drm/xe/xe_validation.h:189:2: note: expanded from macro 'xe_validation_guard'
189 | scoped_guard(xe_validation, _ctx, _val, _exec, _flags, _ret) \
| ^
include/linux/cleanup.h:429:2: note: expanded from macro 'scoped_guard'
429 | __scoped_guard(_name, __UNIQUE_ID(label), args)
| ^
include/linux/cleanup.h:420:20: note: expanded from macro '__scoped_guard'
420 | for (CLASS(_name, scope)(args); \
| ^
drivers/gpu/drm/xe/xe_migrate.c:465:2: note: jump enters a statement expression
465 | might_lock(&m->job_mutex);
| ^
include/linux/lockdep.h:552:51: note: expanded from macro 'might_lock'
552 | lock_acquire(&(lock)->dep_map, 0, 0, 0, 1, NULL, _THIS_IP_); \
| ^
include/linux/instruction_pointer.h:10:20: note: expanded from macro '_THIS_IP_'
10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
| ^
>> drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets
422 | drm_exec_retry_on_contention(&exec);
| ^
include/drm/drm_exec.h:123:4: note: expanded from macro 'drm_exec_retry_on_contention'
123 | goto *__drm_exec_retry_ptr; \
| ^
drivers/gpu/drm/xe/xe_migrate.c:465:2: note: possible target of indirect goto statement
465 | might_lock(&m->job_mutex);
| ^
include/linux/lockdep.h:553:33: note: expanded from macro 'might_lock'
553 | lock_release(&(lock)->dep_map, _THIS_IP_); \
| ^
include/linux/instruction_pointer.h:10:41: note: expanded from macro '_THIS_IP_'
10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
| ^
drivers/gpu/drm/xe/xe_migrate.c:420:2: note: jump exits scope of variable with __attribute__((cleanup))
420 | xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) {
| ^
drivers/gpu/drm/xe/xe_validation.h:189:2: note: expanded from macro 'xe_validation_guard'
189 | scoped_guard(xe_validation, _ctx, _val, _exec, _flags, _ret) \
| ^
include/linux/cleanup.h:429:2: note: expanded from macro 'scoped_guard'
429 | __scoped_guard(_name, __UNIQUE_ID(label), args)
| ^
include/linux/cleanup.h:420:20: note: expanded from macro '__scoped_guard'
420 | for (CLASS(_name, scope)(args); \
| ^
drivers/gpu/drm/xe/xe_migrate.c:465:2: note: jump enters a statement expression
465 | might_lock(&m->job_mutex);
| ^
include/linux/lockdep.h:553:33: note: expanded from macro 'might_lock'
553 | lock_release(&(lock)->dep_map, _THIS_IP_); \
| ^
include/linux/instruction_pointer.h:10:20: note: expanded from macro '_THIS_IP_'
10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
| ^
2 errors generated.
vim +422 drivers/gpu/drm/xe/xe_migrate.c
396
397 /**
398 * xe_migrate_init() - Initialize a migrate context
399 * @m: The migration context
400 *
401 * Return: 0 if successful, negative error code on failure
402 */
403 int xe_migrate_init(struct xe_migrate *m)
404 {
405 struct xe_tile *tile = m->tile;
406 struct xe_gt *primary_gt = tile->primary_gt;
407 struct xe_device *xe = tile_to_xe(tile);
408 struct xe_validation_ctx ctx;
409 struct drm_exec exec;
410 struct xe_vm *vm;
411 int err;
412
413 /* Special layout, prepared below.. */
414 vm = xe_vm_create(xe, XE_VM_FLAG_MIGRATION |
415 XE_VM_FLAG_SET_TILE_ID(tile), NULL);
416 if (IS_ERR(vm))
417 return PTR_ERR(vm);
418
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 }
427 if (err)
428 return err;
429
430 if (xe->info.has_usm) {
431 struct xe_hw_engine *hwe = xe_gt_hw_engine(primary_gt,
432 XE_ENGINE_CLASS_COPY,
433 primary_gt->usm.reserved_bcs_instance,
434 false);
435 u32 logical_mask = xe_migrate_usm_logical_mask(primary_gt);
436
437 if (!hwe || !logical_mask) {
438 err = -EINVAL;
439 goto err_out;
440 }
441
442 /*
443 * XXX: Currently only reserving 1 (likely slow) BCS instance on
444 * PVC, may want to revisit if performance is needed.
445 */
446 m->q = xe_exec_queue_create(xe, vm, logical_mask, 1, hwe,
447 EXEC_QUEUE_FLAG_KERNEL |
448 EXEC_QUEUE_FLAG_PERMANENT |
449 EXEC_QUEUE_FLAG_HIGH_PRIORITY |
450 EXEC_QUEUE_FLAG_MIGRATE, 0);
451 } else {
452 m->q = xe_exec_queue_create_class(xe, primary_gt, vm,
453 XE_ENGINE_CLASS_COPY,
454 EXEC_QUEUE_FLAG_KERNEL |
455 EXEC_QUEUE_FLAG_PERMANENT |
456 EXEC_QUEUE_FLAG_MIGRATE, 0);
457 }
458 if (IS_ERR(m->q)) {
459 err = PTR_ERR(m->q);
460 goto err_out;
461 }
462
463 mutex_init(&m->job_mutex);
464 fs_reclaim_acquire(GFP_KERNEL);
465 might_lock(&m->job_mutex);
466 fs_reclaim_release(GFP_KERNEL);
467
468 err = devm_add_action_or_reset(xe->drm.dev, xe_migrate_fini, m);
469 if (err)
470 return err;
471
472 if (IS_DGFX(xe)) {
473 if (xe_migrate_needs_ccs_emit(xe))
474 /* min chunk size corresponds to 4K of CCS Metadata */
475 m->min_chunk_size = SZ_4K * SZ_64K /
476 xe_device_ccs_bytes(xe, SZ_64K);
477 else
478 /* Somewhat arbitrary to avoid a huge amount of blits */
479 m->min_chunk_size = SZ_64K;
480 m->min_chunk_size = roundup_pow_of_two(m->min_chunk_size);
481 drm_dbg(&xe->drm, "Migrate min chunk size is 0x%08llx\n",
482 (unsigned long long)m->min_chunk_size);
483 }
484
485 return err;
486
487 err_out:
488 xe_vm_close_and_put(vm);
489 return err;
490
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [drm-xe:drm-xe-next 11/13] drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets
2025-09-10 10:33 [drm-xe:drm-xe-next 11/13] drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets kernel test robot
@ 2025-09-10 15:16 ` Thomas Hellström
2025-09-10 19:39 ` Nathan Chancellor
0 siblings, 1 reply; 4+ messages in thread
From: Thomas Hellström @ 2025-09-10 15:16 UTC (permalink / raw)
To: kernel test robot; +Cc: llvm, oe-kbuild-all, intel-xe, Matthew Brost
On Wed, 2025-09-10 at 18:33 +0800, kernel test robot wrote:
> tree: https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-next
> head: 844150c255c94230aec41f88db8e2875cb97439e
> commit: 59eabff2a3524d7f3bf6c24890cd197c4c116fcb [11/13] drm/xe:
> Convert xe_bo_create_pin_map() for exhaustive eviction
> config: loongarch-randconfig-001-20250910
> (https://download.01.org/0day-ci/archive/20250910/202509101853.nDmyxT
> EM-lkp@intel.com/config)
> compiler: clang version 18.1.8
> (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7a
> b81f3d7ff)
> reproduce (this is a W=1 build):
> (https://download.01.org/0day-ci/archive/20250910/202509101853.nDmyxT
> EM-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new
> version of
> the same patch/commit), kindly add following tags
> > Reported-by: kernel test robot <lkp@intel.com>
> > Closes:
> > https://lore.kernel.org/oe-kbuild-all/202509101853.nDmyxTEM-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> > > drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from
This one looks like a clang loongarch bug. It doesn't happen on clang
x86 and looks implausible.
Thanks,
Thomas
> > > this indirect goto statement to one of its possible targets
> 422 | drm_exec_retry_on_contention(&exec);
> | ^
> include/drm/drm_exec.h:123:4: note: expanded from macro
> 'drm_exec_retry_on_contention'
> 123 | goto
> *__drm_exec_retry_ptr; \
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:465:2: note: possible target of
> indirect goto statement
> 465 | might_lock(&m->job_mutex);
> | ^
> include/linux/lockdep.h:552:51: note: expanded from macro
> 'might_lock'
> 552 | lock_acquire(&(lock)->dep_map, 0, 0, 0, 1, NULL,
> _THIS_IP_); \
> | ^
> include/linux/instruction_pointer.h:10:41: note: expanded from
> macro '_THIS_IP_'
> 10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned
> long)&&__here; })
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:420:2: note: jump exits scope of
> variable with __attribute__((cleanup))
> 420 | xe_validation_guard(&ctx, &xe->val, &exec, (struct
> xe_val_flags) {}, err) {
> | ^
> drivers/gpu/drm/xe/xe_validation.h:189:2: note: expanded from
> macro 'xe_validation_guard'
> 189 | scoped_guard(xe_validation, _ctx, _val, _exec,
> _flags, _ret) \
> | ^
> include/linux/cleanup.h:429:2: note: expanded from macro
> 'scoped_guard'
> 429 | __scoped_guard(_name, __UNIQUE_ID(label), args)
> | ^
> include/linux/cleanup.h:420:20: note: expanded from macro
> '__scoped_guard'
> 420 | for (CLASS(_name,
> scope)(args); \
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:465:2: note: jump enters a
> statement expression
> 465 | might_lock(&m->job_mutex);
> | ^
> include/linux/lockdep.h:552:51: note: expanded from macro
> 'might_lock'
> 552 | lock_acquire(&(lock)->dep_map, 0, 0, 0, 1, NULL,
> _THIS_IP_); \
> | ^
> include/linux/instruction_pointer.h:10:20: note: expanded from
> macro '_THIS_IP_'
> 10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned
> long)&&__here; })
> | ^
> > > drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from
> > > this indirect goto statement to one of its possible targets
> 422 | drm_exec_retry_on_contention(&exec);
> | ^
> include/drm/drm_exec.h:123:4: note: expanded from macro
> 'drm_exec_retry_on_contention'
> 123 | goto
> *__drm_exec_retry_ptr; \
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:465:2: note: possible target of
> indirect goto statement
> 465 | might_lock(&m->job_mutex);
> | ^
> include/linux/lockdep.h:553:33: note: expanded from macro
> 'might_lock'
> 553 | lock_release(&(lock)->dep_map,
> _THIS_IP_); \
> | ^
> include/linux/instruction_pointer.h:10:41: note: expanded from
> macro '_THIS_IP_'
> 10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned
> long)&&__here; })
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:420:2: note: jump exits scope of
> variable with __attribute__((cleanup))
> 420 | xe_validation_guard(&ctx, &xe->val, &exec, (struct
> xe_val_flags) {}, err) {
> | ^
> drivers/gpu/drm/xe/xe_validation.h:189:2: note: expanded from
> macro 'xe_validation_guard'
> 189 | scoped_guard(xe_validation, _ctx, _val, _exec,
> _flags, _ret) \
> | ^
> include/linux/cleanup.h:429:2: note: expanded from macro
> 'scoped_guard'
> 429 | __scoped_guard(_name, __UNIQUE_ID(label), args)
> | ^
> include/linux/cleanup.h:420:20: note: expanded from macro
> '__scoped_guard'
> 420 | for (CLASS(_name,
> scope)(args); \
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:465:2: note: jump enters a
> statement expression
> 465 | might_lock(&m->job_mutex);
> | ^
> include/linux/lockdep.h:553:33: note: expanded from macro
> 'might_lock'
> 553 | lock_release(&(lock)->dep_map,
> _THIS_IP_); \
> | ^
> include/linux/instruction_pointer.h:10:20: note: expanded from
> macro '_THIS_IP_'
> 10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned
> long)&&__here; })
> | ^
> 2 errors generated.
>
>
> vim +422 drivers/gpu/drm/xe/xe_migrate.c
>
> 396
> 397 /**
> 398 * xe_migrate_init() - Initialize a migrate context
> 399 * @m: The migration context
> 400 *
> 401 * Return: 0 if successful, negative error code on failure
> 402 */
> 403 int xe_migrate_init(struct xe_migrate *m)
> 404 {
> 405 struct xe_tile *tile = m->tile;
> 406 struct xe_gt *primary_gt = tile->primary_gt;
> 407 struct xe_device *xe = tile_to_xe(tile);
> 408 struct xe_validation_ctx ctx;
> 409 struct drm_exec exec;
> 410 struct xe_vm *vm;
> 411 int err;
> 412
> 413 /* Special layout, prepared below.. */
> 414 vm = xe_vm_create(xe, XE_VM_FLAG_MIGRATION |
> 415 XE_VM_FLAG_SET_TILE_ID(tile),
> NULL);
> 416 if (IS_ERR(vm))
> 417 return PTR_ERR(vm);
> 418
> 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 }
> 427 if (err)
> 428 return err;
> 429
> 430 if (xe->info.has_usm) {
> 431 struct xe_hw_engine *hwe =
> xe_gt_hw_engine(primary_gt,
> 432
> XE_ENGINE_CLASS_COPY,
> 433
> primary_gt->usm.reserved_bcs_instance,
> 434
> false);
> 435 u32 logical_mask =
> xe_migrate_usm_logical_mask(primary_gt);
> 436
> 437 if (!hwe || !logical_mask) {
> 438 err = -EINVAL;
> 439 goto err_out;
> 440 }
> 441
> 442 /*
> 443 * XXX: Currently only reserving 1 (likely
> slow) BCS instance on
> 444 * PVC, may want to revisit if performance
> is needed.
> 445 */
> 446 m->q = xe_exec_queue_create(xe, vm,
> logical_mask, 1, hwe,
> 447
> EXEC_QUEUE_FLAG_KERNEL |
> 448
> EXEC_QUEUE_FLAG_PERMANENT |
> 449
> EXEC_QUEUE_FLAG_HIGH_PRIORITY |
> 450
> EXEC_QUEUE_FLAG_MIGRATE, 0);
> 451 } else {
> 452 m->q = xe_exec_queue_create_class(xe,
> primary_gt, vm,
> 453
> XE_ENGINE_CLASS_COPY,
> 454
> EXEC_QUEUE_FLAG_KERNEL |
> 455
> EXEC_QUEUE_FLAG_PERMANENT |
> 456
> EXEC_QUEUE_FLAG_MIGRATE, 0);
> 457 }
> 458 if (IS_ERR(m->q)) {
> 459 err = PTR_ERR(m->q);
> 460 goto err_out;
> 461 }
> 462
> 463 mutex_init(&m->job_mutex);
> 464 fs_reclaim_acquire(GFP_KERNEL);
> 465 might_lock(&m->job_mutex);
> 466 fs_reclaim_release(GFP_KERNEL);
> 467
> 468 err = devm_add_action_or_reset(xe->drm.dev,
> xe_migrate_fini, m);
> 469 if (err)
> 470 return err;
> 471
> 472 if (IS_DGFX(xe)) {
> 473 if (xe_migrate_needs_ccs_emit(xe))
> 474 /* min chunk size corresponds to 4K
> of CCS Metadata */
> 475 m->min_chunk_size = SZ_4K * SZ_64K /
> 476 xe_device_ccs_bytes(xe,
> SZ_64K);
> 477 else
> 478 /* Somewhat arbitrary to avoid a
> huge amount of blits */
> 479 m->min_chunk_size = SZ_64K;
> 480 m->min_chunk_size = roundup_pow_of_two(m-
> >min_chunk_size);
> 481 drm_dbg(&xe->drm, "Migrate min chunk size is
> 0x%08llx\n",
> 482 (unsigned long long)m-
> >min_chunk_size);
> 483 }
> 484
> 485 return err;
> 486
> 487 err_out:
> 488 xe_vm_close_and_put(vm);
> 489 return err;
> 490
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [drm-xe:drm-xe-next 11/13] drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets
2025-09-10 15:16 ` Thomas Hellström
@ 2025-09-10 19:39 ` Nathan Chancellor
2025-09-11 6:34 ` Thomas Hellström
0 siblings, 1 reply; 4+ messages in thread
From: Nathan Chancellor @ 2025-09-10 19:39 UTC (permalink / raw)
To: Thomas Hellström
Cc: kernel test robot, llvm, oe-kbuild-all, intel-xe, Matthew Brost
On Wed, Sep 10, 2025 at 05:16:50PM +0200, Thomas Hellström wrote:
> On Wed, 2025-09-10 at 18:33 +0800, kernel test robot wrote:
> > tree: https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-next
> > head: 844150c255c94230aec41f88db8e2875cb97439e
> > commit: 59eabff2a3524d7f3bf6c24890cd197c4c116fcb [11/13] drm/xe:
> > Convert xe_bo_create_pin_map() for exhaustive eviction
> > config: loongarch-randconfig-001-20250910
> > (https://download.01.org/0day-ci/archive/20250910/202509101853.nDmyxT
> > EM-lkp@intel.com/config)
> > compiler: clang version 18.1.8
> > (https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d7a
> > b81f3d7ff)
> > reproduce (this is a W=1 build):
> > (https://download.01.org/0day-ci/archive/20250910/202509101853.nDmyxT
> > EM-lkp@intel.com/reproduce)
> >
> > If you fix the issue in a separate patch/commit (i.e. not just a new
> > version of
> > the same patch/commit), kindly add following tags
> > > Reported-by: kernel test robot <lkp@intel.com>
> > > Closes:
> > > https://lore.kernel.org/oe-kbuild-all/202509101853.nDmyxTEM-lkp@intel.com/
> >
> > All errors (new ones prefixed by >>):
> >
> > > > drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from
>
> This one looks like a clang loongarch bug. It doesn't happen on clang
> x86 and looks implausible.
This does not appear for x86_64 because its defintion of _THIS_IP_ in
arch/x86/include/asm/linkage.h does not use the address of a label
#ifdef CONFIG_64BIT
/*
* The generic version tends to create spurious ENDBR instructions under
* certain conditions.
*/
#define _THIS_IP_ ({ unsigned long __here; asm ("lea 0(%%rip), %0" : "=r" (__here)); __here; })
#endif
compared to
#ifndef _THIS_IP_
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
#endif
for all other architectures. I can reproduce this with both arm64 and i386:
$ make -skj"$(nproc)" ARCH=i386 LLVM=1 clean defconfig
$ scripts/config -e DRM_XE -e PROVE_LOCKING
$ make -skj"$(nproc)" ARCH=i386 LLVM=1 olddefconfig drivers/gpu/drm/xe/xe_migrate.o
drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets
422 | drm_exec_retry_on_contention(&exec);
| ^
include/drm/drm_exec.h:123:4: note: expanded from macro 'drm_exec_retry_on_contention'
123 | goto *__drm_exec_retry_ptr; \
| ^
drivers/gpu/drm/xe/xe_migrate.c:465:2: note: possible target of indirect goto statement
465 | might_lock(&m->job_mutex);
| ^
include/linux/lockdep.h:553:33: note: expanded from macro 'might_lock'
553 | lock_release(&(lock)->dep_map, _THIS_IP_); \
| ^
include/linux/instruction_pointer.h:10:41: note: expanded from macro '_THIS_IP_'
10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
| ^
drivers/gpu/drm/xe/xe_migrate.c:420:2: note: jump exits scope of variable with __attribute__((cleanup))
420 | xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) {
| ^
drivers/gpu/drm/xe/xe_validation.h:189:2: note: expanded from macro 'xe_validation_guard'
189 | scoped_guard(xe_validation, _ctx, _val, _exec, _flags, _ret) \
| ^
include/linux/cleanup.h:429:2: note: expanded from macro 'scoped_guard'
429 | __scoped_guard(_name, __UNIQUE_ID(label), args)
| ^
include/linux/cleanup.h:420:20: note: expanded from macro '__scoped_guard'
420 | for (CLASS(_name, scope)(args); \
| ^
drivers/gpu/drm/xe/xe_migrate.c:465:2: note: jump enters a statement expression
465 | might_lock(&m->job_mutex);
| ^
include/linux/lockdep.h:553:33: note: expanded from macro 'might_lock'
553 | lock_release(&(lock)->dep_map, _THIS_IP_); \
| ^
include/linux/instruction_pointer.h:10:20: note: expanded from macro '_THIS_IP_'
10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
| ^
...
While I agree that this is clearly a false positive because
__drm_exec_retry_ptr is only assigned the label in
drm_exec_until_all_locked() so we know __here will never be jumped to
via 'goto *__drm_exec_retry_ptr;', I am not sure that this is a clang
bug. Both compilers agree that the kernel's use of the address of a
label in _THIS_IP_ is problematic because it does not conform to the
only supported use case for taking the address of a label, which is for
computed gotos:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=44298
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071
https://github.com/llvm/llvm-project/issues/138272
https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
Given that is the only supported use case, I don't think it is
unreasonable for clang to make sure all address-taken labels in a
function are valid jump targets for a computed goto since that is the
only reason they should be exist in a function.
This could be worked around fairly simply with something like the
following diff.
Cheers,
Nathan
diff --git a/drivers/gpu/drm/xe/xe_migrate.c b/drivers/gpu/drm/xe/xe_migrate.c
index 6fad5d469629..b80eddf1a36e 100644
--- a/drivers/gpu/drm/xe/xe_migrate.c
+++ b/drivers/gpu/drm/xe/xe_migrate.c
@@ -462,7 +462,13 @@ int xe_migrate_init(struct xe_migrate *m)
mutex_init(&m->job_mutex);
fs_reclaim_acquire(GFP_KERNEL);
+#ifndef CONFIG_CC_IS_CLANG
+ /*
+ * _THIS_IP_ runs afoul of clang's scope checking and the computed goto
+ * in drm_exec_retry_on_contention().
+ */
might_lock(&m->job_mutex);
+#endif
fs_reclaim_release(GFP_KERNEL);
err = devm_add_action_or_reset(xe->drm.dev, xe_migrate_fini, m);
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [drm-xe:drm-xe-next 11/13] drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets
2025-09-10 19:39 ` Nathan Chancellor
@ 2025-09-11 6:34 ` Thomas Hellström
0 siblings, 0 replies; 4+ messages in thread
From: Thomas Hellström @ 2025-09-11 6:34 UTC (permalink / raw)
To: Nathan Chancellor
Cc: kernel test robot, llvm, oe-kbuild-all, intel-xe, Matthew Brost
Hi,
On Wed, 2025-09-10 at 12:39 -0700, Nathan Chancellor wrote:
> On Wed, Sep 10, 2025 at 05:16:50PM +0200, Thomas Hellström wrote:
> > On Wed, 2025-09-10 at 18:33 +0800, kernel test robot wrote:
> > > tree: https://gitlab.freedesktop.org/drm/xe/kernel.git drm-xe-
> > > next
> > > head: 844150c255c94230aec41f88db8e2875cb97439e
> > > commit: 59eabff2a3524d7f3bf6c24890cd197c4c116fcb [11/13] drm/xe:
> > > Convert xe_bo_create_pin_map() for exhaustive eviction
> > > config: loongarch-randconfig-001-20250910
> > > (
> > > https://download.01.org/0day-ci/archive/20250910/202509101853.nDmy
> > > xT
> > > EM-lkp@intel.com/config)
> > > compiler: clang version 18.1.8
> > > (
> > > https://github.com/llvm/llvm-project 3b5b5c1ec4a3095ab096dd780e84d
> > > 7a
> > > b81f3d7ff)
> > > reproduce (this is a W=1 build):
> > > (
> > > https://download.01.org/0day-ci/archive/20250910/202509101853.nDmy
> > > xT
> > > EM-lkp@intel.com/reproduce)
> > >
> > > If you fix the issue in a separate patch/commit (i.e. not just a
> > > new
> > > version of
> > > the same patch/commit), kindly add following tags
> > > > Reported-by: kernel test robot <lkp@intel.com>
> > > > Closes:
> > > > https://lore.kernel.org/oe-kbuild-all/202509101853.nDmyxTEM-lkp@intel.com/
> > >
> > > All errors (new ones prefixed by >>):
> > >
> > > > > drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump
> > > > > from
> >
> > This one looks like a clang loongarch bug. It doesn't happen on
> > clang
> > x86 and looks implausible.
>
> This does not appear for x86_64 because its defintion of _THIS_IP_ in
> arch/x86/include/asm/linkage.h does not use the address of a label
>
> #ifdef CONFIG_64BIT
> /*
> * The generic version tends to create spurious ENDBR instructions
> under
> * certain conditions.
> */
> #define _THIS_IP_ ({ unsigned long __here; asm ("lea 0(%%rip), %0"
> : "=r" (__here)); __here; })
> #endif
>
> compared to
>
> #ifndef _THIS_IP_
> #define _THIS_IP_ ({ __label__ __here; __here: (unsigned
> long)&&__here; })
> #endif
>
> for all other architectures. I can reproduce this with both arm64 and
> i386:
>
> $ make -skj"$(nproc)" ARCH=i386 LLVM=1 clean defconfig
>
> $ scripts/config -e DRM_XE -e PROVE_LOCKING
>
> $ make -skj"$(nproc)" ARCH=i386 LLVM=1 olddefconfig
> drivers/gpu/drm/xe/xe_migrate.o
> drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this
> indirect goto statement to one of its possible targets
> 422 | drm_exec_retry_on_contention(&exec);
> | ^
> include/drm/drm_exec.h:123:4: note: expanded from macro
> 'drm_exec_retry_on_contention'
> 123 | goto
> *__drm_exec_retry_ptr; \
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:465:2: note: possible target of
> indirect goto statement
> 465 | might_lock(&m->job_mutex);
> | ^
> include/linux/lockdep.h:553:33: note: expanded from macro
> 'might_lock'
> 553 | lock_release(&(lock)->dep_map,
> _THIS_IP_); \
> | ^
> include/linux/instruction_pointer.h:10:41: note: expanded from
> macro '_THIS_IP_'
> 10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned
> long)&&__here; })
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:420:2: note: jump exits scope of
> variable with __attribute__((cleanup))
> 420 | xe_validation_guard(&ctx, &xe->val, &exec, (struct
> xe_val_flags) {}, err) {
> | ^
> drivers/gpu/drm/xe/xe_validation.h:189:2: note: expanded from macro
> 'xe_validation_guard'
> 189 | scoped_guard(xe_validation, _ctx, _val, _exec,
> _flags, _ret) \
> | ^
> include/linux/cleanup.h:429:2: note: expanded from macro
> 'scoped_guard'
> 429 | __scoped_guard(_name, __UNIQUE_ID(label), args)
> | ^
> include/linux/cleanup.h:420:20: note: expanded from macro
> '__scoped_guard'
> 420 | for (CLASS(_name,
> scope)(args); \
> | ^
> drivers/gpu/drm/xe/xe_migrate.c:465:2: note: jump enters a
> statement expression
> 465 | might_lock(&m->job_mutex);
> | ^
> include/linux/lockdep.h:553:33: note: expanded from macro
> 'might_lock'
> 553 | lock_release(&(lock)->dep_map,
> _THIS_IP_); \
> | ^
> include/linux/instruction_pointer.h:10:20: note: expanded from
> macro '_THIS_IP_'
> 10 | #define _THIS_IP_ ({ __label__ __here; __here: (unsigned
> long)&&__here; })
> | ^
> ...
>
> While I agree that this is clearly a false positive because
> __drm_exec_retry_ptr is only assigned the label in
> drm_exec_until_all_locked() so we know __here will never be jumped to
> via 'goto *__drm_exec_retry_ptr;', I am not sure that this is a clang
> bug. Both compilers agree that the kernel's use of the address of a
> label in _THIS_IP_ is problematic because it does not conform to the
> only supported use case for taking the address of a label, which is
> for
> computed gotos:
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=44298
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071
> https://github.com/llvm/llvm-project/issues/138272
> https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
>
> Given that is the only supported use case, I don't think it is
> unreasonable for clang to make sure all address-taken labels in a
> function are valid jump targets for a computed goto since that is the
> only reason they should be exist in a function.
>
> This could be worked around fairly simply with something like the
> following diff.
>
> Cheers,
> Nathan
Yeah, I already have a patch in our CI that moves the goto and the
corresponding label to a separate static function so we can keep the
lockdep check.
Given your explanation, I need to change the commit message, though.
Thanks,
Thomas
>
> diff --git a/drivers/gpu/drm/xe/xe_migrate.c
> b/drivers/gpu/drm/xe/xe_migrate.c
> index 6fad5d469629..b80eddf1a36e 100644
> --- a/drivers/gpu/drm/xe/xe_migrate.c
> +++ b/drivers/gpu/drm/xe/xe_migrate.c
> @@ -462,7 +462,13 @@ int xe_migrate_init(struct xe_migrate *m)
>
> mutex_init(&m->job_mutex);
> fs_reclaim_acquire(GFP_KERNEL);
> +#ifndef CONFIG_CC_IS_CLANG
> + /*
> + * _THIS_IP_ runs afoul of clang's scope checking and the
> computed goto
> + * in drm_exec_retry_on_contention().
> + */
> might_lock(&m->job_mutex);
> +#endif
> fs_reclaim_release(GFP_KERNEL);
>
> err = devm_add_action_or_reset(xe->drm.dev, xe_migrate_fini,
> m);
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-09-11 6:34 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-10 10:33 [drm-xe:drm-xe-next 11/13] drivers/gpu/drm/xe/xe_migrate.c:422:3: error: cannot jump from this indirect goto statement to one of its possible targets kernel test robot
2025-09-10 15:16 ` Thomas Hellström
2025-09-10 19:39 ` Nathan Chancellor
2025-09-11 6:34 ` Thomas Hellström
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox