svn commit: r196642 - in stable/8/sys: . amd64/include/xen
cddl/contrib/opensolaris contrib/dev/acpica contrib/pf
dev/usb dev/xen/xenpci
Andrew Thompson
thompsa at FreeBSD.org
Sat Aug 29 15:42:06 UTC 2009
Author: thompsa
Date: Sat Aug 29 15:42:06 2009
New Revision: 196642
URL: http://svn.freebsd.org/changeset/base/196642
Log:
MFC r196547
It is possible for all the kthreads to exit (hci modules unloaded) which in
turn ends our usb process. This means the proc pointer becomes invalid and will
panic if a new kthread is added. Count the number of threads and clear the proc
pointer on the last one.
Approved by: re (kib)
Modified:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/usb/usb_process.c
stable/8/sys/dev/xen/xenpci/ (props changed)
Modified: stable/8/sys/dev/usb/usb_process.c
==============================================================================
--- stable/8/sys/dev/usb/usb_process.c Sat Aug 29 15:21:50 2009 (r196641)
+++ stable/8/sys/dev/usb/usb_process.c Sat Aug 29 15:42:06 2009 (r196642)
@@ -64,6 +64,7 @@
#if (__FreeBSD_version >= 800000)
static struct proc *usbproc;
+static int usb_pcount;
#define USB_THREAD_CREATE(f, s, p, ...) \
kproc_kthread_add((f), (s), &usbproc, (p), RFHIGHPID, \
0, "usb", __VA_ARGS__)
@@ -183,6 +184,11 @@ usb_process(void *arg)
up->up_ptr = NULL;
cv_signal(&up->up_cv);
mtx_unlock(up->up_mtx);
+#if (__FreeBSD_version >= 800000)
+ /* Clear the proc pointer if this is the last thread. */
+ if (--usb_pcount == 0)
+ usbproc = NULL;
+#endif
USB_THREAD_EXIT(0);
}
@@ -218,6 +224,9 @@ usb_proc_create(struct usb_process *up,
up->up_ptr = NULL;
goto error;
}
+#if (__FreeBSD_version >= 800000)
+ usb_pcount++;
+#endif
return (0);
error:
More information about the svn-src-stable
mailing list