ALSA: usb-audio: Rate limit usb_set_interface error reporting
authorChris Down <chris@chrisdown.name>
Fri, 21 Apr 2023 14:38:41 +0000 (15:38 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 21 Apr 2023 15:07:28 +0000 (17:07 +0200)
When an error occurs during USB disconnection sometimes things can go
wrong as endpoint_set_interface may end up being called repeatedly. For
example:

% dmesg --notime | grep 'usb 3-7.1.4' | sort | uniq -c | head -2
   3069 usb 3-7.1.4: 1:1: usb_set_interface failed (-19)
    908 usb 3-7.1.4: 1:1: usb_set_interface failed (-71)

In my case, there sometimes are hundreds of these usb_set_interface
failure messages a second when I disconnect the hub that has my USB
audio device.

These messages can take a huge amount of the kmsg ringbuffer and don't
provide any extra information over the previous ones, so ratelimit them.

Signed-off-by: Chris Down <chris@chrisdown.name>
Link: https://lore.kernel.org/r/ZEKf8UYBYa1h4JWR@chrisdown.name
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/endpoint.c
sound/usb/usbaudio.h

index 25563a5093c52a78649db3400cbba7376e41225a..a385e85c4650b059333d43bb97765dcbdfc6b50e 100644 (file)
@@ -916,8 +916,9 @@ static int endpoint_set_interface(struct snd_usb_audio *chip,
                      ep->iface, altset, ep->ep_num);
        err = usb_set_interface(chip->dev, ep->iface, altset);
        if (err < 0) {
-               usb_audio_err(chip, "%d:%d: usb_set_interface failed (%d)\n",
-                             ep->iface, altset, err);
+               usb_audio_err_ratelimited(
+                       chip, "%d:%d: usb_set_interface failed (%d)\n",
+                       ep->iface, altset, err);
                return err;
        }
 
index f5a8dca66457f586ab93369e1830be1374132dc5..38a85b2c9a73e0d62d0b73a4491a6a34a80b3a87 100644 (file)
@@ -67,6 +67,8 @@ struct snd_usb_audio {
 
 #define usb_audio_err(chip, fmt, args...) \
        dev_err(&(chip)->dev->dev, fmt, ##args)
+#define usb_audio_err_ratelimited(chip, fmt, args...) \
+       dev_err_ratelimited(&(chip)->dev->dev, fmt, ##args)
 #define usb_audio_warn(chip, fmt, args...) \
        dev_warn(&(chip)->dev->dev, fmt, ##args)
 #define usb_audio_info(chip, fmt, args...) \