NetBSD Problem Report #60926
From www@netbsd.org Mon Oct 26 01:38:15 2026
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256
client-signature RSA-PSS (2048 bits) client-digest SHA256)
(Client CN "mail.netbsd.org", Issuer "YR1" (not verified))
by mollari.NetBSD.org (Postfix) with ESMTPS id D57C41A923B
for <gnats-bugs@gnats.NetBSD.org>; Mon, 26 Oct 2026 01:38:15 +0000 (UTC)
Message-Id: <20261026013814.09C191A923C@mollari.NetBSD.org>
Date: Mon, 26 Oct 2026 01:38:13 +0000 (UTC)
From: mrg@eterna23.net
Reply-To: mrg@eterna23.net
To: gnats-bugs@NetBSD.org
Subject: amdgpu triggers assert in ww_mutex, disabling makes it mostly stable (raven ridge)
X-Send-Pr-Version: www-1.0
X-From4GNATS: "mrg@eterna23.net via gnats" <gnats-admin@NetBSD.org>
>Number: 60926
>Category: kern
>Synopsis: amdgpu triggers assert in ww_mutex, disabling makes it mostly stable (raven ridge)
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: kern-bug-people
>State: needs-pullups
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Mon Oct 26 01:40:00 +0000 2026
>Closed-Date:
>Last-Modified: Sat Nov 07 14:10:01 +0000 2026
>Originator: matthew green
>Release: -current
>Organization:
people's front against (bozotic) www (softwar foundation)
>Environment:
amd64
>Description:
been trying to make a thinkpad A485 work nicely. most of the time,
it hangs around the mountroot point, but the output varies so much
it was never clear what was wrong. sometimes before you'd see the
amdgpu second attach phase, sometimes before, and sometimes it will
work and boot fully.
after booting, it would usually spew a few timeout messages:
warning: [drm] Fence fallback timer expired on ring gfx
warning: [drm] Fence fallback timer expired on ring comp_1.0.0
[ .. many other comp_* ]
when starting X, this appears frequently (the frequency varies, from
once a second, to twice every 2+8 seconds, etc.):
warning: [drm] Fence fallback timer expired on ring gfx
i have a tiny hack in my tree that make it mostly work, if sometimes
a little slow:
diff -p -u -r1.17 linux_ww_mutex.c
--- external/bsd/drm2/linux/linux_ww_mutex.c 16 Aug 2026 21:52:42 -0000 1.17
+++ external/bsd/drm2/linux/linux_ww_mutex.c 26 Oct 2026 01:30:17 -0000
@@ -1024,9 +1024,11 @@ ww_mutex_trylock(struct ww_mutex *mutex)
(mutex->wwm_u.ctx->wwx_owner != curlwp)),
"locking %p against myself: %p", mutex, curlwp);
#endif
+#if 0 // XXXMRG
KASSERTMSG(((mutex->wwm_state != WW_WANTOWN) ||
(mutex->wwm_u.ctx->wwx_owner != curlwp)),
"locking %p against myself: %p", mutex, curlwp);
+#endif
ret = 0;
}
mutex_exit(&mutex->wwm_lock);
the core file absolutely indicates that wwm_state is WW_WANTOWN and the
owner is curlwp, and my surveying of the usage of WW_WANTOWN should this
shouldn't happen, so i don't know _what_ is happening yet, but since this
is all in linux_ww_mutex.c i plan to add instrumentation there to figure
it out. (dtrace is hard here, since mostly it hangs at boot.)
>How-To-Repeat:
boot -current on a thinkpad a485.
>Fix:
see hack above. with this, the laptop becomes at least usable...sigh.
>Release-Note:
>Audit-Trail:
From: matthew green <mrg@eterna23.net>
To: gnats-bugs@netbsd.org
Cc:
Subject: re: kern/60926: amdgpu triggers assert in ww_mutex, disabling makes it mostly stable (raven ridge)
Date: Mon, 26 Oct 2026 15:10:39 +1100
i meant to include eg, stack trace info.
here's what gdb has to say:
(gdb) bt
#0 0xffffffff80239fca in cpu_reboot (howto=3Dhowto@entry=3D260, bootstr=3D=
bootstr@entry=3D0x0) at /usr/src3/sys/arch/amd64/amd64/machdep.c:880
#1 0xffffffff80d766e8 in kern_reboot (howto=3Dhowto@entry=3D260, bootstr=3D=
bootstr@entry=3D0x0) at /usr/src3/sys/kern/kern_reboot.c:91
#2 0xffffffff80dc5a75 in vpanic (fmt=3D0xffffffff813cfb68 "kernel %sasser=
tion \"%s\" failed: file \"%s\", line %d locking %p against myself: %p",
ap=3Dap@entry=3D0xffff920942174928) at /usr/src3/sys/kern/subr_prf.c:2=
88
#3 0xffffffff80fb0b44 in kern_assert (fmt=3Dfmt@entry=3D0xffffffff813cfb6=
8 "kernel %sassertion \"%s\" failed: file \"%s\", line %d locking %p again=
st myself: %p")
at /usr/src3/sys/lib/libkern/kern_assert.c:51
#4 0xffffffff80f473c9 in linux_ww_mutex_trylock (mutex=3D0xffff86bc4023d1=
e0) at ./machine/cpu.h:80
#5 0xffffffff80f3ae14 in linux_dma_resv_trylock (robj=3D<optimized out>) =
at /usr/src3/sys/external/bsd/drm2/linux/linux_dma_resv.c:216
#6 0xffffffff80f49952 in ttm_bo_cleanup_refs_or_queue (bo=3D0xffff86bc3fe=
51358) at /usr/src3/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:500
#7 ttm_bo_release (kref=3D0xffff86bc3fe514f0) at /usr/src3/sys/external/b=
sd/drm2/dist/drm/ttm/ttm_bo.c:696
#8 0xffffffff80f4a68d in kref_sub (count=3D1, kref=3D<optimized out>, rel=
ease=3D0xffffffff80f4985f <ttm_bo_release>)
at /usr/src3/sys/external/bsd/drm2/include/linux/kref.h:94
#9 0xffffffff80988fbf in amdgpu_bo_unref (bo=3Dbo@entry=3D0xffff9200450cf=
8d0) at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_object.=
c:866
#10 0xffffffff809e8059 in amdgpu_vm_free_table (entry=3Dentry@entry=3D0xff=
ff9200450cf8c8) at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amd=
gpu_vm.c:963
#11 0xffffffff809e91f3 in amdgpu_vm_free_pts (adev=3D<optimized out>, vm=3D=
<optimized out>, start=3D0xffff920942174af0)
at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c:991
#12 amdgpu_vm_update_ptes (params=3D0xffff920942174b10, start=3D<optimized=
out>, end=3D34360808448, dst=3D2860515328, flags=3D113)
at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c:154=
9
#13 amdgpu_vm_bo_update_mapping (adev=3Dadev@entry=3D0xffff920043a10008, v=
m=3Dvm@entry=3D0xffff86bc430c5008, direct=3Ddirect@entry=3Dfalse, exclusiv=
e=3Dexclusive@entry=3D0x0,
start=3Dstart@entry=3D34360807424, last=3Dlast@entry=3D34360808447, fl=
ags=3D113, addr=3D<optimized out>, pages_addr=3D0x0, fence=3Dfence@entry=3D=
0xffff86bc456c5500)
at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c:161=
7
#14 0xffffffff809ea5f4 in amdgpu_vm_bo_split_mapping (adev=3D0xffff920043a=
10008, exclusive=3D<optimized out>, pages_addr=3D<optimized out>, vm=3D<op=
timized out>,
mapping=3D0xffff86bc3db59348, flags=3D432345564227567729, bo_adev=3D<o=
ptimized out>, nodes=3D<optimized out>, fence=3D<optimized out>)
at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c:174=
4
#15 amdgpu_vm_bo_update (adev=3Dadev@entry=3D0xffff920043a10008, bo_va=3Db=
o_va@entry=3D0xffff86bc456c54c8, clear=3Dclear@entry=3Dfalse)
at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c:183=
3
#16 0xffffffff80928af5 in amdgpu_gem_va_update_vm (adev=3D0xffff920043a100=
08, vm=3D0xffff86bc430c5008, bo_va=3D0xffff86bc456c54c8, operation=3D1)
at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_gem.c:54=
0
#17 amdgpu_gem_va_ioctl (dev=3D<optimized out>, data=3D<optimized out>, fi=
lp=3D<optimized out>)
at /usr/src3/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_gem.c:70=
1
#18 0xffffffff80bb572c in drm_ioctl (fp=3D<optimized out>, cmd=3D<optimize=
d out>, data=3D0xffff920942174ee0)
at /usr/src3/sys/external/bsd/drm2/dist/drm/drm_ioctl.c:980
#19 0xffffffff80b79505 in drm_ioctl_shim (fp=3D<optimized out>, cmd=3D<opt=
imized out>, data=3D<optimized out>)
at /usr/src3/sys/external/bsd/drm2/drm/drm_cdevsw.c:393
#20 0xffffffff80ddd9d0 in sys_ioctl (l=3D<optimized out>, uap=3D0xffff9209=
42175000, retval=3D<optimized out>) at /usr/src3/sys/kern/sys_generic.c:67=
5
#21 0xffffffff805da02d in sy_call (sy=3D0xffffffff816432d0 <sysent+1296>, =
l=3D0xffff86bc42cfc400, uap=3D0xffff920942175000, rval=3D0xffff920942174fb=
0)
at /usr/src3/sys/sys/syscallvar.h:65
#22 sy_invoke (sy=3D0xffffffff816432d0 <sysent+1296>, l=3D0xffff86bc42cfc4=
00, uap=3D0xffff920942175000, rval=3D0xffff920942174fb0, code=3D54)
at /usr/src3/sys/sys/syscallvar.h:94
#23 syscall (frame=3D0xffff920942175000) at /usr/src3/sys/arch/x86/x86/sys=
call.c:137
#24 0xffffffff8021025d in handle_syscall ()
(gdb) p *mutex
$3 =3D {
wwm_state =3D 3 '\003',
wwm_debug =3D true,
wwm_u =3D {
owner =3D 0xffff920942174cf8,
ctx =3D 0xffff920942174cf8
},
wwm_lock =3D {
u =3D {
mtxa_owner =3D 67073,
s =3D {
mtxs_dummy =3D 1 '\001',
mtxs_ipl =3D {
_ipl =3D 6 '\006'
},
mtxs_lock =3D 1 '\001',
mtxs_unused =3D 0 '\000'
} =
} =
},
wwm_class =3D 0xffffffff8167a740 <linux_reservation_ww_class>,
wwm_waiters =3D {
rbt_root =3D 0x0,
rbt_ops =3D 0xffffffff81282700 <ww_acquire_ctx_rb_ops>,
rbt_minmax =3D {0xffff86bc4023d200, 0xffff86bc4023d200}
},
wwm_cv =3D {
cv_opaque =3D {0xffff86c32961c800, 0xffffffff81300125}
} =
} =
(gdb) p *$4->l_proc
[ ... ]
p_path =3D 0xffff86bc35ef58a0 "/usr/X11R7/bin/X",
ie, this is X server itself.
crash shows:
crash> bt
__kernel_end() at 0
kern_reboot() at kern_reboot+0x5f
vpanic() at vpanic+0x197
__x86_indirect_thunk_r8() at __x86_indirect_thunk_r8+0xd
linux_ww_mutex_unlock() at linux_ww_mutex_unlock+0x44
linux_dma_resv_trylock() at linux_dma_resv_trylock+0x9
ttm_bo_release() at ttm_bo_release+0x133
amdgpu_bo_unref() at amdgpu_bo_unref+0x1d
amdgpu_vm_free_table() at amdgpu_vm_free_table+0x5c
amdgpu_vm_bo_update_mapping() at amdgpu_vm_bo_update_mapping+0x840
amdgpu_vm_bo_update() at amdgpu_vm_bo_update+0x2d2
amdgpu_gem_va_ioctl() at amdgpu_gem_va_ioctl+0x500
drm_ioctl() at drm_ioctl+0x2ad
drm_ioctl_shim() at drm_ioctl_shim+0x38
sys_ioctl() at sys_ioctl+0x256
syscall() at syscall+0xaf
--- syscall (number 54) ---
crash> show lock 0xffff86bc4023d1e0
lock address : ffff86bc4023d1e0
type : sleep/adaptive
initialized : linux_dma_resv_init+0x18
shared holds : 0 exclusive: 1
shares wanted: 0 exclusive: 3
relevant cpu : 4294967295 last held: 0
relevant lwp : 000000000000000000 last held: 0xffff86bc42cfc400
last locked* : ttm_eu_reserve_buffers+0x184
unlocked : ttm_bo_delayed_delete+0x13
State-Changed-From-To: open->needs-pullups
State-Changed-By: riastradh@NetBSD.org
State-Changed-When: Sat, 07 Nov 2026 14:05:17 +0000
State-Changed-Why:
fixed in HEAD, needs pullup-11, pullup-10
From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc:
Subject: PR/60926 CVS commit: src/sys/external/bsd/drm2/linux
Date: Sat, 7 Nov 2026 14:05:03 +0000
Module Name: src
Committed By: riastradh
Date: Sat Nov 7 14:05:02 UTC 2026
Modified Files:
src/sys/external/bsd/drm2/linux: linux_ww_mutex.c
Log Message:
linux ww_mutex: Nix another assertion that trips in sketchy path.
Under the premise (explained in the comment above) that it is
legitimate for the upstream Linux code to do ww_mutex_trylock on a
mutex already held by the current thread, we can't assert
mutex->wwm_state != WW_WANTOWN ||
mutex->wwm_u.ctx->wwx_owner != curlwp
any more than we can assert
mutex->wwm_state != WW_CTX ||
mutex->wwm_u.ctx->wwx_owner != curlwp
because if the latter condition is possible, then any concurrent
thread tries to acquire the mutex a moment before we test that
condition will turn it into the former condition, i.e., transition to
mutex->wwm_state = WW_WANTOWN with mutex->wwm_u.ctx->wwx_owner =
curlwp.
PR kern/60926: amdgpu triggers assert in ww_mutex, disabling makes it
mostly stable (raven ridge)
To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/external/bsd/drm2/linux/linux_ww_mutex.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
>Unformatted:
(Contact us)
$NetBSD: query-full-pr,v 1.51 2026/08/10 02:28:17 riastradh Exp $
$NetBSD: gnats_config.sh,v 1.10 2026/05/13 22:00:09 riastradh Exp $
Copyright © 1994-2026
The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.