Author: thompsa
Date: Tue Aug 25 16:59:55 2009
New Revision: 196547
URL: http://svn.freebsd.org/changeset/base/196547

Log:
  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

Modified:
  head/sys/dev/usb/usb_process.c

Modified: head/sys/dev/usb/usb_process.c
==============================================================================
--- head/sys/dev/usb/usb_process.c      Tue Aug 25 16:56:33 2009        
(r196546)
+++ head/sys/dev/usb/usb_process.c      Tue Aug 25 16:59:55 2009        
(r196547)
@@ -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:
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to