Commit 0290cc9f authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

USB: limit usbfs snooping of URB contents

The usbfs_snoop facility can be very useful for debugging problems
involving usbfs.  However, it always prints out the entire contents of
every URB.  When dealing with large quantities of data, this can be
less than helpful.

This patch ameliorates the situation by adding a module parameter to
usbcore for controlling the maximum number of bytes to print when
snooping an URB.  This makes debugging much easier.  For backward
compatibility, the default value is set unreasonably high.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 31ade3b8
...@@ -3874,6 +3874,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -3874,6 +3874,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
usbcore.usbfs_snoop= usbcore.usbfs_snoop=
[USB] Set to log all usbfs traffic (default 0 = off). [USB] Set to log all usbfs traffic (default 0 = off).
usbcore.usbfs_snoop_max=
[USB] Maximum number of bytes to snoop in each URB
(default = 65536).
usbcore.blinkenlights= usbcore.blinkenlights=
[USB] Set to cycle leds on hubs (default 0 = off). [USB] Set to cycle leds on hubs (default 0 = off).
......
...@@ -100,6 +100,11 @@ static bool usbfs_snoop; ...@@ -100,6 +100,11 @@ static bool usbfs_snoop;
module_param(usbfs_snoop, bool, S_IRUGO | S_IWUSR); module_param(usbfs_snoop, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(usbfs_snoop, "true to log all usbfs traffic"); MODULE_PARM_DESC(usbfs_snoop, "true to log all usbfs traffic");
static unsigned usbfs_snoop_max = 65536;
module_param(usbfs_snoop_max, uint, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(usbfs_snoop_max,
"maximum number of bytes to print while snooping");
#define snoop(dev, format, arg...) \ #define snoop(dev, format, arg...) \
do { \ do { \
if (usbfs_snoop) \ if (usbfs_snoop) \
...@@ -392,6 +397,7 @@ static void snoop_urb(struct usb_device *udev, ...@@ -392,6 +397,7 @@ static void snoop_urb(struct usb_device *udev,
ep, t, d, length, timeout_or_status); ep, t, d, length, timeout_or_status);
} }
data_len = min(data_len, usbfs_snoop_max);
if (data && data_len > 0) { if (data && data_len > 0) {
print_hex_dump(KERN_DEBUG, "data: ", DUMP_PREFIX_NONE, 32, 1, print_hex_dump(KERN_DEBUG, "data: ", DUMP_PREFIX_NONE, 32, 1,
data, data_len, 1); data, data_len, 1);
...@@ -402,7 +408,8 @@ static void snoop_urb_data(struct urb *urb, unsigned len) ...@@ -402,7 +408,8 @@ static void snoop_urb_data(struct urb *urb, unsigned len)
{ {
int i, size; int i, size;
if (!usbfs_snoop) len = min(len, usbfs_snoop_max);
if (!usbfs_snoop || len == 0)
return; return;
if (urb->num_sgs == 0) { if (urb->num_sgs == 0) {
......
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