aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/subr_bus.c
diff options
context:
space:
mode:
authorMarcin Wojtas <mw@FreeBSD.org>2019-03-01 01:18:39 +0000
committerMarcin Wojtas <mw@FreeBSD.org>2019-03-01 01:18:39 +0000
commite3431664dff30f3d9a7f324a2a1b88ca0c0d9886 (patch)
tree2e5563db7324c9c7c58416a93ca86f14d6c31922 /sys/kern/subr_bus.c
parentc8e720aaaeb6b1efe836459c30b0e1782ade5c2a (diff)
downloadsrc-e3431664dff30f3d9a7f324a2a1b88ca0c0d9886.tar.gz
src-e3431664dff30f3d9a7f324a2a1b88ca0c0d9886.zip
Prevent detaching driver if the attach is not finished
When the device is in attaching state, detach should return EBUSY instead of success. In other case, there could be race between attach and detach during the driver unloading. If driver goes sleep and releases GIANT lock during attaching, unloading module could start. In such case when attach continues after module unload, page fault "supervisor read instruction, page not present" occurred. This patch works around the real issue, which is a locking deficiency of the busses. Submitted by: Rafal Kozik <rk@semihalf.com> Reviewed by: imp Obtained from: Semihalf MFC after: 2 weeks Sponsored by: Amazon, Inc. Differential Revision: https://reviews.freebsd.org/D19375
Notes
Notes: svn path=/head/; revision=344676
Diffstat (limited to 'sys/kern/subr_bus.c')
-rw-r--r--sys/kern/subr_bus.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index 937cacd21f94..ba177f7895b3 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -3004,6 +3004,10 @@ device_detach(device_t dev)
PDEBUG(("%s", DEVICENAME(dev)));
if (dev->state == DS_BUSY)
return (EBUSY);
+ if (dev->state == DS_ATTACHING) {
+ device_printf(dev, "device in attaching state! Deferring detach.\n");
+ return (EBUSY);
+ }
if (dev->state != DS_ATTACHED)
return (0);