All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Krasnyansky <maxk@kernel.org>
To: qemu-devel@nongnu.org
Cc: kvm@vger.kernel.org, Max Krasnyansky <maxk@kernel.org>
Subject: [PATCH] husb: remove disconnect detection timer
Date: Thu, 14 Aug 2008 21:39:44 +0000	[thread overview]
Message-ID: <1218749984-9254-1-git-send-email-maxk@kernel.org> (raw)

On top of my previous USB patchset.

Async completion handler can detect device disconnects without polling.
We do not need the timer anymore.

Signed-off-by: Max Krasnyansky <maxk@kernel.org>
---
 usb-linux.c |   37 ++++++-------------------------------
 1 files changed, 6 insertions(+), 31 deletions(-)

diff --git a/usb-linux.c b/usb-linux.c
index 786ef1b..dd78bb6 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -82,11 +82,10 @@ typedef struct USBHostDevice {
     uint8_t   descr[1024];
     int       descr_len;
     int       configuration;
+    int       closing;
 
     struct endp_data endp_table[MAX_ENDPOINTS];
 
-    QEMUTimer *timer;
-
     /* Host side address */
     int bus_num;
     int addr;
@@ -186,7 +185,7 @@ static void async_complete(void *opaque)
             if (errno == EAGAIN)
                 return;
 
-            if (errno == ENODEV) {
+            if (errno == ENODEV && !s->closing) {
                 printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr);
 	        usb_device_del_addr(0, s->dev.addr);
                 return;
@@ -328,7 +327,8 @@ static void usb_host_handle_destroy(USBDevice *dev)
 {
     USBHostDevice *s = (USBHostDevice *)dev;
 
-    qemu_del_timer(s->timer);
+    s->closing = 1;
+
     qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
 
     hostdev_unlink(s);
@@ -582,22 +582,6 @@ static int usb_linux_update_endp_table(USBHostDevice *s)
     return 0;
 }
 
-static void usb_host_device_check(void *priv)
-{
-    USBHostDevice *s = priv;
-    struct usbdevfs_connectinfo ci;
-    int err;
-
-    err = ioctl(s->fd, USBDEVFS_CONNECTINFO, &ci);
-    if (err < 0) {
-        printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr);
-	usb_device_del_addr(0, s->dev.addr);
-	return;
-    }
-
-    qemu_mod_timer(s->timer, qemu_get_clock(rt_clock) + 1000);
-}
-
 static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *prod_name)
 {
     int fd = -1, ret;
@@ -612,10 +596,6 @@ static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *p
     dev->bus_num = bus_num;
     dev->addr = addr;
 
-    dev->timer = qemu_new_timer(rt_clock, usb_host_device_check, (void *) dev);
-    if (!dev->timer)
-	goto fail;
-
     printf("husb: open device %d.%d\n", bus_num, addr);
 
     snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d",
@@ -683,19 +663,14 @@ static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *p
     /* USB devio uses 'write' flag to check for async completions */
     qemu_set_fd_handler(dev->fd, NULL, async_complete, dev);
 
-    /* Start the timer to detect disconnect */
-    qemu_mod_timer(dev->timer, qemu_get_clock(rt_clock) + 1000);
-
     hostdev_link(dev);
 
     return (USBDevice *) dev;
 
 fail:
-    if (dev) {
-	if (dev->timer)
-		qemu_del_timer(dev->timer);
+    if (dev)
         qemu_free(dev);
-    }
+
     close(fd);
     return NULL;
 }
-- 
1.5.5.1


WARNING: multiple messages have this Message-ID (diff)
From: Max Krasnyansky <maxk@kernel.org>
To: qemu-devel@nongnu.org
Cc: kvm@vger.kernel.org, Max Krasnyansky <maxk@kernel.org>
Subject: [Qemu-devel] [PATCH] husb: remove disconnect detection timer
Date: Thu, 14 Aug 2008 21:39:44 +0000	[thread overview]
Message-ID: <1218749984-9254-1-git-send-email-maxk@kernel.org> (raw)

On top of my previous USB patchset.

Async completion handler can detect device disconnects without polling.
We do not need the timer anymore.

Signed-off-by: Max Krasnyansky <maxk@kernel.org>
---
 usb-linux.c |   37 ++++++-------------------------------
 1 files changed, 6 insertions(+), 31 deletions(-)

diff --git a/usb-linux.c b/usb-linux.c
index 786ef1b..dd78bb6 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -82,11 +82,10 @@ typedef struct USBHostDevice {
     uint8_t   descr[1024];
     int       descr_len;
     int       configuration;
+    int       closing;
 
     struct endp_data endp_table[MAX_ENDPOINTS];
 
-    QEMUTimer *timer;
-
     /* Host side address */
     int bus_num;
     int addr;
@@ -186,7 +185,7 @@ static void async_complete(void *opaque)
             if (errno == EAGAIN)
                 return;
 
-            if (errno == ENODEV) {
+            if (errno == ENODEV && !s->closing) {
                 printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr);
 	        usb_device_del_addr(0, s->dev.addr);
                 return;
@@ -328,7 +327,8 @@ static void usb_host_handle_destroy(USBDevice *dev)
 {
     USBHostDevice *s = (USBHostDevice *)dev;
 
-    qemu_del_timer(s->timer);
+    s->closing = 1;
+
     qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
 
     hostdev_unlink(s);
@@ -582,22 +582,6 @@ static int usb_linux_update_endp_table(USBHostDevice *s)
     return 0;
 }
 
-static void usb_host_device_check(void *priv)
-{
-    USBHostDevice *s = priv;
-    struct usbdevfs_connectinfo ci;
-    int err;
-
-    err = ioctl(s->fd, USBDEVFS_CONNECTINFO, &ci);
-    if (err < 0) {
-        printf("husb: device %d.%d disconnected\n", s->bus_num, s->addr);
-	usb_device_del_addr(0, s->dev.addr);
-	return;
-    }
-
-    qemu_mod_timer(s->timer, qemu_get_clock(rt_clock) + 1000);
-}
-
 static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *prod_name)
 {
     int fd = -1, ret;
@@ -612,10 +596,6 @@ static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *p
     dev->bus_num = bus_num;
     dev->addr = addr;
 
-    dev->timer = qemu_new_timer(rt_clock, usb_host_device_check, (void *) dev);
-    if (!dev->timer)
-	goto fail;
-
     printf("husb: open device %d.%d\n", bus_num, addr);
 
     snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d",
@@ -683,19 +663,14 @@ static USBDevice *usb_host_device_open_addr(int bus_num, int addr, const char *p
     /* USB devio uses 'write' flag to check for async completions */
     qemu_set_fd_handler(dev->fd, NULL, async_complete, dev);
 
-    /* Start the timer to detect disconnect */
-    qemu_mod_timer(dev->timer, qemu_get_clock(rt_clock) + 1000);
-
     hostdev_link(dev);
 
     return (USBDevice *) dev;
 
 fail:
-    if (dev) {
-	if (dev->timer)
-		qemu_del_timer(dev->timer);
+    if (dev)
         qemu_free(dev);
-    }
+
     close(fd);
     return NULL;
 }
-- 
1.5.5.1

             reply	other threads:[~2008-08-14 21:39 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-14 21:39 Max Krasnyansky [this message]
2008-08-14 21:39 ` [Qemu-devel] [PATCH] husb: remove disconnect detection timer Max Krasnyansky

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=1218749984-9254-1-git-send-email-maxk@kernel.org \
    --to=maxk@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=qemu-devel@nongnu.org \
    /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.