* [Qemu-devel] [PATCH 0/2 v3] Release usb devices on shutdown and usb_del command
@ 2010-06-12 9:58 Shahar Havivi
2010-06-12 9:59 ` [Qemu-devel] [PATCH 1/2] Return usb device to host on " Shahar Havivi
2010-06-12 9:59 ` [Qemu-devel] [PATCH 2/2] Return usb device to host on exit Shahar Havivi
0 siblings, 2 replies; 8+ messages in thread
From: Shahar Havivi @ 2010-06-12 9:58 UTC (permalink / raw)
To: qemu-devel
v3:
separate usb hot-unplug and host terminate handling
remove empty methods from bsd and stub
added usb-linux atexit method to reset usb devices on termination
Shahar Havivi (2):
Return usb device to host on usb_del command
Return usb device to host on exit
usb-linux.c | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH 1/2] Return usb device to host on usb_del command
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 ` Shahar Havivi
2010-06-12 9:59 ` [Qemu-devel] [PATCH 2/2] Return usb device to host on exit Shahar Havivi
1 sibling, 0 replies; 8+ messages in thread
From: Shahar Havivi @ 2010-06-12 9:59 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Shahar Havivi <shaharh@redhat.com>
---
usb-linux.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/usb-linux.c b/usb-linux.c
index 88273ff..22a85e3 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -991,6 +991,7 @@ static int usb_host_close(USBHostDevice *dev)
async_complete(dev);
dev->closing = 0;
usb_device_detach(&dev->dev);
+ ioctl(dev->fd, USBDEVFS_RESET);
close(dev->fd);
dev->fd = -1;
return 0;
--
1.7.0.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH 2/2] Return usb device to host on exit
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 1/2] Return usb device to host on " Shahar Havivi
@ 2010-06-12 9:59 ` Shahar Havivi
2010-06-14 9:50 ` Gerd Hoffmann
1 sibling, 1 reply; 8+ messages in thread
From: Shahar Havivi @ 2010-06-12 9:59 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Shahar Havivi <shaharh@redhat.com>
---
usb-linux.c | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/usb-linux.c b/usb-linux.c
index 22a85e3..2a595f0 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -286,6 +286,17 @@ static void async_cancel(USBPacket *unused, void *opaque)
}
}
+static void usb_host_cleanup(void)
+{
+ struct USBHostDevice *s;
+
+ QTAILQ_FOREACH(s, &hostdevs, next) {
+ if (s->fd != -1) {
+ ioctl(s->fd, USBDEVFS_RESET);
+ }
+ }
+}
+
static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
{
int dev_descr_len, config_descr_len;
@@ -1066,6 +1077,7 @@ USBDevice *usb_host_device_open(const char *devname)
qdev_prop_set_uint32(&dev->qdev, "vendorid", filter.vendor_id);
qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
qdev_init_nofail(&dev->qdev);
+ atexit(usb_host_cleanup);
return dev;
fail:
--
1.7.0.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] Return usb device to host on exit
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
0 siblings, 0 replies; 8+ messages in thread
From: Gerd Hoffmann @ 2010-06-14 9:50 UTC (permalink / raw)
To: Shahar Havivi; +Cc: qemu-devel
> @@ -1066,6 +1077,7 @@ USBDevice *usb_host_device_open(const char *devname)
> qdev_prop_set_uint32(&dev->qdev, "vendorid", filter.vendor_id);
> qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
> qdev_init_nofail(&dev->qdev);
> + atexit(usb_host_cleanup);
> return dev;
You'll register atexit multiple times here (once per device).
I still think this should use exit notifiers, see
http://patchwork.ozlabs.org/patch/54571/ (doesn't apply cleanly and
more, will post a rebased version later today).
cheers,
Gerd
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH 2/2] Return usb device to host on exit
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:06 ` Shahar Havivi
2010-06-16 8:48 ` Gerd Hoffmann
0 siblings, 1 reply; 8+ messages in thread
From: Shahar Havivi @ 2010-06-15 18:06 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Shahar Havivi <shaharh@redhat.com>
---
usb-linux.c | 19 +++++++++++++++++++
1 files changed, 19 insertions(+), 0 deletions(-)
diff --git a/usb-linux.c b/usb-linux.c
index 22a85e3..4b5aeb6 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>
@@ -89,6 +90,8 @@ static char *usb_host_device_path;
#define USB_FS_SYS 3
static int usb_fs_type;
+static int usb_notify_set;
+static Notifier usb_host_notifier;
/* endpoint association data */
struct endp_data {
@@ -286,6 +289,17 @@ static void async_cancel(USBPacket *unused, void *opaque)
}
}
+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);
+ }
+ }
+}
+
static int usb_host_claim_interfaces(USBHostDevice *dev, int configuration)
{
int dev_descr_len, config_descr_len;
@@ -1066,6 +1080,11 @@ USBDevice *usb_host_device_open(const char *devname)
qdev_prop_set_uint32(&dev->qdev, "vendorid", filter.vendor_id);
qdev_prop_set_uint32(&dev->qdev, "productid", filter.product_id);
qdev_init_nofail(&dev->qdev);
+ if (!usb_notify_set) {
+ usb_notify_set = 1;
+ usb_host_notifier.notify = usb_host_cleanup;
+ qemu_add_exit_notifier(&usb_host_notifier);
+ }
return dev;
fail:
--
1.7.0.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] Return usb device to host on exit
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
2010-06-16 10:18 ` Shahar Havivi
0 siblings, 1 reply; 8+ messages in thread
From: Gerd Hoffmann @ 2010-06-16 8:48 UTC (permalink / raw)
To: Shahar Havivi; +Cc: qemu-devel
[-- 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
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] Return usb device to host on exit
2010-06-16 8:48 ` Gerd Hoffmann
@ 2010-06-16 10:18 ` Shahar Havivi
0 siblings, 0 replies; 8+ messages in thread
From: Shahar Havivi @ 2010-06-16 10:18 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: qemu-devel
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 <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
>
> >+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 <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
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [Qemu-devel] [PATCH 2/2] Return usb device to host on exit
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 ` Shahar Havivi
0 siblings, 0 replies; 8+ messages in thread
From: Shahar Havivi @ 2010-06-16 12:16 UTC (permalink / raw)
To: Gerd Hoffmann, qemu-devel
Signed-off-by: Shahar Havivi <shaharh@redhat.com>
---
usb-linux.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/usb-linux.c b/usb-linux.c
index 22a85e3..c3c38ec 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);
@@ -997,6 +1000,15 @@ static int usb_host_close(USBHostDevice *dev)
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);
@@ -1004,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.7.0.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2010-06-16 12:15 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 1/2] Return usb device to host on " 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
-- strict thread matches above, loose matches on Subject: below --
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:06 ` [Qemu-devel] [PATCH 2/2] Return usb device to host on exit Shahar Havivi
2010-06-16 8:48 ` Gerd Hoffmann
2010-06-16 10:18 ` Shahar Havivi
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
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.