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