On 02/27/14 11:39, Kohji Okuno wrote:
Hi HPS and John-Mark,

After I changed as the following, the kernel panic does not happen.
What do you think about this change?

+       knlist_clear(&f->selinfo.si_note, 0);
         knlist_destroy(&f->selinfo.si_note);

Regards,
  Kohji Okuno


Can you try the attached patch instead?

--HPS

=== usb_dev.c
==================================================================
--- usb_dev.c	(revision 262555)
+++ usb_dev.c	(local)
@@ -561,8 +561,8 @@
 	return (0);
 }
 
-void
-usb_fifo_free(struct usb_fifo *f)
+static void
+usb_fifo_destroy(struct usb_fifo *f)
 {
 	uint8_t n;
 
@@ -618,7 +618,16 @@
 
 	/* take care of closing the device here, if any */
 	usb_fifo_close(f, 0);
+}
 
+static void
+usb_fifo_free(struct usb_fifo *f)
+{
+	if (f == NULL) {
+		/* be NULL safe */
+		return;
+	}
+
 	cv_destroy(&f->cv_io);
 	cv_destroy(&f->cv_drain);
 
@@ -1867,6 +1876,8 @@
 	f_rx = usb_fifo_alloc(priv_mtx);
 
 	if ((f_tx == NULL) || (f_rx == NULL)) {
+		usb_fifo_destroy(f_tx);
+		usb_fifo_destroy(f_rx);
 		usb_fifo_free(f_tx);
 		usb_fifo_free(f_rx);
 		return (ENOMEM);
@@ -1989,6 +2000,13 @@
 	if (f_sc == NULL) {
 		return;
 	}
+	usb_fifo_destroy(f_sc->fp[USB_FIFO_TX]);
+	usb_fifo_destroy(f_sc->fp[USB_FIFO_RX]);
+
+	usb_destroy_dev(f_sc->dev);
+
+	f_sc->dev = NULL;
+
 	usb_fifo_free(f_sc->fp[USB_FIFO_TX]);
 	usb_fifo_free(f_sc->fp[USB_FIFO_RX]);
 
@@ -1995,10 +2013,6 @@
 	f_sc->fp[USB_FIFO_TX] = NULL;
 	f_sc->fp[USB_FIFO_RX] = NULL;
 
-	usb_destroy_dev(f_sc->dev);
-
-	f_sc->dev = NULL;
-
 	DPRINTFN(2, "detached %p\n", f_sc);
 }
 
=== usbdi.h
==================================================================
--- usbdi.h	(revision 262555)
+++ usbdi.h	(local)
@@ -614,6 +614,5 @@
 void	*usb_fifo_softc(struct usb_fifo *fifo);
 void	usb_fifo_set_close_zlp(struct usb_fifo *, uint8_t);
 void	usb_fifo_set_write_defrag(struct usb_fifo *, uint8_t);
-void	usb_fifo_free(struct usb_fifo *f);
 #endif /* _KERNEL */
 #endif /* _USB_USBDI_H_ */
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to