NetBSD Problem Report #56557

From gson@gson.org  Sun Dec 19 19:33:20 2021
Return-Path: <gson@gson.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))
	(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id A81E61A9239
	for <gnats-bugs@gnats.NetBSD.org>; Sun, 19 Dec 2021 19:33:20 +0000 (UTC)
Message-Id: <20211219193306.DC5A925415D@guava.gson.org>
Date: Sun, 19 Dec 2021 21:33:06 +0200 (EET)
From: gson@gson.org (Andreas Gustafsson)
Reply-To: gson@gson.org (Andreas Gustafsson)
To: gnats-bugs@NetBSD.org
Subject: Boot fails with DRM assertion failure
X-Send-Pr-Version: 3.95

>Number:         56557
>Category:       kern
>Synopsis:       Boot fails with DRM assertion failure
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    kern-bug-people
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Dec 19 19:35:01 +0000 2021
>Closed-Date:    Sun Dec 26 21:08:06 +0000 2021
>Last-Modified:  Sun Dec 26 21:08:06 +0000 2021
>Originator:     Andreas Gustafsson
>Release:        NetBSD-current, source date 2021.12.19.16.01.29
>Organization:

>Environment:
System: NetBSD
Architecture: i386
Machine: i386
>Description:

After today's DRM update, my Dell Latitude D400 i386 laptop testbed
panics on boot with the message

  [   7.2163355] panic: kernel diagnostic assertion "!ctx->wwx_acquire_done" failed: file "/tmp/build/2021.12.19.16.01.29-i386-laptop/src/sys/external/bsd/drm2/linux/linux_ww_mutex.c", line 555 ctx 0xc2715f44 done acquiring locks, can't acquire more

Console log:

  https://www.gson.org/netbsd/bugs/build/i386-laptop/2021/2021.12.19.16.01.29/test.log

Before the DRM update, the machine in case was already reporting DRM
errors on boot, but it did boot:

  https://www.gson.org/netbsd/bugs/build/i386-laptop/2021/2021.12.18.18.05.55/test.log

>How-To-Repeat:

Boot -current/i386 on a Dell Latitude D400.

>Fix:

>Release-Note:

>Audit-Trail:
From: Taylor R Campbell <riastradh@NetBSD.org>
To: gnats-bugs@NetBSD.org
Cc: gson@gson.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Fri, 24 Dec 2021 14:21:50 +0000

 This is a multi-part message in MIME format.
 --=_QSVhpQW7wL2t2ZyM0lNb6kI+m4HN6cIl

 Can you get a log with the attached patch?  Won't fix anything, but
 the stack trace it prints might help with diagnosis.

 --=_QSVhpQW7wL2t2ZyM0lNb6kI+m4HN6cIl
 Content-Type: text/plain; charset="ISO-8859-1"; name="wwacqdone"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment; filename="wwacqdone.patch"

 diff --git a/sys/external/bsd/drm2/linux/linux_ww_mutex.c b/sys/external/bs=
 d/drm2/linux/linux_ww_mutex.c
 index 5e443aa3f54b..4dd077c0b1e0 100644
 --- a/sys/external/bsd/drm2/linux/linux_ww_mutex.c
 +++ b/sys/external/bsd/drm2/linux/linux_ww_mutex.c
 @@ -98,6 +98,7 @@ ww_acquire_init(struct ww_acquire_ctx *ctx, struct ww_cla=
 ss *class)
  	ctx->wwx_acquire_done =3D false;
  }
 =20
 +#include <ddb/ddb.h>
  void
  ww_acquire_done(struct ww_acquire_ctx *ctx)
  {
 @@ -105,6 +106,8 @@ ww_acquire_done(struct ww_acquire_ctx *ctx)
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 =20
 +	printf("%s ctx=3D%p\n", __func__, ctx);
 +	db_stacktrace();
  	ctx->wwx_acquire_done =3D true;
  }
 =20

 --=_QSVhpQW7wL2t2ZyM0lNb6kI+m4HN6cIl--

