PERFORCE change 131191 for review

Hans Petter Selasky hselasky at FreeBSD.org
Tue Dec 18 17:37:10 PST 2007


http://perforce.freebsd.org/chv.cgi?CH=131191

Change 131191 by hselasky at hselasky_laptop001 on 2007/12/19 01:36:11

	
	Bugfix:
	It looks like you need to call "intr_event_destroy" and
	not just "swi_remove". This was not well documented.
	Else you get a memory leak. Looked through the sources
	and I think others have made the same mistake aswell.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#76 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#76 (text+ko) ====

@@ -835,9 +835,11 @@
 			LIST_INIT(&(info->done_head));
 
 			/* create our interrupt thread */
-			if (swi_add(NULL, "usbcb", &usbd_callback_intr_td,
-			    info, SWI_CAMBIO, INTR_MPSAFE, &(info->done_cookie))) {
+			if (swi_add(&(info->done_event), "usbcb",
+			    &usbd_callback_intr_td, info, SWI_CAMBIO,
+			    INTR_MPSAFE, &(info->done_cookie))) {
 				info->done_cookie = NULL;
+				info->done_event = NULL;
 				parm.err = USBD_NO_INTR_THREAD;
 				goto done;
 			}
@@ -1073,6 +1075,7 @@
 	/* teardown the interrupt thread, if any */
 	if (info->done_cookie) {
 		swi_remove(info->done_cookie);
+		intr_event_destroy(info->done_event);
 	}
 	/*
 	 * free the "memory_base" last,
@@ -2434,7 +2437,7 @@
 		type = (xfer->pipe->edesc->bmAttributes & UE_XFERTYPE);
 		if (type != UE_ISOCHRONOUS) {
 			xfer->pipe->is_stalled = 1;
-			(xfer->pipe->methods->set_stall) (
+			(xfer->udev->bus->methods->set_stall) (
 			    xfer->udev, NULL, xfer->pipe);
 			goto done;
 		}
@@ -2823,11 +2826,11 @@
 		 * complete the USB transfer like in case of a timeout
 		 * setting the error code "USBD_STALLED".
 		 */
-		(pipe->methods->set_stall) (udev, xfer, pipe);
+		(udev->bus->methods->set_stall) (udev, xfer, pipe);
 	} else {
 		pipe->toggle_next = 0;	/* reset data toggle */
 
-		(pipe->methods->clear_stall) (udev, pipe);
+		(udev->bus->methods->clear_stall) (udev, pipe);
 
 		/* start up the first transfer, if any */
 		if (xfer) {


More information about the p4-projects mailing list