net: Add queue and napi association
authorAmritha Nambiar <amritha.nambiar@intel.com>
Fri, 1 Dec 2023 23:28:34 +0000 (15:28 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 5 Dec 2023 02:04:05 +0000 (18:04 -0800)
Add the napi pointer in netdev queue for tracking the napi
instance for each queue. This achieves the queue<->napi mapping.

Signed-off-by: Amritha Nambiar <amritha.nambiar@intel.com>
Reviewed-by: Sridhar Samudrala <sridhar.samudrala@intel.com>
Link: https://lore.kernel.org/r/170147331483.5260.15723438819994285695.stgit@anambiarhost.jf.intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/netdevice.h
include/net/netdev_rx_queue.h
net/core/dev.c

index c2d74bc..5ddff11 100644 (file)
@@ -665,6 +665,10 @@ struct netdev_queue {
 #ifdef CONFIG_XDP_SOCKETS
        struct xsk_buff_pool    *pool;
 #endif
+       /* NAPI instance for the queue
+        * Readers and writers must hold RTNL
+        */
+       struct napi_struct      *napi;
 /*
  * write-mostly part
  */
@@ -2657,6 +2661,10 @@ static inline void *netdev_priv(const struct net_device *dev)
  */
 #define SET_NETDEV_DEVTYPE(net, devtype)       ((net)->dev.type = (devtype))
 
+void netif_queue_set_napi(struct net_device *dev, unsigned int queue_index,
+                         enum netdev_queue_type type,
+                         struct napi_struct *napi);
+
 /* Default NAPI poll() weight
  * Device drivers are strongly advised to not use bigger value
  */
index cdcafb3..aa1716f 100644 (file)
@@ -21,6 +21,10 @@ struct netdev_rx_queue {
 #ifdef CONFIG_XDP_SOCKETS
        struct xsk_buff_pool            *pool;
 #endif
+       /* NAPI instance for the queue
+        * Readers and writers must hold RTNL
+        */
+       struct napi_struct              *napi;
 } ____cacheline_aligned_in_smp;
 
 /*
index 3950ced..0a2eecb 100644 (file)
@@ -6400,6 +6400,43 @@ int dev_set_threaded(struct net_device *dev, bool threaded)
 }
 EXPORT_SYMBOL(dev_set_threaded);
 
+/**
+ * netif_queue_set_napi - Associate queue with the napi
+ * @dev: device to which NAPI and queue belong
+ * @queue_index: Index of queue
+ * @type: queue type as RX or TX
+ * @napi: NAPI context, pass NULL to clear previously set NAPI
+ *
+ * Set queue with its corresponding napi context. This should be done after
+ * registering the NAPI handler for the queue-vector and the queues have been
+ * mapped to the corresponding interrupt vector.
+ */
+void netif_queue_set_napi(struct net_device *dev, unsigned int queue_index,
+                         enum netdev_queue_type type, struct napi_struct *napi)
+{
+       struct netdev_rx_queue *rxq;
+       struct netdev_queue *txq;
+
+       if (WARN_ON_ONCE(napi && !napi->dev))
+               return;
+       if (dev->reg_state >= NETREG_REGISTERED)
+               ASSERT_RTNL();
+
+       switch (type) {
+       case NETDEV_QUEUE_TYPE_RX:
+               rxq = __netif_get_rx_queue(dev, queue_index);
+               rxq->napi = napi;
+               return;
+       case NETDEV_QUEUE_TYPE_TX:
+               txq = netdev_get_tx_queue(dev, queue_index);
+               txq->napi = napi;
+               return;
+       default:
+               return;
+       }
+}
+EXPORT_SYMBOL(netif_queue_set_napi);
+
 void netif_napi_add_weight(struct net_device *dev, struct napi_struct *napi,
                           int (*poll)(struct napi_struct *, int), int weight)
 {