From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=52424 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OOpgb-0004bY-0H for qemu-devel@nongnu.org; Wed, 16 Jun 2010 06:17:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OOpgX-0006rC-3S for qemu-devel@nongnu.org; Wed, 16 Jun 2010 06:17:30 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54458) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OOpgW-0006r1-TA for qemu-devel@nongnu.org; Wed, 16 Jun 2010 06:17:29 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o5GAHR5d025653 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 16 Jun 2010 06:17:27 -0400 Date: Wed, 16 Jun 2010 13:18:19 +0300 From: Shahar Havivi Subject: Re: [Qemu-devel] [PATCH 2/2] Return usb device to host on exit Message-ID: <20100616101819.GA29096@redhat.com> References: <3e33b4dbeaba1f5788ae17ab16b3788f020a1af4.1276624758.git.shaharh@redhat.com> <4C188FD7.2050306@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C188FD7.2050306@redhat.com> List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gerd Hoffmann Cc: qemu-devel@nongnu.org On Wed, Jun 16, 2010 at 10:48:23AM +0200, Gerd Hoffmann wrote: > Date: Wed, 16 Jun 2010 10:48:23 +0200 > From: Gerd Hoffmann > To: Shahar Havivi > Cc: qemu-devel@nongnu.org > Subject: Re: [Qemu-devel] [PATCH 2/2] Return usb device to host on exit > > >+static void usb_host_cleanup(struct Notifier* n) > >+{ > >+ struct USBHostDevice *s; > >+ > >+ QTAILQ_FOREACH(s,&hostdevs, next) { > >+ if (s->fd != -1) { > >+ ioctl(s->fd, USBDEVFS_RESET); > >+ } > >+ } > >+} > > Well. The point of exit notifiers is that you don't need global > variables for your cleanup work because the notifier function gets > passed in a handle to your state data. > > In that specific case the global hostdevs is needed anyway for other > reasons. Nevertheless I don't want usb-linux.c set a bad example, > but provide a good reference implementation for others to look at. > > Patch attached (untested). > > cheers, > Gerd Thanks for the info Gerd, I will test it. Shahar. > From 731761de07b73555faf96dc466efd7db2480a694 Mon Sep 17 00:00:00 2001 > From: Gerd Hoffmann > Date: Wed, 16 Jun 2010 10:29:59 +0200 > Subject: [PATCH] usb-host: make sure we release the device. > > Call USBDEVFS_RESET ioctl in usb_host_close. > Use exit notifiers to make sure we do it on exit too. > > Signed-off-by: Gerd Hoffmann > --- > usb-linux.c | 15 +++++++++++++++ > 1 files changed, 15 insertions(+), 0 deletions(-) > > diff --git a/usb-linux.c b/usb-linux.c > index 88273ff..a089fb6 100644 > --- a/usb-linux.c > +++ b/usb-linux.c > @@ -33,6 +33,7 @@ > #include "qemu-common.h" > #include "qemu-timer.h" > #include "monitor.h" > +#include "sysemu.h" > > #include > #include > @@ -132,6 +133,7 @@ typedef struct USBHostDevice { > int configuration; > int ninterfaces; > int closing; > + Notifier exit; > > struct ctrl_struct ctrl; > struct endp_data endp_table[MAX_ENDPOINTS]; > @@ -404,6 +406,7 @@ static void usb_host_handle_destroy(USBDevice *dev) > > usb_host_close(s); > QTAILQ_REMOVE(&hostdevs, s, next); > + qemu_remove_exit_notifier(&s->exit); > } > > static int usb_linux_update_endp_table(USBHostDevice *s); > @@ -991,11 +994,21 @@ static int usb_host_close(USBHostDevice *dev) > async_complete(dev); > dev->closing = 0; > usb_device_detach(&dev->dev); > + ioctl(s->fd, USBDEVFS_RESET); > close(dev->fd); > dev->fd = -1; > return 0; > } > > +static void usb_host_exit_notifier(struct Notifier* n) > +{ > + USBHostDevice *s = container_of(n, USBHostDevice, exit); > + > + if (s->fd != -1) { > + ioctl(s->fd, USBDEVFS_RESET); > + } > +} > + > static int usb_host_initfn(USBDevice *dev) > { > USBHostDevice *s = DO_UPCAST(USBHostDevice, dev, dev); > @@ -1003,6 +1016,8 @@ static int usb_host_initfn(USBDevice *dev) > dev->auto_attach = 0; > s->fd = -1; > QTAILQ_INSERT_TAIL(&hostdevs, s, next); > + s->exit.notify = usb_host_exit_notifier; > + qemu_add_exit_notifier(&s->exit); > usb_host_auto_check(NULL); > return 0; > } > -- > 1.6.5.2 >