Search Linux Wireless

Re: [RFC 3/3] mt76x02: remove bogus mutex usage

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

 



> mac .start(), .stop() callbacks are never called concurrently with other
> mac callbacks. The only concurencly is with mt76 works which we cancel
> on stop() and schedule on start().
> 
> This fixes possible deadlock on cancel_delayed_work_sync(&dev->mac_work)
> as mac_work also take mutex.
> 
> Signed-off-by: Stanislaw Gruszka <sgruszka@xxxxxxxxxx>
> ---
>  .../net/wireless/mediatek/mt76/mt76x0/pci.c   |  6 -----
>  .../net/wireless/mediatek/mt76/mt76x0/usb.c   | 22 +++++--------------
>  .../wireless/mediatek/mt76/mt76x2/pci_main.c  |  5 -----
>  .../wireless/mediatek/mt76/mt76x2/usb_main.c  | 10 ++-------
>  4 files changed, 7 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
> index 156d3d064ba0..ac979128386a 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
> @@ -25,8 +25,6 @@ static int mt76x0e_start(struct ieee80211_hw *hw)
>  {
>  	struct mt76x02_dev *dev = hw->priv;
>  
> -	mutex_lock(&dev->mt76.mutex);
> -
>  	mt76x02_mac_start(dev);
>  	mt76x0_phy_calibrate(dev, true);
>  	ieee80211_queue_delayed_work(dev->mt76.hw, &dev->mac_work,
> @@ -35,8 +33,6 @@ static int mt76x0e_start(struct ieee80211_hw *hw)
>  				     MT_CALIBRATE_INTERVAL);
>  	set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
>  
> -	mutex_unlock(&dev->mt76.mutex);
> -
>  	return 0;
>  }
>  
> @@ -62,10 +58,8 @@ static void mt76x0e_stop(struct ieee80211_hw *hw)
>  {
>  	struct mt76x02_dev *dev = hw->priv;
>  
> -	mutex_lock(&dev->mt76.mutex);
>  	clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
>  	mt76x0e_stop_hw(dev);
> -	mutex_unlock(&dev->mt76.mutex);
>  }
>  
>  static void

[..]

>  static const struct ieee80211_ops mt76x0u_ops = {
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
> index 16dc8e2451b5..1b5caabebff5 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
> @@ -22,8 +22,6 @@ mt76x2_start(struct ieee80211_hw *hw)
>  	struct mt76x02_dev *dev = hw->priv;
>  	int ret;
>  
> -	mutex_lock(&dev->mt76.mutex);
> -
>  	ret = mt76x2_mac_start(dev);
>  	if (ret)
>  		goto out;

You can remove goto here and just return ret (same below)

> @@ -40,7 +38,6 @@ mt76x2_start(struct ieee80211_hw *hw)
>  	set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
>  
>  out:
> -	mutex_unlock(&dev->mt76.mutex);
>  	return ret;
>  }
>  
> @@ -49,10 +46,8 @@ mt76x2_stop(struct ieee80211_hw *hw)
>  {
>  	struct mt76x02_dev *dev = hw->priv;
>  
> -	mutex_lock(&dev->mt76.mutex);
>  	clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
>  	mt76x2_stop_hardware(dev);
> -	mutex_unlock(&dev->mt76.mutex);
>  }
>  
>  static int
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
> index 0771de210c6a..32726b4906ea 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c
> @@ -21,30 +21,24 @@ static int mt76x2u_start(struct ieee80211_hw *hw)
>  	struct mt76x02_dev *dev = hw->priv;
>  	int ret;
>  
> -	mutex_lock(&dev->mt76.mutex);
> -
>  	ret = mt76x2u_mac_start(dev);
>  	if (ret)
> -		goto out;
> +		return ret;
>  
>  	ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mac_work,
>  				     MT_MAC_WORK_INTERVAL);
>  	set_bit(MT76_STATE_RUNNING, &dev->mt76.state);
>  
> -out:
> -	mutex_unlock(&dev->mt76.mutex);
> -	return ret;
> +	return 0;
>  }
>  
>  static void mt76x2u_stop(struct ieee80211_hw *hw)
>  {
>  	struct mt76x02_dev *dev = hw->priv;
>  
> -	mutex_lock(&dev->mt76.mutex);
>  	clear_bit(MT76_STATE_RUNNING, &dev->mt76.state);
>  	mt76u_stop_tx(&dev->mt76);
>  	mt76x2u_stop_hw(dev);
> -	mutex_unlock(&dev->mt76.mutex);
>  }
>  
>  static int
> -- 
> 2.20.1
> 

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