Message ID | 20170919161522.995-3-dianders@chromium.org |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
Series | [RFC,1/3] usbnet: Get rid of spammy usbnet "kevent X may have been dropped" | expand |
Douglas Anderson <dianders@chromium.org> writes: > If rx_submit() returns an error code then nobody calls usb_free_urb(). > That means it's leaked. Nope. rx_submit() will call usb_free_urb() before returning an error: static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) .. if (!skb) { netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); usbnet_defer_kevent (dev, EVENT_RX_MEMORY); usb_free_urb (urb); return -ENOMEM; } .. if (retval) { dev_kfree_skb_any (skb); usb_free_urb (urb); } Bjørn
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index e72547d8d0e6..4c067aaeea5a 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -1182,9 +1182,12 @@ usbnet_deferred_kevent (struct work_struct *work) usb_free_urb(urb); goto fail_lowmem; } - if (rx_submit (dev, urb, GFP_KERNEL) == - -ENOLINK) - resched = 0; + status = rx_submit (dev, urb, GFP_KERNEL); + if (status) { + usb_free_urb(urb); + if (status == -ENOLINK) + resched = 0; + } usb_autopm_put_interface(dev->intf); fail_lowmem: if (resched)
If rx_submit() returns an error code then nobody calls usb_free_urb(). That means it's leaked. NOTE: This problem was found solely by code inspection and not due to any failing test cases. Signed-off-by: Douglas Anderson <dianders@chromium.org> --- drivers/net/usb/usbnet.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)