[PATCH] Try 2: Export URB statistics for powertop.

Sarah Sharp <[email protected]>
Newsgroups gmane.linux.usb.devel
Message-ID <20071004210407.GA3800@localdomain>
The new version of this patch includes correct initialization and URB
counter increment in usb_hcd_submit_urb(), which is less likely to run
in interrupt context.

powertop currently tracks interrupts generated by uhci and ehci,
but it has no way of telling which USB device to blame USB bus activity on.
This patch exports the number of URBs that complete for a given device.
Cat the file 'urbnum' in /sys/bus/usb/devices/.../

Signed-off-by: Sarah Sharp <[email protected]>
Signed-off-by: Sarah Sharp <[email protected]>
Signed-off-by: Sarah Sharp <[email protected]>
Signed-off-by: Sarah Sharp <[email protected]>
---
 drivers/usb/core/hcd.c   |    2 ++
 drivers/usb/core/sysfs.c |   11 +++++++++++
 drivers/usb/core/usb.c   |    1 +
 include/linux/usb.h      |    1 +
 4 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 42ef1d5..ff4ca1e 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -989,6 +989,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
 	 */
 	urb = usb_get_urb (urb);
 	atomic_inc (&urb->use_count);
+	atomic_inc(&urb->dev->urb_cnt);
 
 	if (is_root_hub(urb->dev)) {
 		/* NOTE:  requirement on hub callers (usbfs and the hub
@@ -1027,6 +1028,7 @@ done:
 	if (unlikely (status)) {
 		urb_unlink(hcd, urb);
 		atomic_dec (&urb->use_count);
+		atomic_dec(&urb->dev->urb_cnt);
 		if (urb->reject)
 			wake_up (&usb_kill_urb_queue);
 		usbmon_urb_submit_error(&hcd->self, urb, status);
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c
index 2ab222b..c4e4cdf 100644
--- a/drivers/usb/core/sysfs.c
+++ b/drivers/usb/core/sysfs.c
@@ -169,6 +169,16 @@ show_quirks(struct device *dev, struct device_attribute *attr, char *buf)
 }
 static DEVICE_ATTR(quirks, S_IRUGO, show_quirks, NULL);
 
+static ssize_t
+show_urbnum(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	struct usb_device *udev;
+
+	udev = to_usb_device(dev);
+	return sprintf(buf, "%d\n", atomic_read(&udev->urb_cnt));
+}
+static DEVICE_ATTR(urbnum, S_IRUGO, show_urbnum, NULL);
+
 
 #if defined(CONFIG_USB_PERSIST) || defined(CONFIG_USB_SUSPEND)
 static const char power_group[] = "power";
@@ -420,6 +430,7 @@ static struct attribute *dev_attrs[] = {
 	&dev_attr_bConfigurationValue.attr,
 	&dev_attr_bmAttributes.attr,
 	&dev_attr_bMaxPower.attr,
+	&dev_attr_urbnum.attr,
 	/* device attributes */
 	&dev_attr_idVendor.attr,
 	&dev_attr_idProduct.attr,
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 0fee5c6..15532ab 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -255,6 +255,7 @@ usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus, unsigned port1)
 	dev->dev.dma_mask = bus->controller->dma_mask;
 	set_dev_node(&dev->dev, dev_to_node(bus->controller));
 	dev->state = USB_STATE_ATTACHED;
+	atomic_set(&dev->urb_cnt, 0);
 
 	INIT_LIST_HEAD(&dev->ep0.urb_list);
 	dev->ep0.desc.bLength = USB_DT_ENDPOINT_SIZE;
diff --git a/include/linux/usb.h b/include/linux/usb.h
index 4f33a58..3d88ff7 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -405,6 +405,7 @@ struct usb_device {
 
 	int pm_usage_cnt;		/* usage counter for autosuspend */
 	u32 quirks;			/* quirks of the whole device */
+	atomic_t urb_cnt;		/* number of URBs completed for the whole device */
 
 #ifdef CONFIG_PM
 	struct delayed_work autosuspend; /* for delayed autosuspends */
-- 
1.5.2.4

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.