From: "Matthew Wilcox (Oracle)" <wi...@infradead.org> Straightforward conversion; locking is similar. It may be possible to change the GFP_ATOMIC to GFP_KERNEL, but I can't tell whether this context permits sleeping or not.
Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org> --- .../net/wireless/mediatek/mt76/mt7615/init.c | 11 ++++----- .../net/wireless/mediatek/mt76/mt7615/mac.c | 24 +++++++++---------- .../wireless/mediatek/mt76/mt7615/mt7615.h | 4 ++-- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c index 859de2454ec6..459ccb79c9cf 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c @@ -71,8 +71,7 @@ static int mt7615_init_hardware(struct mt7615_dev *dev) mt76_wr(dev, MT_INT_SOURCE_CSR, ~0); - spin_lock_init(&dev->token_lock); - idr_init(&dev->token); + xa_init_flags(&dev->token, XA_FLAGS_ALLOC | XA_FLAGS_LOCK_BH); ret = mt7615_eeprom_init(dev); if (ret < 0) @@ -266,21 +265,19 @@ int mt7615_register_device(struct mt7615_dev *dev) void mt7615_unregister_device(struct mt7615_dev *dev) { struct mt76_txwi_cache *txwi; - int id; + unsigned long id; mt76_unregister_device(&dev->mt76); mt7615_mcu_exit(dev); mt7615_dma_cleanup(dev); - spin_lock_bh(&dev->token_lock); - idr_for_each_entry(&dev->token, txwi, id) { + xa_for_each(&dev->token, id, txwi) { mt7615_txp_skb_unmap(&dev->mt76, txwi); if (txwi->skb) dev_kfree_skb_any(txwi->skb); mt76_put_txwi(&dev->mt76, txwi); } - spin_unlock_bh(&dev->token_lock); - idr_destroy(&dev->token); + xa_destroy(&dev->token); mt76_free_device(&dev->mt76); } diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c index 1eb0e9c9970c..335fc3cdcb86 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c @@ -238,9 +238,7 @@ void mt7615_tx_complete_skb(struct mt76_dev *mdev, enum mt76_txq_id qid, txp = (struct mt7615_txp *)(txwi_ptr + MT_TXD_SIZE); dev = container_of(mdev, struct mt7615_dev, mt76); - spin_lock_bh(&dev->token_lock); - t = idr_remove(&dev->token, le16_to_cpu(txp->token)); - spin_unlock_bh(&dev->token_lock); + t = xa_erase_bh(&dev->token, le16_to_cpu(txp->token)); e->skb = t ? t->skb : NULL; } @@ -457,7 +455,7 @@ int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb); struct ieee80211_key_conf *key = info->control.hw_key; struct ieee80211_vif *vif = info->control.vif; - int i, pid, id, nbuf = tx_info->nbuf - 1; + int err, i, pid, id, nbuf = tx_info->nbuf - 1; u8 *txwi = (u8 *)txwi_ptr; struct mt76_txwi_cache *t; struct mt7615_txp *txp; @@ -506,13 +504,15 @@ int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size); t->skb = tx_info->skb; - spin_lock_bh(&dev->token_lock); - id = idr_alloc(&dev->token, t, 0, MT7615_TOKEN_SIZE, GFP_ATOMIC); - spin_unlock_bh(&dev->token_lock); - if (id < 0) - return id; + xa_lock_bh(&dev->token); + err = __xa_alloc(&dev->token, &id, t, + XA_LIMIT(0, MT7615_TOKEN_SIZE - 1), GFP_ATOMIC); + if (!err) + txp->token = cpu_to_le16(id); + xa_unlock_bh(&dev->token); + if (err < 0) + return err; - txp->token = cpu_to_le16(id); txp->rept_wds_wcid = 0xff; tx_info->skb = DMA_DUMMY_DATA; @@ -717,9 +717,7 @@ void mt7615_mac_tx_free(struct mt7615_dev *dev, struct sk_buff *skb) count = FIELD_GET(MT_TX_FREE_MSDU_ID_CNT, le16_to_cpu(free->ctrl)); for (i = 0; i < count; i++) { - spin_lock_bh(&dev->token_lock); - txwi = idr_remove(&dev->token, le16_to_cpu(free->token[i])); - spin_unlock_bh(&dev->token_lock); + txwi = xa_erase_bh(&dev->token, le16_to_cpu(free->token[i])); if (!txwi) continue; diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h index f02ffcffe637..5a3ecc6faede 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h @@ -6,6 +6,7 @@ #include <linux/interrupt.h> #include <linux/ktime.h> +#include <linux/xarray.h> #include "../mt76.h" #include "regs.h" @@ -68,8 +69,7 @@ struct mt7615_dev { u32 vif_mask; u32 omac_mask; - spinlock_t token_lock; - struct idr token; + struct xarray token; }; enum { -- 2.23.0.rc1