USB: limit usbfs snooping of URB contents
authorAlan Stern <stern@rowland.harvard.edu>
Fri, 20 Nov 2015 18:53:22 +0000 (13:53 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 1 Dec 2015 18:44:19 +0000 (10:44 -0800)
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: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/kernel-parameters.txt
drivers/usb/core/devio.c

index 742f69d18fc8989ae28d9c0662d6bf334109dddd..e6b6e056cc115756220058c1fde475ed065c8fc6 100644 (file)
@@ -3874,6 +3874,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
        usbcore.usbfs_snoop=
                        [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=
                        [USB] Set to cycle leds on hubs (default 0 = off).
 
index 38ae877c46e3124eb07c2a46ddd33bc66ac54d93..3d41faf6e6073420a68a90536ecbfd4308a40701 100644 (file)
@@ -100,6 +100,11 @@ static bool usbfs_snoop;
 module_param(usbfs_snoop, bool, S_IRUGO | S_IWUSR);
 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...)                             \
        do {                                                    \
                if (usbfs_snoop)                                \
@@ -392,6 +397,7 @@ static void snoop_urb(struct usb_device *udev,
                                        ep, t, d, length, timeout_or_status);
        }
 
+       data_len = min(data_len, usbfs_snoop_max);
        if (data && data_len > 0) {
                print_hex_dump(KERN_DEBUG, "data: ", DUMP_PREFIX_NONE, 32, 1,
                        data, data_len, 1);
@@ -402,7 +408,8 @@ static void snoop_urb_data(struct urb *urb, unsigned len)
 {
        int i, size;
 
-       if (!usbfs_snoop)
+       len = min(len, usbfs_snoop_max);
+       if (!usbfs_snoop || len == 0)
                return;
 
        if (urb->num_sgs == 0) {
This page took 0.039373 seconds and 5 git commands to generate.