From: Gerd Hoffmann <kraxel@redhat.com>
To: Shahar Havivi <shaharh@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 2/2] Return usb device to host on exit
Date: Wed, 16 Jun 2010 10:48:23 +0200 [thread overview]
Message-ID: <4C188FD7.2050306@redhat.com> (raw)
In-Reply-To: <3e33b4dbeaba1f5788ae17ab16b3788f020a1af4.1276624758.git.shaharh@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 663 bytes --]
> +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
[-- Attachment #2: 0001-usb-host-make-sure-we-release-the-device.patch --]
[-- Type: text/plain, Size: 2049 bytes --]
>From 731761de07b73555faf96dc466efd7db2480a694 Mon Sep 17 00:00:00 2001
From: Gerd Hoffmann <kraxel@redhat.com>
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 <kraxel@redhat.com>
---
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 <dirent.h>
#include <sys/ioctl.h>
@@ -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
next prev parent reply other threads:[~2010-06-16 8:48 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-15 18:05 [Qemu-devel] [PATCH 0/2 v4] Release usb devices on shutdown and usb_del Shahar Havivi
2010-06-15 18:05 ` [Qemu-devel] [PATCH 1/2] Return usb device to host on usb_del command Shahar Havivi
2010-06-15 18:06 ` [Qemu-devel] [PATCH 2/2] Return usb device to host on exit Shahar Havivi
2010-06-16 8:48 ` Gerd Hoffmann [this message]
2010-06-16 10:18 ` Shahar Havivi
-- strict thread matches above, loose matches on Subject: below --
2010-06-16 12:15 [Qemu-devel] [PATCH 0/2 v5] Release usb devices on shutdown and usb_del Shahar Havivi
2010-06-16 12:16 ` [Qemu-devel] [PATCH 2/2] Return usb device to host on exit Shahar Havivi
2010-06-12 9:58 [Qemu-devel] [PATCH 0/2 v3] Release usb devices on shutdown and usb_del command Shahar Havivi
2010-06-12 9:59 ` [Qemu-devel] [PATCH 2/2] Return usb device to host on exit Shahar Havivi
2010-06-14 9:50 ` Gerd Hoffmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C188FD7.2050306@redhat.com \
--to=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=shaharh@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.