usbnet: Fix memory leak on Tx data path

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi

I have come across a scenario where usbnet can leak memory allocated to tx
urb.

usbnet Driver anchors the tx urbs and defers the urb submission if a
transmit request comes when the interface is suspended. Anchoring urb
increments the urb reference count. These deferred urbs are later accessed
by calling usb_get_from_anchor()for submission during interface resume.
usb_get_from_anchor()unanchors the urb but urb reference count remains
same.
This causes the urb reference count to remain non-zero after
usb_free_urb() gets called and urb never gets freed.Hence call
usb_put_urb() after anchoring the urb to properly balance the reference
count for these deferred urbs. Also,unanchor these deferred urbs during
disconnect, to free them up.

Here is the change which could fix it. Please review.

---
 drivers/net/usb/usbnet.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index 6de0a77..740c717 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -1168,6 +1168,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
 		usb_anchor_urb(urb, &dev->deferred);
 		/* no use to process more packets */
 		netif_stop_queue(net);
+		usb_put_urb(urb);
 		spin_unlock_irqrestore(&dev->txq.lock, flags);
 		netdev_dbg(dev->net, "Delaying transmission for resumption\n");
 		goto deferred;
@@ -1317,6 +1318,8 @@ void usbnet_disconnect (struct usb_interface *intf)

 	cancel_work_sync(&dev->kevent);

+	usb_scuttle_anchored_urbs(&dev->deferred);
+
 	if (dev->driver_info->unbind)
 		dev->driver_info->unbind (dev, intf);

-- 

CAF link :

https://www.codeaurora.org/gitweb/quic/la/?p=kernel/msm.git;a=commit;h=673e1f276a71065638da2dd7f431b630e9d414f4



Sent by an employee of the Qualcomm Innovation Center, Inc. The Qualcomm
Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by
The Linux Foundation.


--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux