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.

Suggested by:	julian
MFC after:	3 days
This commit is contained in:
Andrew Thompson 2009-08-25 16:59:55 +00:00
parent 08cc4f3542
commit 51e8c0d6c6
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=196547

View File

@ -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, struct mtx *p_mtx,
up->up_ptr = NULL;
goto error;
}
#if (__FreeBSD_version >= 800000)
usb_pcount++;
#endif
return (0);
error: