Commit 4d59d8a1 authored by Sarah Sharp's avatar Sarah Sharp Committed by Greg Kroah-Hartman

USB: Export URB statistics for powertop

powertop currently tracks interrupts generated by uhci, ehci, and ohci,
but it has no way of telling which USB device to blame USB bus activity on.
This patch exports the number of URBs that are submitted for a given device.
Cat the file 'urbnum' in /sys/bus/usb/devices/.../
Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 437f375f
...@@ -1176,6 +1176,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags) ...@@ -1176,6 +1176,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
*/ */
usb_get_urb(urb); usb_get_urb(urb);
atomic_inc(&urb->use_count); atomic_inc(&urb->use_count);
atomic_inc(&urb->dev->urbnum);
usbmon_urb_submit(&hcd->self, urb); usbmon_urb_submit(&hcd->self, urb);
/* NOTE requirements on root-hub callers (usbfs and the hub /* NOTE requirements on root-hub callers (usbfs and the hub
...@@ -1197,6 +1198,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags) ...@@ -1197,6 +1198,7 @@ int usb_hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
urb->hcpriv = NULL; urb->hcpriv = NULL;
INIT_LIST_HEAD(&urb->urb_list); INIT_LIST_HEAD(&urb->urb_list);
atomic_dec(&urb->use_count); atomic_dec(&urb->use_count);
atomic_dec(&urb->dev->urbnum);
if (urb->reject) if (urb->reject)
wake_up(&usb_kill_urb_queue); wake_up(&usb_kill_urb_queue);
usb_put_urb(urb); usb_put_urb(urb);
......
...@@ -169,6 +169,16 @@ show_quirks(struct device *dev, struct device_attribute *attr, char *buf) ...@@ -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 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->urbnum));
}
static DEVICE_ATTR(urbnum, S_IRUGO, show_urbnum, NULL);
#if defined(CONFIG_USB_PERSIST) || defined(CONFIG_USB_SUSPEND) #if defined(CONFIG_USB_PERSIST) || defined(CONFIG_USB_SUSPEND)
static const char power_group[] = "power"; static const char power_group[] = "power";
...@@ -458,6 +468,7 @@ static struct attribute *dev_attrs[] = { ...@@ -458,6 +468,7 @@ static struct attribute *dev_attrs[] = {
&dev_attr_bConfigurationValue.attr, &dev_attr_bConfigurationValue.attr,
&dev_attr_bmAttributes.attr, &dev_attr_bmAttributes.attr,
&dev_attr_bMaxPower.attr, &dev_attr_bMaxPower.attr,
&dev_attr_urbnum.attr,
/* device attributes */ /* device attributes */
&dev_attr_idVendor.attr, &dev_attr_idVendor.attr,
&dev_attr_idProduct.attr, &dev_attr_idProduct.attr,
......
...@@ -266,6 +266,7 @@ usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus, unsigned port1) ...@@ -266,6 +266,7 @@ usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus, unsigned port1)
dev->dev.dma_mask = bus->controller->dma_mask; dev->dev.dma_mask = bus->controller->dma_mask;
set_dev_node(&dev->dev, dev_to_node(bus->controller)); set_dev_node(&dev->dev, dev_to_node(bus->controller));
dev->state = USB_STATE_ATTACHED; dev->state = USB_STATE_ATTACHED;
atomic_set(&dev->urbnum, 0);
INIT_LIST_HEAD(&dev->ep0.urb_list); INIT_LIST_HEAD(&dev->ep0.urb_list);
dev->ep0.desc.bLength = USB_DT_ENDPOINT_SIZE; dev->ep0.desc.bLength = USB_DT_ENDPOINT_SIZE;
......
...@@ -415,6 +415,7 @@ struct usb_device { ...@@ -415,6 +415,7 @@ struct usb_device {
int pm_usage_cnt; /* usage counter for autosuspend */ int pm_usage_cnt; /* usage counter for autosuspend */
u32 quirks; /* quirks of the whole device */ u32 quirks; /* quirks of the whole device */
atomic_t urbnum; /* number of URBs submitted for the whole device */
#ifdef CONFIG_PM #ifdef CONFIG_PM
struct delayed_work autosuspend; /* for delayed autosuspends */ struct delayed_work autosuspend; /* for delayed autosuspends */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment