From owner-p4-projects@FreeBSD.ORG Wed Dec 19 01:37:09 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id AD30616A41A; Wed, 19 Dec 2007 01:37:09 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0BAE016A418 for ; Wed, 19 Dec 2007 01:37:09 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id F232013C478 for ; Wed, 19 Dec 2007 01:37:08 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id lBJ1b8Bo006589 for ; Wed, 19 Dec 2007 01:37:08 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id lBJ1b8sJ006586 for perforce@freebsd.org; Wed, 19 Dec 2007 01:37:08 GMT (envelope-from hselasky@FreeBSD.org) Date: Wed, 19 Dec 2007 01:37:08 GMT Message-Id: <200712190137.lBJ1b8sJ006586@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 131191 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Dec 2007 01:37:10 -0000 http://perforce.freebsd.org/chv.cgi?CH=131191 Change 131191 by hselasky@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) {