NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
kern/60732: amdgpu attempts to take (sleeping) mutex while holding a spin lock
>Number: 60732
>Category: kern
>Synopsis: amdgpu attempts to take (sleeping) mutex while holding a spin lock
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: kern-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Wed Sep 16 00:30:00 +0000 2026
>Originator: matthew green
>Release: -current from 2026-09-15
>Organization:
people's front against (bozotic) www (softwar foundation)
>Environment:
NetBSD the-blessing.eterna23.net 11.99.8 NetBSD 11.99.8 (_blessing_) #472: Mon Sep 14 19:19:02 PDT 2026 mrg%yesterday-when-i-was-mad.eterna23.net@localhost:/var/obj/amd64-x86_64/usr/src/sys/arch/amd64/compile/_blessing_ amd64
>Description:
while trying to trigger a different locking issue in amdgpu (that annoyingly
disappeared when LOCKDEBUG was enabled), i triggered a locking issue after
restarting X a 4th time. (i don't think 4 matters. whatever causes this
problem just is not always happening.)
[ 7579.5137040] Mutex error: mutex_vector_enter,525: spin lock held
[ 7579.5237038] lock address : ffff8694655bb930
[ 7579.5237038] type : spin
[ 7579.5237038] initialized : netbsd:amdgpu_gtt_mgr_init+0x71
[ 7579.5337039] shared holds : 0 exclusive: 1
[ 7579.5437036] shares wanted: 0 exclusive: 0
[ 7579.5437036] relevant cpu : 14 last held: 14
[ 7579.5537038] relevant lwp : 0xffff86a34bed5800 last held: 0xffff86a34bed5800
[ 7579.5637033] last locked* : netbsd:amdgpu_gtt_mgr_recover+0x21
[ 7579.5637033] unlocked : netbsd:amdgpu_gtt_mgr_del+0x41
[ 7579.5737033] owner field : 0x0000000000010600 wait/spin: 0/1
[ 7579.5837034] panic: LOCKDEBUG: Mutex error: mutex_vector_enter,525: spin lock held
#4 0xffffffff8105112b in lockdebug_abort1 (func=0xffffffff81832640 <__func__.4> "mutex_vector_enter", line=525, ld=0xffff95008810a5c0, s=6,
msg=0xffffffff818cfbec "spin lock held", dopanic=true) at /usr/src/sys/kern/subr_lockdebug.c:818
#5 lockdebug_abort1 (func=0xffffffff81832640 <__func__.4> "mutex_vector_enter", line=525, ld=0xffff95008810a5c0, s=6,
msg=0xffffffff818cfbec "spin lock held", dopanic=<optimized out>) at /usr/src/sys/kern/subr_lockdebug.c:796
#6 0xffffffff81002b2c in mutex_vector_enter (mtx=0xffff950088143390) at /usr/src/sys/kern/kern_mutex.c:525
#7 0xffffffff809b37a4 in mutex_lock (mutex=0xffff950088143390) at /usr/src/sys/external/bsd/drm2/include/linux/mutex.h:76
#8 gmc_v10_0_flush_gpu_tlb (adev=0xffff95008813e008, vmid=0, vmhub=0, flush_type=<optimized out>)
at /usr/src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_gmc_v10_0.c:353
#9 0xffffffff80972447 in amdgpu_gart_post_update (adev=adev@entry=0xffff95008813e008, gpu_pgstart=gpu_pgstart@entry=1024, gpu_npages=gpu_npages@entry=1)
at /usr/src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_gart.c:299
#10 0xffffffff80972ba7 in amdgpu_gart_bind (adev=0xffff95008813e008, gpu_start=<optimized out>, npages=1, pages=<optimized out>, dmamap=<optimized out>,
flags=<optimized out>) at /usr/src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_gart.c:523
#11 0xffffffff80a02b5f in amdgpu_ttm_gart_bind (adev=<optimized out>, tbo=<optimized out>, flags=844424930132087)
at /usr/src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_ttm.c:1093
#12 0xffffffff809baf11 in amdgpu_gtt_mgr_recover (man=man@entry=0xffff950088142e10) at /usr/src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_gtt_mgr.c:339
#13 0xffffffff8096ae11 in amdgpu_do_asic_reset (hive=<optimized out>, device_list_handle=0xffff95125ce66e80, need_full_reset_arg=0xffff95125ce66e7f)
at /usr/src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c:4121
#14 amdgpu_device_gpu_recover (adev=<optimized out>, job=job@entry=0xffff869466e4b488)
at /usr/src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_device.c:4391
#15 0xffffffff809be765 in amdgpu_job_timedout (s_job=0xffff869466e4b488) at /usr/src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_job.c:58
#16 0xffffffff80e18c8a in drm_sched_job_timedout (work=0xffff9500881457e0) at /usr/src/sys/external/bsd/drm2/dist/drm/scheduler/sched_main.c:318
#17 0xffffffff80e0df7b in linux_workqueue_thread (cookie=0xffff86a34bed8000) at /usr/src/sys/external/bsd/common/linux/linux_work.c:455
#18 0xffffffff80210327 in lwp_trampoline ()
the problem is that at the higher level (frame 12 above), a spinlock is taken:
329 int amdgpu_gtt_mgr_recover(struct ttm_mem_type_manager *man)
...
336 spin_lock(&mgr->lock);
337 drm_mm_for_each_node(mm_node, &mgr->mm) {
338 node = container_of(mm_node, struct amdgpu_gtt_node, node);
339 r = amdgpu_ttm_recover_gart(node->tbo);
340 if (r)
341 break;
342 }
343 spin_unlock(&mgr->lock);
however, downstack at frame 8, this sleeping mutex is taken:
341 static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
342 uint32_t vmhub, uint32_t flush_type)
...
353 mutex_lock(&adev->mman.gtt_window_lock);
this violates locking and panic appears.
>How-To-Repeat:
startx multiple times with a AMD RX 5300 GPU installed.
>Fix:
don't take sleep mutex when holding spinlock? :-)
idea i did not look at to see if feasible or try, would be to
make the mutex into an spin mutex.
Home |
Main Index |
Thread Index |
Old Index