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