ChangeSet 1.1371.759.33, 2004/04/26 17:07:28-07:00, [EMAIL PROTECTED]

USB: switch struct urb to use a kref instead of it's own atomic_t


 drivers/usb/core/urb.c |   21 +++++++++++++--------
 include/linux/usb.h    |    3 ++-
 2 files changed, 15 insertions(+), 9 deletions(-)


diff -Nru a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
--- a/drivers/usb/core/urb.c    Fri May 14 15:32:12 2004
+++ b/drivers/usb/core/urb.c    Fri May 14 15:32:12 2004
@@ -13,6 +13,14 @@
 #include <linux/usb.h>
 #include "hcd.h"
 
+#define to_urb(d) container_of(d, struct urb, kref)
+
+static void urb_destroy(struct kref *kref)
+{
+       struct urb *urb = to_urb(kref);
+       kfree(urb);
+}
+
 /**
  * usb_init_urb - initializes a urb so that it can be used by a USB driver
  * @urb: pointer to the urb to initialize
@@ -31,7 +39,7 @@
 {
        if (urb) {
                memset(urb, 0, sizeof(*urb));
-               urb->count = (atomic_t)ATOMIC_INIT(1);
+               kref_init(&urb->kref, urb_destroy);
                spin_lock_init(&urb->lock);
        }
 }
@@ -80,8 +88,7 @@
 void usb_free_urb(struct urb *urb)
 {
        if (urb)
-               if (atomic_dec_and_test(&urb->count))
-                       kfree(urb);
+               kref_put(&urb->kref);
 }
 
 /**
@@ -96,11 +103,9 @@
  */
 struct urb * usb_get_urb(struct urb *urb)
 {
-       if (urb) {
-               atomic_inc(&urb->count);
-               return urb;
-       } else
-               return NULL;
+       if (urb)
+               kref_get(&urb->kref);
+       return urb;
 }
                
                
diff -Nru a/include/linux/usb.h b/include/linux/usb.h
--- a/include/linux/usb.h       Fri May 14 15:32:12 2004
+++ b/include/linux/usb.h       Fri May 14 15:32:12 2004
@@ -14,6 +14,7 @@
 #include <linux/delay.h>       /* for mdelay() */
 #include <linux/interrupt.h>   /* for in_interrupt() */
 #include <linux/list.h>                /* for struct list_head */
+#include <linux/kref.h>                /* for struct kref */
 #include <linux/device.h>      /* for struct device */
 #include <linux/fs.h>          /* for struct file_operations */
 #include <linux/completion.h>  /* for struct completion */
@@ -731,8 +732,8 @@
 struct urb
 {
        /* private, usb core and host controller only fields in the urb */
+       struct kref kref;               /* reference count of the URB */
        spinlock_t lock;                /* lock for the URB */
-       atomic_t count;                 /* reference count of the URB */
        void *hcpriv;                   /* private data for host controller */
        struct list_head urb_list;      /* list pointer to all active urbs */
        int bandwidth;                  /* bandwidth for INT/ISO request */



-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id%62&alloc_ida84&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to