Search Linux Wireless

Re: [PATCH wireless-drivers] mt76: mt7663u: fix memory leaks in mt7663u_probe

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

 



> 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@xxxxxxxxxx>
> ---
>  .../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: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux