Commit aa40528a authored by Felix Fietkau's avatar Felix Fietkau

mt76: use threaded NAPI

With threaded NAPI, the rx handler function is no longer bound to the CPU that
fired the interrupt, which significantly helps to spread the workload over
multiple CPUs, especially when multiple devices are using threaded NAPI at the
same time.
Exclude the tx handler from threaded NAPI by using a separate dummy netdev.
The work is small and short-lived enough that it makes more sense to run it in
softirq instead of creating a dedicated thread
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 7139b5c0
...@@ -602,7 +602,6 @@ mt76_dma_rx_poll(struct napi_struct *napi, int budget) ...@@ -602,7 +602,6 @@ mt76_dma_rx_poll(struct napi_struct *napi, int budget)
dev = container_of(napi->dev, struct mt76_dev, napi_dev); dev = container_of(napi->dev, struct mt76_dev, napi_dev);
qid = napi - dev->napi; qid = napi - dev->napi;
local_bh_disable();
rcu_read_lock(); rcu_read_lock();
do { do {
...@@ -612,7 +611,6 @@ mt76_dma_rx_poll(struct napi_struct *napi, int budget) ...@@ -612,7 +611,6 @@ mt76_dma_rx_poll(struct napi_struct *napi, int budget)
} while (cur && done < budget); } while (cur && done < budget);
rcu_read_unlock(); rcu_read_unlock();
local_bh_enable();
if (done < budget && napi_complete(napi)) if (done < budget && napi_complete(napi))
dev->drv->rx_poll_complete(dev, qid); dev->drv->rx_poll_complete(dev, qid);
...@@ -626,6 +624,10 @@ mt76_dma_init(struct mt76_dev *dev) ...@@ -626,6 +624,10 @@ mt76_dma_init(struct mt76_dev *dev)
int i; int i;
init_dummy_netdev(&dev->napi_dev); init_dummy_netdev(&dev->napi_dev);
init_dummy_netdev(&dev->tx_napi_dev);
snprintf(dev->napi_dev.name, sizeof(dev->napi_dev.name), "%s",
wiphy_name(dev->hw->wiphy));
dev->napi_dev.threaded = 1;
mt76_for_each_q_rx(dev, i) { mt76_for_each_q_rx(dev, i) {
netif_napi_add(&dev->napi_dev, &dev->napi[i], mt76_dma_rx_poll, netif_napi_add(&dev->napi_dev, &dev->napi[i], mt76_dma_rx_poll,
......
...@@ -637,6 +637,7 @@ struct mt76_dev { ...@@ -637,6 +637,7 @@ struct mt76_dev {
struct mt76_mcu mcu; struct mt76_mcu mcu;
struct net_device napi_dev; struct net_device napi_dev;
struct net_device tx_napi_dev;
spinlock_t rx_lock; spinlock_t rx_lock;
struct napi_struct napi[__MT_RXQ_MAX]; struct napi_struct napi[__MT_RXQ_MAX];
struct sk_buff_head rx_skb[__MT_RXQ_MAX]; struct sk_buff_head rx_skb[__MT_RXQ_MAX];
......
...@@ -223,7 +223,7 @@ int mt7603_dma_init(struct mt7603_dev *dev) ...@@ -223,7 +223,7 @@ int mt7603_dma_init(struct mt7603_dev *dev)
if (ret) if (ret)
return ret; return ret;
netif_tx_napi_add(&dev->mt76.napi_dev, &dev->mt76.tx_napi, netif_tx_napi_add(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
mt7603_poll_tx, NAPI_POLL_WEIGHT); mt7603_poll_tx, NAPI_POLL_WEIGHT);
napi_enable(&dev->mt76.tx_napi); napi_enable(&dev->mt76.tx_napi);
......
...@@ -245,7 +245,7 @@ int mt7615_dma_init(struct mt7615_dev *dev) ...@@ -245,7 +245,7 @@ int mt7615_dma_init(struct mt7615_dev *dev)
if (ret < 0) if (ret < 0)
return ret; return ret;
netif_tx_napi_add(&dev->mt76.napi_dev, &dev->mt76.tx_napi, netif_tx_napi_add(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
mt7615_poll_tx, NAPI_POLL_WEIGHT); mt7615_poll_tx, NAPI_POLL_WEIGHT);
napi_enable(&dev->mt76.tx_napi); napi_enable(&dev->mt76.tx_napi);
......
...@@ -230,7 +230,7 @@ int mt76x02_dma_init(struct mt76x02_dev *dev) ...@@ -230,7 +230,7 @@ int mt76x02_dma_init(struct mt76x02_dev *dev)
if (ret) if (ret)
return ret; return ret;
netif_tx_napi_add(&dev->mt76.napi_dev, &dev->mt76.tx_napi, netif_tx_napi_add(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
mt76x02_poll_tx, NAPI_POLL_WEIGHT); mt76x02_poll_tx, NAPI_POLL_WEIGHT);
napi_enable(&dev->mt76.tx_napi); napi_enable(&dev->mt76.tx_napi);
......
...@@ -325,7 +325,7 @@ int mt7915_dma_init(struct mt7915_dev *dev) ...@@ -325,7 +325,7 @@ int mt7915_dma_init(struct mt7915_dev *dev)
if (ret < 0) if (ret < 0)
return ret; return ret;
netif_tx_napi_add(&dev->mt76.napi_dev, &dev->mt76.tx_napi, netif_tx_napi_add(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
mt7915_poll_tx, NAPI_POLL_WEIGHT); mt7915_poll_tx, NAPI_POLL_WEIGHT);
napi_enable(&dev->mt76.tx_napi); napi_enable(&dev->mt76.tx_napi);
......
...@@ -299,7 +299,7 @@ int mt7921_dma_init(struct mt7921_dev *dev) ...@@ -299,7 +299,7 @@ int mt7921_dma_init(struct mt7921_dev *dev)
if (ret < 0) if (ret < 0)
return ret; return ret;
netif_tx_napi_add(&dev->mt76.napi_dev, &dev->mt76.tx_napi, netif_tx_napi_add(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
mt7921_poll_tx, NAPI_POLL_WEIGHT); mt7921_poll_tx, NAPI_POLL_WEIGHT);
napi_enable(&dev->mt76.tx_napi); napi_enable(&dev->mt76.tx_napi);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment