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