Am Mittwoch, 6. Juni 2007 schrieb Pete Zaitcev:
> So, you add 24 bytes to all URBs, which are... not very thin, to be sure.
> Last time I counted they were 152 bytes apiece. Still, a 15% increase.
> I know you're a good algorithmist, are you sure you don't have any ideas?
> 
> The naive approach is to have anchor elements out of line... In a slab,
> since they are fixed-sized. What do you think?

Here's a patch to reduce padding:

--- a/include/linux/usb.h       2007-06-06 13:44:41.000000000 +0200
+++ b/include/linux/usb.h       2007-06-06 14:29:43.000000000 +0200
@@ -1142,24 +1142,24 @@ struct urb
 {
        /* private: usb core and host controller only fields in the urb */
        struct kref kref;               /* reference count of the URB */
+       atomic_t use_count;             /* concurrent submissions counter */
        spinlock_t lock;                /* lock for the URB */
        void *hcpriv;                   /* private data for host controller */
-       atomic_t use_count;             /* concurrent submissions counter */
+       struct list_head anchor_list;   /* the URB may be anchored by the 
driver */
+       struct usb_anchor *anchor;      /* anchor to which we are chained */
        u8 reject;                      /* submissions will fail */
 
        /* public: documented fields in the urb that can be used by drivers */
+       short status;                   /* (return) non-ISO status */
+       unsigned short transfer_flags;  /* (in) URB_SHORT_NOT_OK | ...*/
+       unsigned int pipe;              /* (in) pipe information */
+       int transfer_buffer_length;     /* (in) data buffer length */
+       int actual_length;              /* (return) actual transfer length */
        struct list_head urb_list;      /* list head for use by the urb's
                                         * current owner */
-       struct list_head anchor_list;   /* the URB may be anchored by the 
driver */
-       struct usb_anchor *anchor;
        struct usb_device *dev;         /* (in) pointer to associated device */
-       unsigned int pipe;              /* (in) pipe information */
-       int status;                     /* (return) non-ISO status */
-       unsigned int transfer_flags;    /* (in) URB_SHORT_NOT_OK | ...*/
        void *transfer_buffer;          /* (in) associated data buffer */
        dma_addr_t transfer_dma;        /* (in) dma addr for transfer_buffer */
-       int transfer_buffer_length;     /* (in) data buffer length */
-       int actual_length;              /* (return) actual transfer length */
        unsigned char *setup_packet;    /* (in) setup packet (control only) */
        dma_addr_t setup_dma;           /* (in) dma addr for setup_packet */
        int start_frame;                /* (modify) start frame (ISO) */

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to