Module Name:    src
Committed By:   riastradh
Date:           Mon Jul 18 23:33:53 UTC 2022

Modified Files:
        src/sys/external/bsd/drm2/amdgpu: amdgpufb.c
        src/sys/external/bsd/drm2/i915drm: intelfb.c
        src/sys/external/bsd/drm2/nouveau: nouveaufb.c
        src/sys/external/bsd/drm2/radeon: radeondrmkmsfb.c
        src/sys/external/bsd/drm2/vmwgfx: vmwgfxfb.c

Log Message:
drm: Fix asynchronous attach logic for drm framebuffer devices.

The driver-specific sc_scheduled boolean flag was racy.  It is
necessary to use config_pending_incr/decr to hold up console
selection and userland start (and block detach, not that that works
yet) until the drmfb attach has completed.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/amdgpu/amdgpufb.c
cvs rdiff -u -r1.22 -r1.23 src/sys/external/bsd/drm2/i915drm/intelfb.c
cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/nouveau/nouveaufb.c
cvs rdiff -u -r1.15 -r1.16 src/sys/external/bsd/drm2/radeon/radeondrmkmsfb.c
cvs rdiff -u -r1.1 -r1.2 src/sys/external/bsd/drm2/vmwgfx/vmwgfxfb.c

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

Modified files:

Index: src/sys/external/bsd/drm2/amdgpu/amdgpufb.c
diff -u src/sys/external/bsd/drm2/amdgpu/amdgpufb.c:1.3 src/sys/external/bsd/drm2/amdgpu/amdgpufb.c:1.4
--- src/sys/external/bsd/drm2/amdgpu/amdgpufb.c:1.3	Sun Dec 19 12:21:29 2021
+++ src/sys/external/bsd/drm2/amdgpu/amdgpufb.c	Mon Jul 18 23:33:53 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: amdgpufb.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $	*/
+/*	$NetBSD: amdgpufb.c,v 1.4 2022/07/18 23:33:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amdgpufb.c,v 1.3 2021/12/19 12:21:29 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdgpufb.c,v 1.4 2022/07/18 23:33:53 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/bus.h>
@@ -58,7 +58,6 @@ struct amdgpufb_softc {
 	device_t			sc_dev;
 	struct amdgpufb_attach_args	sc_afa;
 	struct amdgpu_task		sc_attach_task;
-	bool				sc_scheduled:1;
 	bool				sc_attached:1;
 };
 
@@ -88,7 +87,6 @@ amdgpufb_attach(device_t parent, device_
 
 	sc->sc_dev = self;
 	sc->sc_afa = *afa;
-	sc->sc_scheduled = false;
 	sc->sc_attached = false;
 
 	aprint_naive("\n");
@@ -99,14 +97,9 @@ amdgpufb_attach(device_t parent, device_
 	if (error) {
 		aprint_error_dev(self, "failed to schedule mode set: %d\n",
 		    error);
-		goto fail0;
+		return;
 	}
-	sc->sc_scheduled = true;
-
-	/* Success!  */
-	return;
-
-fail0:	return;
+	config_pending_incr(self);
 }
 
 static int
