public inbox for linux-wireless@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH wireless-drivers] mt76: mt7663u: fix memory leaks in mt7663u_probe
@ 2020-06-21 15:51 Lorenzo Bianconi
  2020-06-21 16:01 ` Lorenzo Bianconi
  0 siblings, 1 reply; 2+ messages in thread
From: Lorenzo Bianconi @ 2020-06-21 15:51 UTC (permalink / raw)
  To: kvalo; +Cc: linux-wireless, nbd, lorenzo.bianconi, sean.wang

Fix the two following memory leaks in mt7663u_probe:
1- if device power-own times out, remove ieee80211 hw device.
2- if mt76u queues allocation fails, remove pending urbs.

Fixes: eb99cc95c3b65 ("mt76: mt7615: introduce mt7663u support")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 .../net/wireless/mediatek/mt76/mt7615/usb.c   | 10 ++++-----
 drivers/net/wireless/mediatek/mt76/usb.c      | 22 ++++++++++++++-----
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/usb.c b/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
index a50077eb24d7..18a4dd59b7e4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
@@ -329,25 +329,25 @@ static int mt7663u_probe(struct usb_interface *usb_intf,
 	if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_PWR_ON,
 			    FW_STATE_PWR_ON << 1, 500)) {
 		dev_err(dev->mt76.dev, "Timeout for power on\n");
-		return -EIO;
+		goto error;
 	}
 
 alloc_queues:
 	ret = mt76u_alloc_mcu_queue(&dev->mt76);
 	if (ret)
-		goto error;
+		goto error_free_q;
 
 	ret = mt76u_alloc_queues(&dev->mt76);
 	if (ret)
-		goto error;
+		goto error_free_q;
 
 	ret = mt7663u_register_device(dev);
 	if (ret)
-		goto error_freeq;
+		goto error_free_q;
 
 	return 0;
 
-error_freeq:
+error_free_q:
 	mt76u_queues_deinit(&dev->mt76);
 error:
 	mt76u_deinit(&dev->mt76);
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index fb97ea25b4d4..2e89b0514ff6 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -1066,11 +1066,16 @@ static int mt76u_alloc_tx(struct mt76_dev *dev)
 
 static void mt76u_free_tx(struct mt76_dev *dev)
 {
-	struct mt76_queue *q;
-	int i, j;
+	int i;
 
 	for (i = 0; i < IEEE80211_NUM_ACS; i++) {
+		struct mt76_queue *q;
+		int j;
+
 		q = dev->q_tx[i].q;
+		if (!q)
+			continue;
+
 		for (j = 0; j < q->ndesc; j++)
 			usb_free_urb(q->entry[j].urb);
 	}
@@ -1078,17 +1083,22 @@ static void mt76u_free_tx(struct mt76_dev *dev)
 
 void mt76u_stop_tx(struct mt76_dev *dev)
 {
-	struct mt76_queue_entry entry;
-	struct mt76_queue *q;
-	int i, j, ret;
+	int ret;
 
 	ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
 				 HZ / 5);
 	if (!ret) {
+		struct mt76_queue_entry entry;
+		struct mt76_queue *q;
+		int i, j;
+
 		dev_err(dev->dev, "timed out waiting for pending tx\n");
 
 		for (i = 0; i < IEEE80211_NUM_ACS; i++) {
 			q = dev->q_tx[i].q;
+			if (!q)
+				continue;
+
 			for (j = 0; j < q->ndesc; j++)
 				usb_kill_urb(q->entry[j].urb);
 		}
@@ -1100,6 +1110,8 @@ void mt76u_stop_tx(struct mt76_dev *dev)
 		 */
 		for (i = 0; i < IEEE80211_NUM_ACS; i++) {
 			q = dev->q_tx[i].q;
+			if (!q)
+				continue;
 
 			/* Assure we are in sync with killed tasklet. */
 			spin_lock_bh(&q->lock);
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH wireless-drivers] mt76: mt7663u: fix memory leaks in mt7663u_probe
  2020-06-21 15:51 [PATCH wireless-drivers] mt76: mt7663u: fix memory leaks in mt7663u_probe Lorenzo Bianconi
@ 2020-06-21 16:01 ` Lorenzo Bianconi
  0 siblings, 0 replies; 2+ messages in thread
From: Lorenzo Bianconi @ 2020-06-21 16:01 UTC (permalink / raw)
  To: kvalo; +Cc: linux-wireless, nbd, lorenzo.bianconi, sean.wang

