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