@@ -115,9 +108,6 @@ amdgpufb_detach(device_t self, int flags
 	struct amdgpufb_softc *const sc = device_private(self);
 	int error;
 
-	if (sc->sc_scheduled)
-		return EBUSY;
-
 	if (sc->sc_attached) {
 		pmf_device_deregister(self);
 		error = drmfb_detach(&sc->sc_drmfb, flags);
@@ -153,7 +143,7 @@ amdgpufb_attach_task(struct amdgpu_task 
 	if (error) {
 		aprint_error_dev(sc->sc_dev, "failed to attach drmfb: %d\n",
 		    error);
-		return;
+		goto out;
 	}
 
 	if (!pmf_device_register1(sc->sc_dev, NULL, NULL, &amdgpufb_shutdown))
@@ -161,6 +151,8 @@ amdgpufb_attach_task(struct amdgpu_task 
 		    "failed to register shutdown handler\n");
 
 	sc->sc_attached = true;
+out:
+	config_pending_decr(sc->sc_dev);
 }
 
 static bool

Index: src/sys/external/bsd/drm2/i915drm/intelfb.c
diff -u src/sys/external/bsd/drm2/i915drm/intelfb.c:1.22 src/sys/external/bsd/drm2/i915drm/intelfb.c:1.23
--- src/sys/external/bsd/drm2/i915drm/intelfb.c:1.22	Sun Dec 19 11:49:12 2021
+++ src/sys/external/bsd/drm2/i915drm/intelfb.c	Mon Jul 18 23:33:53 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: intelfb.c,v 1.22 2021/12/19 11:49:12 riastradh Exp $	*/
+/*	$NetBSD: intelfb.c,v 1.23 2022/07/18 23:33:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intelfb.c,v 1.22 2021/12/19 11:49:12 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intelfb.c,v 1.23 2022/07/18 23:33:53 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/bus.h>
@@ -64,7 +64,6 @@ struct intelfb_softc {
 	struct intelfb_attach_args	sc_ifa;
 	bus_space_handle_t		sc_fb_bsh;
 	struct i915drmkms_task		sc_attach_task;
-	bool				sc_scheduled:1;
 	bool				sc_attached:1;
 };
 
@@ -95,7 +94,6 @@ intelfb_attach(device_t parent, device_t
 
 	sc->sc_dev = self;
 	sc->sc_ifa = *ifa;
-	sc->sc_scheduled = false;
 	sc->sc_attached = false;
 
 	aprint_naive("\n");
@@ -109,10 +107,6 @@ intelfb_attach(device_t parent, device_t
 		return;
 	}
 	config_pending_incr(self);
-	sc->sc_scheduled = true;
-
-	/* Success!  */
-	return;
 }
 
 static int
@@ -121,9 +115,6 @@ intelfb_detach(device_t self, int flags)
 	struct intelfb_softc *const sc = device_private(self);
 	int error;
 
-	if (sc->sc_scheduled)
-		return EBUSY;
-
 	if (sc->sc_attached) {
 		pmf_device_deregister(self);
 		error = drmfb_detach(&sc->sc_drmfb, flags);

Index: src/sys/external/bsd/drm2/nouveau/nouveaufb.c
diff -u src/sys/external/bsd/drm2/nouveau/nouveaufb.c:1.7 src/sys/external/bsd/drm2/nouveau/nouveaufb.c:1.8
--- src/sys/external/bsd/drm2/nouveau/nouveaufb.c:1.7	Sun Dec 19 10:51:59 2021
+++ src/sys/external/bsd/drm2/nouveau/nouveaufb.c	Mon Jul 18 23:33:53 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: nouveaufb.c,v 1.7 2021/12/19 10:51:59 riastradh Exp $	*/
+/*	$NetBSD: nouveaufb.c,v 1.8 2022/07/18 23:33:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveaufb.c,v 1.7 2021/12/19 10:51:59 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveaufb.c,v 1.8 2022/07/18 23:33:53 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/bus.h>
@@ -63,7 +63,6 @@ struct nouveaufb_softc {
 	device_t			sc_dev;
 	struct nouveaufb_attach_args	sc_nfa;
 	struct nouveau_pci_task		sc_attach_task;
-	bool				sc_scheduled:1;
 	bool				sc_attached:1;
 };
 
@@ -93,7 +92,6 @@ nouveaufb_attach(device_t parent, device
 
 	sc->sc_dev = self;
 	sc->sc_nfa = *nfa;
-	sc->sc_scheduled = false;
 	sc->sc_attached = false;
 
 	aprint_naive("\n");
@@ -104,14 +102,9 @@ nouveaufb_attach(device_t parent, device
 	if (error) {
 		aprint_error_dev(self, "failed to schedule mode set: %d\n",
 		    error);
-		goto fail0;
+		return;
 	}
-	sc->sc_scheduled = true;
-
-	/* Success!  */
-	return;
-
-fail0:	return;
+	config_pending_incr(self);
 }
 
 static int
@@ -120,9 +113,6 @@ nouveaufb_detach(device_t self, int flag
 	struct nouveaufb_softc *const sc = device_private(self);
 	int error;
 
-	if (sc->sc_scheduled)
-		return EBUSY;
-
 	if (sc->sc_attached) {
 		pmf_device_deregister(self);
 		error = drmfb_detach(&sc->sc_drmfb, flags);
@@ -158,7 +148,7 @@ nouveaufb_attach_task(struct nouveau_pci
 	if (error) {
 		aprint_error_dev(sc->sc_dev, "failed to attach drmfb: %d\n",
 		    error);
-		return;
+		goto out;
 	}
 
 	if (!pmf_device_register1(sc->sc_dev, NULL, NULL, &nouveaufb_shutdown))
@@ -166,6 +156,8 @@ nouveaufb_attach_task(struct nouveau_pci
 		    "failed to register shutdown handler\n");
 
 	sc->sc_attached = true;
+out:
+	config_pending_decr(sc->sc_dev);
 }
 
 static bool

Index: src/sys/external/bsd/drm2/radeon/radeondrmkmsfb.c
diff -u src/sys/external/bsd/drm2/radeon/radeondrmkmsfb.c:1.15 src/sys/external/bsd/drm2/radeon/radeondrmkmsfb.c:1.16
--- src/sys/external/bsd/drm2/radeon/radeondrmkmsfb.c:1.15	Sun Dec 19 10:33:00 2021
+++ src/sys/external/bsd/drm2/radeon/radeondrmkmsfb.c	Mon Jul 18 23:33:53 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: radeondrmkmsfb.c,v 1.15 2021/12/19 10:33:00 riastradh Exp $	*/
+/*	$NetBSD: radeondrmkmsfb.c,v 1.16 2022/07/18 23:33:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: radeondrmkmsfb.c,v 1.15 2021/12/19 10:33:00 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: radeondrmkmsfb.c,v 1.16 2022/07/18 23:33:53 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/device.h>
@@ -50,7 +50,6 @@ struct radeonfb_softc {
 	device_t			sc_dev;
 	struct radeonfb_attach_args	sc_rfa;
 	struct radeon_task		sc_attach_task;
-	bool				sc_scheduled:1;
 	bool				sc_attached:1;
 };
 
@@ -89,7 +88,6 @@ radeonfb_attach(device_t parent, device_
 
 	sc->sc_dev = self;
 	sc->sc_rfa = *rfa;
-	sc->sc_scheduled = false;
 	sc->sc_attached = false;
 
 	aprint_naive("\n");
@@ -100,14 +98,9 @@ radeonfb_attach(device_t parent, device_
 	if (error) {
 		aprint_error_dev(self, "failed to schedule mode set: %d\n",
 		    error);
-		goto fail0;
+		return;
 	}
-	sc->sc_scheduled = true;
-
-	/* Success!  */
-	return;
-
-fail0:	return;
+	config_pending_incr(self);
 }
 
 static int
@@ -116,9 +109,6 @@ radeonfb_detach(device_t self, int flags
 	struct radeonfb_softc *const sc = device_private(self);
 	int error;
 
-	if (sc->sc_scheduled)
-		return EBUSY;
-
 	if (sc->sc_attached) {
 		pmf_device_deregister(self);
 		error = drmfb_detach(&sc->sc_drmfb, flags);
@@ -150,20 +140,19 @@ radeonfb_attach_task(struct radeon_task 
 	};
 	int error;
 
-	KASSERT(sc->sc_scheduled);
-
-
 	error = drmfb_attach(&sc->sc_drmfb, &da);
 	if (error) {
 		aprint_error_dev(sc->sc_dev, "failed to attach drmfb: %d\n",
 		    error);
-		return;
+		goto out;
 	}
 	if (!pmf_device_register1(sc->sc_dev, NULL, NULL, &radeonfb_shutdown))
 		aprint_error_dev(sc->sc_dev,
 		    "failed to register shutdown handler\n");
 
 	sc->sc_attached = true;
+out:
+	config_pending_decr(sc->sc_dev);
 }
 
 static bool

Index: src/sys/external/bsd/drm2/vmwgfx/vmwgfxfb.c
diff -u src/sys/external/bsd/drm2/vmwgfx/vmwgfxfb.c:1.1 src/sys/external/bsd/drm2/vmwgfx/vmwgfxfb.c:1.2
--- src/sys/external/bsd/drm2/vmwgfx/vmwgfxfb.c:1.1	Thu Feb 17 01:21:03 2022
+++ src/sys/external/bsd/drm2/vmwgfx/vmwgfxfb.c	Mon Jul 18 23:33:53 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vmwgfxfb.c,v 1.1 2022/02/17 01:21:03 riastradh Exp $	*/
+/*	$NetBSD: vmwgfxfb.c,v 1.2 2022/07/18 23:33:53 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2022 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vmwgfxfb.c,v 1.1 2022/02/17 01:21:03 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vmwgfxfb.c,v 1.2 2022/07/18 23:33:53 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/device.h>
@@ -46,7 +46,6 @@ struct vmwgfxfb_softc {
 	device_t			sc_dev;
 	struct vmwgfxfb_attach_args	sc_vfa;
 	struct vmwgfx_task		sc_attach_task;
-	bool				sc_scheduled:1;
 	bool				sc_attached:1;
 };
 
@@ -85,7 +84,6 @@ vmwgfxfb_attach(device_t parent, device_
 
 	sc->sc_dev = self;
 	sc->sc_vfa = *vfa;
-	sc->sc_scheduled = false;
 	sc->sc_attached = false;
 
 	aprint_naive("\n");
@@ -96,14 +94,9 @@ vmwgfxfb_attach(device_t parent, device_
 	if (error) {
 		aprint_error_dev(self, "failed to schedule mode set: %d\n",
 		    error);
-		goto fail0;
+		return;
 	}
-	sc->sc_scheduled = true;
-
-	/* Success!  */
-	return;
-
-fail0:	return;
+	config_pending_incr(self);
 }
 
 static int
@@ -112,9 +105,6 @@ vmwgfxfb_detach(device_t self, int flags
 	struct vmwgfxfb_softc *const sc = device_private(self);
 	int error;
 
-	if (sc->sc_scheduled)
-		return EBUSY;
-
 	if (sc->sc_attached) {
 		pmf_device_deregister(self);
 		error = drmfb_detach(&sc->sc_drmfb, flags);
@@ -148,8 +138,6 @@ vmwgfxfb_attach_task(struct vmwgfx_task 
 	bool is_console;
 	int error;
 
-	KASSERT(sc->sc_scheduled);
-
 	/*
 	 * MD device enumeration logic may choose the vmwgfxN PCI
 	 * device as the console.  If so, propagate that down to the
@@ -166,13 +154,15 @@ vmwgfxfb_attach_task(struct vmwgfx_task 
 	if (error) {
 		aprint_error_dev(sc->sc_dev, "failed to attach drmfb: %d\n",
 		    error);
-		return;
+		goto out;
 	}
 	if (!pmf_device_register1(sc->sc_dev, NULL, NULL, &vmwgfxfb_shutdown))
 		aprint_error_dev(sc->sc_dev,
 		    "failed to register shutdown handler\n");
 
 	sc->sc_attached = true;
+out:
+	config_pending_decr(sc->sc_dev);
 }
 
 static bool

Reply via email to