[-- Attachment #1: Type: text/plain, Size: 3341 bytes --]

> Fix the two following memory leaks in mt7663u_probe:
> 1- if device power-own times out, remove ieee80211 hw device.
> 2- if mt76u queues allocation fails, remove pending urbs.

Hi Kalle,

please drop this version since I spotted an issue, I am sending a v2.

Regards,
Lorenzo

> 
> Fixes: eb99cc95c3b65 ("mt76: mt7615: introduce mt7663u support")
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> ---
>  .../net/wireless/mediatek/mt76/mt7615/usb.c   | 10 ++++-----
>  drivers/net/wireless/mediatek/mt76/usb.c      | 22 ++++++++++++++-----
>  2 files changed, 22 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/usb.c b/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
> index a50077eb24d7..18a4dd59b7e4 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
> @@ -329,25 +329,25 @@ static int mt7663u_probe(struct usb_interface *usb_intf,
>  	if (!mt76_poll_msec(dev, MT_CONN_ON_MISC, MT_TOP_MISC2_FW_PWR_ON,
>  			    FW_STATE_PWR_ON << 1, 500)) {
>  		dev_err(dev->mt76.dev, "Timeout for power on\n");
> -		return -EIO;
> +		goto error;
>  	}
>  
>  alloc_queues:
>  	ret = mt76u_alloc_mcu_queue(&dev->mt76);
>  	if (ret)
> -		goto error;
> +		goto error_free_q;
>  
>  	ret = mt76u_alloc_queues(&dev->mt76);
>  	if (ret)
> -		goto error;
> +		goto error_free_q;
>  
>  	ret = mt7663u_register_device(dev);
>  	if (ret)
> -		goto error_freeq;
> +		goto error_free_q;
>  
>  	return 0;
>  
> -error_freeq:
> +error_free_q:
>  	mt76u_queues_deinit(&dev->mt76);
>  error:
>  	mt76u_deinit(&dev->mt76);
> diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
> index fb97ea25b4d4..2e89b0514ff6 100644
> --- a/drivers/net/wireless/mediatek/mt76/usb.c
> +++ b/drivers/net/wireless/mediatek/mt76/usb.c
> @@ -1066,11 +1066,16 @@ static int mt76u_alloc_tx(struct mt76_dev *dev)
>  
>  static void mt76u_free_tx(struct mt76_dev *dev)
>  {
> -	struct mt76_queue *q;
> -	int i, j;
> +	int i;
>  
>  	for (i = 0; i < IEEE80211_NUM_ACS; i++) {
> +		struct mt76_queue *q;
> +		int j;
> +
>  		q = dev->q_tx[i].q;
> +		if (!q)
> +			continue;
> +
>  		for (j = 0; j < q->ndesc; j++)
>  			usb_free_urb(q->entry[j].urb);
>  	}
> @@ -1078,17 +1083,22 @@ static void mt76u_free_tx(struct mt76_dev *dev)
>  
>  void mt76u_stop_tx(struct mt76_dev *dev)
>  {
> -	struct mt76_queue_entry entry;
> -	struct mt76_queue *q;
> -	int i, j, ret;
> +	int ret;
>  
>  	ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
>  				 HZ / 5);
>  	if (!ret) {
> +		struct mt76_queue_entry entry;
> +		struct mt76_queue *q;
> +		int i, j;
> +
>  		dev_err(dev->dev, "timed out waiting for pending tx\n");
>  
>  		for (i = 0; i < IEEE80211_NUM_ACS; i++) {
>  			q = dev->q_tx[i].q;
> +			if (!q)
> +				continue;
> +
>  			for (j = 0; j < q->ndesc; j++)
>  				usb_kill_urb(q->entry[j].urb);
>  		}
> @@ -1100,6 +1110,8 @@ void mt76u_stop_tx(struct mt76_dev *dev)
>  		 */
>  		for (i = 0; i < IEEE80211_NUM_ACS; i++) {
>  			q = dev->q_tx[i].q;
> +			if (!q)
> +				continue;
>  
>  			/* Assure we are in sync with killed tasklet. */
>  			spin_lock_bh(&q->lock);
> -- 
> 2.26.2
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-06-21 16:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-21 15:51 [PATCH wireless-drivers] mt76: mt7663u: fix memory leaks in mt7663u_probe Lorenzo Bianconi
2020-06-21 16:01 ` Lorenzo Bianconi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox