diff mbox series

[v2,wireless-drivers] mt76: mt7663u: fix memory leaks in mt7663u_probe

Message ID e4098f0c8a9ac51997de07f38c2bcdf7042d6db1.1592755166.git.lorenzo@kernel.org (mailing list archive)
State Accepted
Commit b1e79d105516fb96c39eb8a780936b87bae8e3e1
Delegated to: Kalle Valo
Headers show
Series [v2,wireless-drivers] mt76: mt7663u: fix memory leaks in mt7663u_probe | expand

Commit Message

Lorenzo Bianconi June 21, 2020, 4:03 p.m. UTC
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>
---
Changes since v1:
- properly set return value if device power-own fails
---
 .../net/wireless/mediatek/mt76/mt7615/usb.c   | 11 +++++-----
 drivers/net/wireless/mediatek/mt76/usb.c      | 22 ++++++++++++++-----
 2 files changed, 23 insertions(+), 10 deletions(-)

Comments

Kalle Valo June 22, 2020, 2:20 p.m. UTC | #1
Lorenzo Bianconi <lorenzo@kernel.org> writes:

> 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.

One logical change per patch, please. If you have to create a list of
changes in the commit log that's a good sign that you need to split the
patch :)
Lorenzo Bianconi June 22, 2020, 2:40 p.m. UTC | #2
> Lorenzo Bianconi <lorenzo@kernel.org> writes:
> 
> > 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.
> 
> One logical change per patch, please. If you have to create a list of
> changes in the commit log that's a good sign that you need to split the
> patch :)

Hi Kalle,

both of them are memory leaks in the error path of the same routine (mt7663u_probe()).
Do I need to split them even in this case? If so I am fine with it.
Do I need to send a v3?

Regards,
Lorenzo

> 
> -- 
> https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
>
Kalle Valo June 22, 2020, 2:58 p.m. UTC | #3
Lorenzo Bianconi <lorenzo.bianconi@redhat.com> writes:

>> Lorenzo Bianconi <lorenzo@kernel.org> writes:
>> 
>> > 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.
>> 
>> One logical change per patch, please. If you have to create a list of
>> changes in the commit log that's a good sign that you need to split the
>> patch :)
>
> both of them are memory leaks in the error path of the same routine (mt7663u_probe()).
> Do I need to split them even in this case? If so I am fine with it.
> Do I need to send a v3?

Oh, I didn't notice that they were in the same function. So I guess this
sort of gray area and no need to send v3 because of this.
Lorenzo Bianconi June 22, 2020, 3:03 p.m. UTC | #4
> Lorenzo Bianconi <lorenzo.bianconi@redhat.com> writes:
> 
> >> Lorenzo Bianconi <lorenzo@kernel.org> writes:
> >> 
> >> > 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.
> >> 
> >> One logical change per patch, please. If you have to create a list of
> >> changes in the commit log that's a good sign that you need to split the
> >> patch :)
> >
> > both of them are memory leaks in the error path of the same routine (mt7663u_probe()).
> > Do I need to split them even in this case? If so I am fine with it.
> > Do I need to send a v3?
> 
> Oh, I didn't notice that they were in the same function. So I guess this
> sort of gray area and no need to send v3 because of this.

ack, I will take into account for the next time, thanks :)

Regards,
Lorenzo

> 
> -- 
> https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
>
Kalle Valo June 23, 2020, 8:43 a.m. UTC | #5
Lorenzo Bianconi <lorenzo@kernel.org> wrote:

> 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>

Patch applied to wireless-drivers.git, thanks.

b1e79d105516 mt76: mt7663u: fix memory leaks in mt7663u_probe
diff mbox series

Patch

diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/usb.c b/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
index a50077eb24d7..c7763e209e00 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/usb.c
@@ -329,25 +329,26 @@  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;
+		ret = -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);