From: Taylor R Campbell <riastradh@NetBSD.org>
To: gnats-bugs@NetBSD.org
Cc: gson@gson.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Fri, 24 Dec 2021 15:03:15 +0000

 This is a multi-part message in MIME format.
 --=_rFLsIlDMAmZS54PhaM3eE2ii5a8qA3Zz

 Never mind, there's only one stack trace it could print -- don't need
 the diagnostic after all.

 Can you try the attached patch and see if it helps?

 --=_rFLsIlDMAmZS54PhaM3eE2ii5a8qA3Zz
 Content-Type: text/plain; charset="ISO-8859-1"; name="wwcheck"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment; filename="wwcheck.patch"

 diff --git a/sys/external/bsd/drm2/linux/linux_ww_mutex.c b/sys/external/bs=
 d/drm2/linux/linux_ww_mutex.c
 index 5e443aa3f54b..a7ec0a666e10 100644
 --- a/sys/external/bsd/drm2/linux/linux_ww_mutex.c
 +++ b/sys/external/bsd/drm2/linux/linux_ww_mutex.c
 @@ -108,6 +108,21 @@ ww_acquire_done(struct ww_acquire_ctx *ctx)
  	ctx->wwx_acquire_done =3D true;
  }
 =20
 +static void
 +ww_acquire_done_check(struct ww_mutex *mutex, struct ww_acquire_ctx *ctx)
 +{
 +
 +	/*
 +	 * If caller has invoked ww_acquire_done, we must already hold
 +	 * this mutex.
 +	 */
 +	KASSERT(mutex_owned(&mutex->wwm_lock));
 +	KASSERT((!ctx->wwx_acquire_done ||
 +		(mutex->wwm_state =3D=3D WW_CTX && mutex->wwm_u.ctx =3D=3D ctx)),
 +	    "ctx %p done acquiring locks, refusing to acquire %p",
 +	    ctx, mutex);
 +}
 +
  void
  ww_acquire_fini(struct ww_acquire_ctx *ctx)
  {
 @@ -552,8 +567,6 @@ ww_mutex_lock(struct ww_mutex *mutex, struct ww_acquire=
 _ctx *ctx)
 =20
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 -	KASSERTMSG(!ctx->wwx_acquire_done,
 -	    "ctx %p done acquiring locks, can't acquire more", ctx);
  	KASSERTMSG((ctx->wwx_acquired !=3D ~0U),
  	    "ctx %p finished, can't be used any more", ctx);
  	KASSERTMSG((ctx->wwx_class =3D=3D mutex->wwm_class),
 @@ -561,6 +574,7 @@ ww_mutex_lock(struct ww_mutex *mutex, struct ww_acquire=
 _ctx *ctx)
  	    ctx, ctx->wwx_class, mutex, mutex->wwm_class);
 =20
  	mutex_enter(&mutex->wwm_lock);
 +	ww_acquire_done_check(mutex, ctx);
  retry:	switch (mutex->wwm_state) {
  	case WW_UNLOCKED:
  		WW_WANTLOCK(mutex);
 @@ -673,8 +687,6 @@ ww_mutex_lock_interruptible(struct ww_mutex *mutex, str=
 uct ww_acquire_ctx *ctx)
 =20
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 -	KASSERTMSG(!ctx->wwx_acquire_done,
 -	    "ctx %p done acquiring locks, can't acquire more", ctx);
  	KASSERTMSG((ctx->wwx_acquired !=3D ~0U),
  	    "ctx %p finished, can't be used any more", ctx);
  	KASSERTMSG((ctx->wwx_class =3D=3D mutex->wwm_class),
 @@ -682,6 +694,7 @@ ww_mutex_lock_interruptible(struct ww_mutex *mutex, str=
 uct ww_acquire_ctx *ctx)
  	    ctx, ctx->wwx_class, mutex, mutex->wwm_class);
 =20
  	mutex_enter(&mutex->wwm_lock);
 +	ww_acquire_done_check(mutex, ctx);
  retry:	switch (mutex->wwm_state) {
  	case WW_UNLOCKED:
  		WW_WANTLOCK(mutex);
 @@ -795,8 +808,6 @@ ww_mutex_lock_slow(struct ww_mutex *mutex, struct ww_ac=
 quire_ctx *ctx)
 =20
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 -	KASSERTMSG(!ctx->wwx_acquire_done,
 -	    "ctx %p done acquiring locks, can't acquire more", ctx);
  	KASSERTMSG((ctx->wwx_acquired !=3D ~0U),
  	    "ctx %p finished, can't be used any more", ctx);
  	KASSERTMSG((ctx->wwx_acquired =3D=3D 0),
 @@ -807,6 +818,7 @@ ww_mutex_lock_slow(struct ww_mutex *mutex, struct ww_ac=
 quire_ctx *ctx)
  	    ctx, ctx->wwx_class, mutex, mutex->wwm_class);
 =20
  	mutex_enter(&mutex->wwm_lock);
 +	ww_acquire_done_check(mutex, ctx);
  retry:	switch (mutex->wwm_state) {
  	case WW_UNLOCKED:
  		mutex->wwm_state =3D WW_CTX;
 @@ -874,8 +886,6 @@ ww_mutex_lock_slow_interruptible(struct ww_mutex *mutex,
 =20
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 -	KASSERTMSG(!ctx->wwx_acquire_done,
 -	    "ctx %p done acquiring locks, can't acquire more", ctx);
  	KASSERTMSG((ctx->wwx_acquired !=3D ~0U),
  	    "ctx %p finished, can't be used any more", ctx);
  	KASSERTMSG((ctx->wwx_acquired =3D=3D 0),
 @@ -886,6 +896,7 @@ ww_mutex_lock_slow_interruptible(struct ww_mutex *mutex,
  	    ctx, ctx->wwx_class, mutex, mutex->wwm_class);
 =20
  	mutex_enter(&mutex->wwm_lock);
 +	ww_acquire_done_check(mutex, ctx);
  retry:	switch (mutex->wwm_state) {
  	case WW_UNLOCKED:
  		mutex->wwm_state =3D WW_CTX;

 --=_rFLsIlDMAmZS54PhaM3eE2ii5a8qA3Zz--

From: Taylor R Campbell <riastradh@NetBSD.org>
To: gnats-bugs@NetBSD.org
Cc: gson@gson.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Fri, 24 Dec 2021 15:27:55 +0000

 This is a multi-part message in MIME format.
 --=_3LM3Qr5snjR6jwWdKR2eeC80vJ4rOpBA

 Correction, let's try this patch that actually builds!  (KASSERTMSG,
 not KASSERT.)

 --=_3LM3Qr5snjR6jwWdKR2eeC80vJ4rOpBA
 Content-Type: text/plain; charset="ISO-8859-1"; name="wwcheck_v2"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment; filename="wwcheck_v2.patch"


 --=_3LM3Qr5snjR6jwWdKR2eeC80vJ4rOpBA--

From: Taylor R Campbell <riastradh@NetBSD.org>
To: gnats-bugs@NetBSD.org
Cc: gson@gson.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Fri, 24 Dec 2021 15:30:43 +0000

 > Date: Fri, 24 Dec 2021 15:27:55 +0000
 > From: Taylor R Campbell <riastradh@NetBSD.org>
 > 
 > Correction, let's try this patch that actually builds!  (KASSERTMSG,
 > not KASSERT.)

 ...maybe with a nonempty patch (although I'm sure the empty one builds
 too!).

From: Taylor R Campbell <riastradh@NetBSD.org>
To: gnats-bugs@NetBSD.org
Cc: gson@gson.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Fri, 24 Dec 2021 15:36:47 +0000

 This is a multi-part message in MIME format.
 --=_17Wymd7lPaKOmlAiVMiz9N/EY5eA0fm1

 Umpteenth's time's the charm, right?

 --=_17Wymd7lPaKOmlAiVMiz9N/EY5eA0fm1
 Content-Type: text/plain; charset="ISO-8859-1"; name="wwcheck_v2"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment; filename="wwcheck_v2.patch"

 diff --git a/sys/external/bsd/drm2/linux/linux_ww_mutex.c b/sys/external/bs=
 d/drm2/linux/linux_ww_mutex.c
 index 5e443aa3f54b..75e45a250497 100644
 --- a/sys/external/bsd/drm2/linux/linux_ww_mutex.c
 +++ b/sys/external/bsd/drm2/linux/linux_ww_mutex.c
 @@ -108,6 +108,21 @@ ww_acquire_done(struct ww_acquire_ctx *ctx)
  	ctx->wwx_acquire_done =3D true;
  }
 =20
 +static void
 +ww_acquire_done_check(struct ww_mutex *mutex, struct ww_acquire_ctx *ctx)
 +{
 +
 +	/*
 +	 * If caller has invoked ww_acquire_done, we must already hold
 +	 * this mutex.
 +	 */
 +	KASSERT(mutex_owned(&mutex->wwm_lock));
 +	KASSERTMSG((!ctx->wwx_acquire_done ||
 +		(mutex->wwm_state =3D=3D WW_CTX && mutex->wwm_u.ctx =3D=3D ctx)),
 +	    "ctx %p done acquiring locks, refusing to acquire %p",
 +	    ctx, mutex);
 +}
 +
  void
  ww_acquire_fini(struct ww_acquire_ctx *ctx)
  {
 @@ -552,8 +567,6 @@ ww_mutex_lock(struct ww_mutex *mutex, struct ww_acquire=
 _ctx *ctx)
 =20
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 -	KASSERTMSG(!ctx->wwx_acquire_done,
 -	    "ctx %p done acquiring locks, can't acquire more", ctx);
  	KASSERTMSG((ctx->wwx_acquired !=3D ~0U),
  	    "ctx %p finished, can't be used any more", ctx);
  	KASSERTMSG((ctx->wwx_class =3D=3D mutex->wwm_class),
 @@ -561,6 +574,7 @@ ww_mutex_lock(struct ww_mutex *mutex, struct ww_acquire=
 _ctx *ctx)
  	    ctx, ctx->wwx_class, mutex, mutex->wwm_class);
 =20
  	mutex_enter(&mutex->wwm_lock);
 +	ww_acquire_done_check(mutex, ctx);
  retry:	switch (mutex->wwm_state) {
  	case WW_UNLOCKED:
  		WW_WANTLOCK(mutex);
 @@ -673,8 +687,6 @@ ww_mutex_lock_interruptible(struct ww_mutex *mutex, str=
 uct ww_acquire_ctx *ctx)
 =20
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 -	KASSERTMSG(!ctx->wwx_acquire_done,
 -	    "ctx %p done acquiring locks, can't acquire more", ctx);
  	KASSERTMSG((ctx->wwx_acquired !=3D ~0U),
  	    "ctx %p finished, can't be used any more", ctx);
  	KASSERTMSG((ctx->wwx_class =3D=3D mutex->wwm_class),
 @@ -682,6 +694,7 @@ ww_mutex_lock_interruptible(struct ww_mutex *mutex, str=
 uct ww_acquire_ctx *ctx)
  	    ctx, ctx->wwx_class, mutex, mutex->wwm_class);
 =20
  	mutex_enter(&mutex->wwm_lock);
 +	ww_acquire_done_check(mutex, ctx);
  retry:	switch (mutex->wwm_state) {
  	case WW_UNLOCKED:
  		WW_WANTLOCK(mutex);
 @@ -795,8 +808,6 @@ ww_mutex_lock_slow(struct ww_mutex *mutex, struct ww_ac=
 quire_ctx *ctx)
 =20
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 -	KASSERTMSG(!ctx->wwx_acquire_done,
 -	    "ctx %p done acquiring locks, can't acquire more", ctx);
  	KASSERTMSG((ctx->wwx_acquired !=3D ~0U),
  	    "ctx %p finished, can't be used any more", ctx);
  	KASSERTMSG((ctx->wwx_acquired =3D=3D 0),
 @@ -807,6 +818,7 @@ ww_mutex_lock_slow(struct ww_mutex *mutex, struct ww_ac=
 quire_ctx *ctx)
  	    ctx, ctx->wwx_class, mutex, mutex->wwm_class);
 =20
  	mutex_enter(&mutex->wwm_lock);
 +	ww_acquire_done_check(mutex, ctx);
  retry:	switch (mutex->wwm_state) {
  	case WW_UNLOCKED:
  		mutex->wwm_state =3D WW_CTX;
 @@ -874,8 +886,6 @@ ww_mutex_lock_slow_interruptible(struct ww_mutex *mutex,
 =20
  	KASSERTMSG((ctx->wwx_owner =3D=3D curlwp),
  	    "ctx %p owned by %p, not self (%p)", ctx, ctx->wwx_owner, curlwp);
 -	KASSERTMSG(!ctx->wwx_acquire_done,
 -	    "ctx %p done acquiring locks, can't acquire more", ctx);
  	KASSERTMSG((ctx->wwx_acquired !=3D ~0U),
  	    "ctx %p finished, can't be used any more", ctx);
  	KASSERTMSG((ctx->wwx_acquired =3D=3D 0),
 @@ -886,6 +896,7 @@ ww_mutex_lock_slow_interruptible(struct ww_mutex *mutex,
  	    ctx, ctx->wwx_class, mutex, mutex->wwm_class);
 =20
  	mutex_enter(&mutex->wwm_lock);
 +	ww_acquire_done_check(mutex, ctx);
  retry:	switch (mutex->wwm_state) {
  	case WW_UNLOCKED:
  		mutex->wwm_state =3D WW_CTX;

 --=_17Wymd7lPaKOmlAiVMiz9N/EY5eA0fm1--

From: Andreas Gustafsson <gson@gson.org>
To: Taylor R Campbell <riastradh@NetBSD.org>
Cc: gnats-bugs@NetBSD.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Fri, 24 Dec 2021 18:00:40 +0200

 Taylor R Campbell wrote:
 > Never mind, there's only one stack trace it could print -- don't need
 > the diagnostic after all.

 Here it is anyway, as it was already close to completion:

   https://www.gson.org/netbsd/bugs/build/i386-laptop/2021/2021.12.24.11.19.55/test.log

 Building with the new patch now.
 -- 
 Andreas Gustafsson, gson@gson.org

From: Andreas Gustafsson <gson@gson.org>
To: Taylor R Campbell <riastradh@NetBSD.org>
Cc: gnats-bugs@NetBSD.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Fri, 24 Dec 2021 20:19:11 +0200

 Taylor R Campbell wrote:
 > Umpteenth's time's the charm, right?

 Console log with that patch:

 https://www.gson.org/netbsd/bugs/build/i386-laptop/2021/2021.12.24.15.26.35/test.log

 -- 
 Andreas Gustafsson, gson@gson.org

From: Taylor R Campbell <riastradh@NetBSD.org>
To: Andreas Gustafsson <gson@gson.org>
Cc: gnats-bugs@NetBSD.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Sat, 25 Dec 2021 20:47:42 +0000

 > Date: Fri, 24 Dec 2021 20:19:11 +0200
 > From: Andreas Gustafsson <gson@gson.org>
 >=20
 > Taylor R Campbell wrote:
 > > Umpteenth's time's the charm, right?
 >=20
 > Console log with that patch:
 >=20
 > https://www.gson.org/netbsd/bugs/build/i386-laptop/2021/2021.12.24.15.26.=
 35/test.log

 Thanks.  Any chance you have a way to enter ddb when it hangs, and see
 ps and bt output?  Also, can you boot with -vx?

From: Andreas Gustafsson <gson@gson.org>
To: Taylor R Campbell <riastradh@NetBSD.org>
Cc: gnats-bugs@NetBSD.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Sun, 26 Dec 2021 11:31:28 +0200

 Taylor R Campbell wrote:
 > Thanks.  Any chance you have a way to enter ddb when it hangs, and see
 > ps and bt output?  Also, can you boot with -vx?

 Yes (and in case anyone wonders why my answer is different than in
 PR 56570, it's because this time the problem occurs when booting the
 installed system from disk rather than when netbooting the installer).
 A new console log is at:

   https://www.gson.org/netbsd/bugs/56557/console.log

 I'm leaving the system at the ddb prompt for now in case you would
 like me to run additional commands.
 -- 
 Andreas Gustafsson, gson@gson.org

From: Taylor R Campbell <riastradh@NetBSD.org>
To: Andreas Gustafsson <gson@gson.org>
Cc: gnats-bugs@NetBSD.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Sun, 26 Dec 2021 16:08:11 +0000

 This is a multi-part message in MIME format.
 --=_17Wymd7lPaKOmlAiVMiz9N/EY5eA0fm1

 Can you try the attached patch?  If that doesn't work, can you try a
 DIAGNOSTIC/DEBUG/LOCKDEBUG kernel?

 --=_17Wymd7lPaKOmlAiVMiz9N/EY5eA0fm1
 Content-Type: text/plain; charset="ISO-8859-1"; name="vblank"
 Content-Transfer-Encoding: quoted-printable
 Content-Disposition: attachment; filename="vblank.patch"

 From 025745d6f43aff21c88bc9e3b393ce146fc9af04 Mon Sep 17 00:00:00 2001
 From: Taylor R Campbell <riastradh@NetBSD.org>
 Date: Sun, 26 Dec 2021 16:05:20 +0000
 Subject: [PATCH] drm: Fix locking around accurate vblank counts.

 - Make drm_crtc_accurate_vblank_count require the caller to hold the
   event lock, rather than take it internally.

 - Fix locking around drm_crtc_accurate_vblank_count and related
   operations in amdgpu and nouveau interrupt handlers.

 - Use drm_crtc_vblank_put_locked, not drm_crtc_vblank_put, when we
   already hold the event lock.
 ---
  .../dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c    |  2 +-
  .../drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c     |  2 ++
  sys/external/bsd/drm2/dist/drm/drm_vblank.c       | 15 ++-------------
  .../drm/nouveau/dispnv50/nouveau_dispnv50_disp.c  |  2 +-
  4 files changed, 6 insertions(+), 15 deletions(-)

 diff --git a/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm=
 .c b/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c
 index c8cbf7a6f68e..d0386f514457 100644
 --- a/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c
 +++ b/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c
 @@ -361,7 +361,7 @@ static void dm_pflip_high_irq(void *interrupt_params)
  			drm_crtc_send_vblank_event(&amdgpu_crtc->base, e);
 =20
  			/* Event sent, so done with vblank for this flip */
 -			drm_crtc_vblank_put(&amdgpu_crtc->base);
 +			drm_crtc_vblank_put_locked(&amdgpu_crtc->base);
  		}
  	} else if (e) {
  		/* VRR active and inside front-porch: vblank count and
 diff --git a/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm=
 _crc.c b/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc=
 .c
 index 79cb94ea67dc..5a154037c524 100644
 --- a/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
 +++ b/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
 @@ -319,7 +319,9 @@ void amdgpu_dm_crtc_handle_crc_irq(struct drm_crtc *crt=
 c)
  				       &crcs[0], &crcs[1], &crcs[2]))
  			return;
 =20
 +		spin_lock(&crtc->dev->event_lock);
  		drm_crtc_add_crc_entry(crtc, true,
  				       drm_crtc_accurate_vblank_count(crtc), crcs);
 +		spin_unlock(&crtc->dev->event_lock);
  	}
  }
 diff --git a/sys/external/bsd/drm2/dist/drm/drm_vblank.c b/sys/external/bsd=
 /drm2/dist/drm/drm_vblank.c
 index 9ced81bd7ed8..ec91bbe9391b 100644
 --- a/sys/external/bsd/drm2/dist/drm/drm_vblank.c
 +++ b/sys/external/bsd/drm2/dist/drm/drm_vblank.c
 @@ -337,7 +337,7 @@ static u64 drm_vblank_count(struct drm_device *dev, uns=
 igned int pipe)
   * This is mostly useful for hardware that can obtain the scanout position=
 , but
   * doesn't have a hardware frame counter.
   */
 -static u64 drm_crtc_accurate_vblank_count_locked(struct drm_crtc *crtc)
 +u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc)
  {
  	struct drm_device *dev =3D crtc->dev;
  	unsigned int pipe =3D drm_crtc_index(crtc);
 @@ -358,17 +358,6 @@ static u64 drm_crtc_accurate_vblank_count_locked(struc=
 t drm_crtc *crtc)
 =20
  	return vblank;
  }
 -
 -u64 drm_crtc_accurate_vblank_count(struct drm_crtc *crtc)
 -{
 -	u64 vblank;
 -
 -	spin_lock(&crtc->dev->event_lock);
 -	vblank =3D drm_crtc_accurate_vblank_count_locked(crtc);
 -	spin_unlock(&crtc->dev->event_lock);
 -
 -	return vblank;
 -}
  EXPORT_SYMBOL(drm_crtc_accurate_vblank_count);
 =20
  static void __disable_vblank(struct drm_device *dev, unsigned int pipe)
 @@ -972,7 +961,7 @@ void drm_crtc_arm_vblank_event(struct drm_crtc *crtc,
  	assert_spin_locked(&dev->event_lock);
 =20
  	e->pipe =3D pipe;
 -	e->sequence =3D drm_crtc_accurate_vblank_count_locked(crtc) + 1;
 +	e->sequence =3D drm_crtc_accurate_vblank_count(crtc) + 1;
  	list_add_tail(&e->base.link, &dev->vblank_event_list);
  }
  EXPORT_SYMBOL(drm_crtc_arm_vblank_event);
 diff --git a/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv=
 50_disp.c b/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv5=
 0_disp.c
 index b9423cdc84fb..f49bb2ddf56d 100644
 --- a/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp=
 .c
 +++ b/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp=
 .c
 @@ -2136,9 +2136,9 @@ nv50_disp_atomic_commit_tail(struct drm_atomic_state =
 *state)
  		if (new_crtc_state->event) {
  			unsigned long flags;
  			/* Get correct count/ts if racing with vblank irq */
 +			spin_lock_irqsave(&crtc->dev->event_lock, flags);
  			if (new_crtc_state->active)
  				drm_crtc_accurate_vblank_count(crtc);
 -			spin_lock_irqsave(&crtc->dev->event_lock, flags);
  			drm_crtc_send_vblank_event(crtc, new_crtc_state->event);
  			spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 =20

 --=_17Wymd7lPaKOmlAiVMiz9N/EY5eA0fm1--

From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/56557 CVS commit: src/sys/external/bsd/drm2/linux
Date: Sun, 26 Dec 2021 16:14:34 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Sun Dec 26 16:14:34 UTC 2021

 Modified Files:
 	src/sys/external/bsd/drm2/linux: linux_ww_mutex.c

 Log Message:
 drm: Allow ww_mutex_lock after ww_acquire_done if we already hold it.

 In other words, if ww_mutex_lock would return -EALREADY, that's OK and
 does not warrant an assertion.

 PR kern/56557


 To generate a diff of this commit:
 cvs rdiff -u -r1.12 -r1.13 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.

From: Andreas Gustafsson <gson@gson.org>
To: Taylor R Campbell <riastradh@NetBSD.org>
Cc: gnats-bugs@NetBSD.org
Subject: Re: kern/56557: Boot fails with DRM assertion failure
Date: Sun, 26 Dec 2021 22:48:39 +0200

 Taylor R Campbell wrote:
 > Can you try the attached patch?

 With the patch, the system boots successfully!  A console log is at:

  https://www.gson.org/netbsd/bugs/build/i386-laptop/2021/2021.12.26.16.41.09/test.log

 -- 
 Andreas Gustafsson, gson@gson.org

From: "Taylor R Campbell" <riastradh@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/56557 CVS commit: src/sys/external/bsd/drm2/dist/drm
Date: Sun, 26 Dec 2021 21:00:14 +0000

 Module Name:	src
 Committed By:	riastradh
 Date:		Sun Dec 26 21:00:14 UTC 2021

 Modified Files:
 	src/sys/external/bsd/drm2/dist/drm: drm_vblank.c
 	src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm: amdgpu_dm.c
 	    amdgpu_dm_crc.c
 	src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50:
 	    nouveau_dispnv50_disp.c

 Log Message:
 drm: Fix locking around accurate vblank counts.

 - Make drm_crtc_accurate_vblank_count require the caller to hold the
   event lock, rather than take it internally.

 - Fix locking around drm_crtc_accurate_vblank_count and related
   operations in amdgpu and nouveau interrupt handlers.

 - Use drm_crtc_vblank_put_locked, not drm_crtc_vblank_put, when we
   already hold the event lock.

 PR kern/56557


 To generate a diff of this commit:
 cvs rdiff -u -r1.15 -r1.16 src/sys/external/bsd/drm2/dist/drm/drm_vblank.c
 cvs rdiff -u -r1.4 -r1.5 \
     src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm.c
 cvs rdiff -u -r1.2 -r1.3 \
     src/sys/external/bsd/drm2/dist/drm/amd/display/amdgpu_dm/amdgpu_dm_crc.c
 cvs rdiff -u -r1.6 -r1.7 \
     src/sys/external/bsd/drm2/dist/drm/nouveau/dispnv50/nouveau_dispnv50_disp.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: open->closed
State-Changed-By: riastradh@NetBSD.org
State-Changed-When: Sun, 26 Dec 2021 21:08:06 +0000
State-Changed-Why:
fixed


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.46 2020/01/03 16:35:01 leot Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2020 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.