* [PATCH net-next v3 0/6] net: napi: add CPU affinity to napi->config
@ 2025-01-04 0:43 Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 1/6] net: move ARFS rmap management to core Ahmed Zaki
` (5 more replies)
0 siblings, 6 replies; 12+ messages in thread
From: Ahmed Zaki @ 2025-01-04 0:43 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni, davem,
michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, Ahmed Zaki
Move the IRQ affinity management to the napi struct. Since there can only
be one IRQ affinity notifier, the ARFS rmap management is moved to CORE
(patches 1 and 2), then the new notifier is extended to save the user-set
IRQ affinity mask in napi_config.
Tested on bnxt, ice and idpf.
v3:
- Assign one cpu per mask starting from local NUMA node (Shay Drori).
- Keep the new ARFS and Affinity flags per nedev (Jakub).
v2:
- https://lore.kernel.org/netdev/202412190454.nwvp3hU2-lkp@intel.com/T/
- Also move the ARFS IRQ affinity management from drivers to core. Via
netif_napi_set_irq(), drivers can ask the core to add the IRQ to the
ARFS rmap (already allocated by the driver).
RFC -> v1:
- https://lore.kernel.org/netdev/20241210002626.366878-1-ahmed.zaki@intel.com/
- move static inline affinity functions to net/dev/core.c
- add the new napi->irq_flags (patch 1)
- add code changes to bnxt, mlx4 and ice.
Ahmed Zaki (6):
net: move ARFS rmap management to core
net: napi: add internal ARFS rmap management
net: napi: add CPU affinity to napi_config
bnxt: use napi's irq affinity
ice: use napi's irq affinity
idpf: use napi's irq affinity
drivers/net/ethernet/amazon/ena/ena_netdev.c | 38 +----
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 53 ++-----
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 -
drivers/net/ethernet/intel/ice/ice.h | 3 -
drivers/net/ethernet/intel/ice/ice_arfs.c | 17 +--
drivers/net/ethernet/intel/ice/ice_base.c | 7 +-
drivers/net/ethernet/intel/ice/ice_lib.c | 6 -
drivers/net/ethernet/intel/ice/ice_main.c | 47 +------
drivers/net/ethernet/intel/idpf/idpf_lib.c | 1 +
drivers/net/ethernet/intel/idpf/idpf_txrx.c | 22 +--
drivers/net/ethernet/intel/idpf/idpf_txrx.h | 6 +-
include/linux/cpu_rmap.h | 1 +
include/linux/netdevice.h | 23 ++-
lib/cpu_rmap.c | 2 +-
net/core/dev.c | 139 ++++++++++++++++++-
15 files changed, 186 insertions(+), 181 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH net-next v3 1/6] net: move ARFS rmap management to core
2025-01-04 0:43 [PATCH net-next v3 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
@ 2025-01-04 0:43 ` Ahmed Zaki
2025-01-04 5:13 ` kernel test robot
` (2 more replies)
2025-01-04 0:43 ` [PATCH net-next v3 2/6] net: napi: add internal ARFS rmap management Ahmed Zaki
` (4 subsequent siblings)
5 siblings, 3 replies; 12+ messages in thread
From: Ahmed Zaki @ 2025-01-04 0:43 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni, davem,
michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, Ahmed Zaki
Add a new netdev flag "rx_cpu_rmap_auto". Drivers supporting ARFS should
set the flag via netif_enable_cpu_rmap() and core will allocate and manage
the ARFS rmap. Freeing the rmap is also done by core when the netdev is
freed.
Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
---
drivers/net/ethernet/amazon/ena/ena_netdev.c | 38 ++---------------
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 27 ++----------
drivers/net/ethernet/intel/ice/ice_arfs.c | 17 +-------
include/linux/netdevice.h | 12 ++++--
net/core/dev.c | 44 ++++++++++++++++++++
5 files changed, 60 insertions(+), 78 deletions(-)
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index c1295dfad0d0..ef1e1b37a60a 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -5,9 +5,6 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-#ifdef CONFIG_RFS_ACCEL
-#include <linux/cpu_rmap.h>
-#endif /* CONFIG_RFS_ACCEL */
#include <linux/ethtool.h>
#include <linux/kernel.h>
#include <linux/module.h>
@@ -165,25 +162,10 @@ int ena_xmit_common(struct ena_adapter *adapter,
static int ena_init_rx_cpu_rmap(struct ena_adapter *adapter)
{
#ifdef CONFIG_RFS_ACCEL
- u32 i;
- int rc;
-
- adapter->netdev->rx_cpu_rmap = alloc_irq_cpu_rmap(adapter->num_io_queues);
- if (!adapter->netdev->rx_cpu_rmap)
- return -ENOMEM;
- for (i = 0; i < adapter->num_io_queues; i++) {
- int irq_idx = ENA_IO_IRQ_IDX(i);
-
- rc = irq_cpu_rmap_add(adapter->netdev->rx_cpu_rmap,
- pci_irq_vector(adapter->pdev, irq_idx));
- if (rc) {
- free_irq_cpu_rmap(adapter->netdev->rx_cpu_rmap);
- adapter->netdev->rx_cpu_rmap = NULL;
- return rc;
- }
- }
-#endif /* CONFIG_RFS_ACCEL */
+ return netif_enable_cpu_rmap(adapter->netdev);
+#else
return 0;
+#endif /* CONFIG_RFS_ACCEL */
}
static void ena_init_io_rings_common(struct ena_adapter *adapter,
@@ -1742,13 +1724,6 @@ static void ena_free_io_irq(struct ena_adapter *adapter)
struct ena_irq *irq;
int i;
-#ifdef CONFIG_RFS_ACCEL
- if (adapter->msix_vecs >= 1) {
- free_irq_cpu_rmap(adapter->netdev->rx_cpu_rmap);
- adapter->netdev->rx_cpu_rmap = NULL;
- }
-#endif /* CONFIG_RFS_ACCEL */
-
for (i = ENA_IO_IRQ_FIRST_IDX; i < ENA_MAX_MSIX_VEC(io_queue_count); i++) {
irq = &adapter->irq_tbl[i];
irq_set_affinity_hint(irq->vector, NULL);
@@ -4131,13 +4106,6 @@ static void __ena_shutoff(struct pci_dev *pdev, bool shutdown)
ena_dev = adapter->ena_dev;
netdev = adapter->netdev;
-#ifdef CONFIG_RFS_ACCEL
- if ((adapter->msix_vecs >= 1) && (netdev->rx_cpu_rmap)) {
- free_irq_cpu_rmap(netdev->rx_cpu_rmap);
- netdev->rx_cpu_rmap = NULL;
- }
-
-#endif /* CONFIG_RFS_ACCEL */
/* Make sure timer and reset routine won't be called after
* freeing device resources.
*/
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 46edea75e062..cc3ca3440b0a 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -49,7 +49,6 @@
#include <linux/cache.h>
#include <linux/log2.h>
#include <linux/bitmap.h>
-#include <linux/cpu_rmap.h>
#include <linux/cpumask.h>
#include <net/pkt_cls.h>
#include <net/page_pool/helpers.h>
@@ -10833,7 +10832,7 @@ static int bnxt_set_real_num_queues(struct bnxt *bp)
#ifdef CONFIG_RFS_ACCEL
if (bp->flags & BNXT_FLAG_RFS)
- dev->rx_cpu_rmap = alloc_irq_cpu_rmap(bp->rx_nr_rings);
+ return netif_enable_cpu_rmap(dev, bp->rx_nr_rings);
#endif
return rc;
@@ -11187,10 +11186,6 @@ static void bnxt_free_irq(struct bnxt *bp)
struct bnxt_irq *irq;
int i;
-#ifdef CONFIG_RFS_ACCEL
- free_irq_cpu_rmap(bp->dev->rx_cpu_rmap);
- bp->dev->rx_cpu_rmap = NULL;
-#endif
if (!bp->irq_tbl || !bp->bnapi)
return;
@@ -11213,11 +11208,8 @@ static void bnxt_free_irq(struct bnxt *bp)
static int bnxt_request_irq(struct bnxt *bp)
{
- int i, j, rc = 0;
+ int i, rc = 0;
unsigned long flags = 0;
-#ifdef CONFIG_RFS_ACCEL
- struct cpu_rmap *rmap;
-#endif
rc = bnxt_setup_int_mode(bp);
if (rc) {
@@ -11225,22 +11217,11 @@ static int bnxt_request_irq(struct bnxt *bp)
rc);
return rc;
}
-#ifdef CONFIG_RFS_ACCEL
- rmap = bp->dev->rx_cpu_rmap;
-#endif
- for (i = 0, j = 0; i < bp->cp_nr_rings; i++) {
+
+ for (i = 0; i < bp->cp_nr_rings; i++) {
int map_idx = bnxt_cp_num_to_irq_num(bp, i);
struct bnxt_irq *irq = &bp->irq_tbl[map_idx];
-#ifdef CONFIG_RFS_ACCEL
- if (rmap && bp->bnapi[i]->rx_ring) {
- rc = irq_cpu_rmap_add(rmap, irq->vector);
- if (rc)
- netdev_warn(bp->dev, "failed adding irq rmap for ring %d\n",
- j);
- j++;
- }
-#endif
rc = request_irq(irq->vector, irq->handler, flags, irq->name,
bp->bnapi[i]);
if (rc)
diff --git a/drivers/net/ethernet/intel/ice/ice_arfs.c b/drivers/net/ethernet/intel/ice/ice_arfs.c
index 7cee365cc7d1..3b1b892e6958 100644
--- a/drivers/net/ethernet/intel/ice/ice_arfs.c
+++ b/drivers/net/ethernet/intel/ice/ice_arfs.c
@@ -584,9 +584,6 @@ void ice_free_cpu_rx_rmap(struct ice_vsi *vsi)
netdev = vsi->netdev;
if (!netdev || !netdev->rx_cpu_rmap)
return;
-
- free_irq_cpu_rmap(netdev->rx_cpu_rmap);
- netdev->rx_cpu_rmap = NULL;
}
/**
@@ -597,7 +594,6 @@ int ice_set_cpu_rx_rmap(struct ice_vsi *vsi)
{
struct net_device *netdev;
struct ice_pf *pf;
- int i;
if (!vsi || vsi->type != ICE_VSI_PF)
return 0;
@@ -610,18 +606,7 @@ int ice_set_cpu_rx_rmap(struct ice_vsi *vsi)
netdev_dbg(netdev, "Setup CPU RMAP: vsi type 0x%x, ifname %s, q_vectors %d\n",
vsi->type, netdev->name, vsi->num_q_vectors);
- netdev->rx_cpu_rmap = alloc_irq_cpu_rmap(vsi->num_q_vectors);
- if (unlikely(!netdev->rx_cpu_rmap))
- return -EINVAL;
-
- ice_for_each_q_vector(vsi, i)
- if (irq_cpu_rmap_add(netdev->rx_cpu_rmap,
- vsi->q_vectors[i]->irq.virq)) {
- ice_free_cpu_rx_rmap(vsi);
- return -EINVAL;
- }
-
- return 0;
+ return netif_enable_cpu_rmap(netdev, vsi->num_q_vectors);
}
/**
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 2593019ad5b1..7adea7088e08 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2398,6 +2398,9 @@ struct net_device {
struct lock_class_key *qdisc_tx_busylock;
bool proto_down;
bool threaded;
+#ifdef CONFIG_RFS_ACCEL
+ bool rx_cpu_rmap_auto;
+#endif
/* priv_flags_slow, ungrouped to save space */
unsigned long see_all_hwtstamp_requests:1;
@@ -2671,10 +2674,7 @@ void netif_queue_set_napi(struct net_device *dev, unsigned int queue_index,
enum netdev_queue_type type,
struct napi_struct *napi);
-static inline void netif_napi_set_irq(struct napi_struct *napi, int irq)
-{
- napi->irq = irq;
-}
+void netif_napi_set_irq(struct napi_struct *napi, int irq);
/* Default NAPI poll() weight
* Device drivers are strongly advised to not use bigger value
@@ -2765,6 +2765,10 @@ static inline void netif_napi_del(struct napi_struct *napi)
synchronize_net();
}
+#ifdef CONFIG_RFS_ACCEL
+int netif_enable_cpu_rmap(struct net_device *dev, unsigned int num_irqs);
+
+#endif
struct packet_type {
__be16 type; /* This is really htons(ether_type). */
bool ignore_outgoing;
diff --git a/net/core/dev.c b/net/core/dev.c
index c7f3dea3e0eb..4ebe8865833e 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6705,6 +6705,46 @@ void netif_queue_set_napi(struct net_device *dev, unsigned int queue_index,
}
EXPORT_SYMBOL(netif_queue_set_napi);
+#ifdef CONFIG_RFS_ACCEL
+static void netif_disable_cpu_rmap(struct net_device *dev)
+{
+ free_irq_cpu_rmap(dev->rx_cpu_rmap);
+ dev->rx_cpu_rmap = NULL;
+ dev->rx_cpu_rmap_auto = false;
+}
+
+int netif_enable_cpu_rmap(struct net_device *dev, unsigned int num_irqs)
+{
+ dev->rx_cpu_rmap = alloc_irq_cpu_rmap(num_irqs);
+ if (!dev->rx_cpu_rmap)
+ return -ENOMEM;
+
+ dev->rx_cpu_rmap_auto = true;
+ return 0;
+}
+EXPORT_SYMBOL(netif_enable_cpu_rmap);
+#endif
+
+void netif_napi_set_irq(struct napi_struct *napi, int irq)
+{
+#ifdef CONFIG_RFS_ACCEL
+ int rc;
+#endif
+ napi->irq = irq;
+
+#ifdef CONFIG_RFS_ACCEL
+ if (napi->dev->rx_cpu_rmap && napi->dev->rx_cpu_rmap_auto) {
+ rc = irq_cpu_rmap_add(napi->dev->rx_cpu_rmap, irq);
+ if (rc) {
+ netdev_warn(napi->dev, "Unable to update ARFS map (%d)\n",
+ rc);
+ netif_disable_cpu_rmap(napi->dev);
+ }
+ }
+#endif
+}
+EXPORT_SYMBOL(netif_napi_set_irq);
+
static void napi_restore_config(struct napi_struct *n)
{
n->defer_hard_irqs = n->config->defer_hard_irqs;
@@ -11347,6 +11387,10 @@ void free_netdev(struct net_device *dev)
/* Flush device addresses */
dev_addr_flush(dev);
+#ifdef CONFIG_RFS_ACCEL
+ if (dev->rx_cpu_rmap && dev->rx_cpu_rmap_auto)
+ netif_disable_cpu_rmap(dev);
+#endif
list_for_each_entry_safe(p, n, &dev->napi_list, dev_list)
netif_napi_del(p);
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next v3 2/6] net: napi: add internal ARFS rmap management
2025-01-04 0:43 [PATCH net-next v3 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 1/6] net: move ARFS rmap management to core Ahmed Zaki
@ 2025-01-04 0:43 ` Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 3/6] net: napi: add CPU affinity to napi_config Ahmed Zaki
` (3 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Ahmed Zaki @ 2025-01-04 0:43 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni, davem,
michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, Ahmed Zaki
For drivers using the netif_enable_cpu_rmap(), move the IRQ rmap notifier
inside the napi_struct.
Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
---
include/linux/cpu_rmap.h | 1 +
include/linux/netdevice.h | 4 +++
lib/cpu_rmap.c | 2 +-
net/core/dev.c | 67 +++++++++++++++++++++++++++++++++++++--
4 files changed, 71 insertions(+), 3 deletions(-)
diff --git a/include/linux/cpu_rmap.h b/include/linux/cpu_rmap.h
index 20b5729903d7..2fd7ba75362a 100644
--- a/include/linux/cpu_rmap.h
+++ b/include/linux/cpu_rmap.h
@@ -32,6 +32,7 @@ struct cpu_rmap {
#define CPU_RMAP_DIST_INF 0xffff
extern struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags);
+extern void cpu_rmap_get(struct cpu_rmap *rmap);
extern int cpu_rmap_put(struct cpu_rmap *rmap);
extern int cpu_rmap_add(struct cpu_rmap *rmap, void *obj);
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 7adea7088e08..b0769f0a3795 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -392,6 +392,10 @@ struct napi_struct {
struct list_head dev_list;
struct hlist_node napi_hash_node;
int irq;
+#ifdef CONFIG_RFS_ACCEL
+ struct irq_affinity_notify notify;
+ int napi_rmap_idx;
+#endif
int index;
struct napi_config *config;
};
diff --git a/lib/cpu_rmap.c b/lib/cpu_rmap.c
index 4c348670da31..f03d9be3f06b 100644
--- a/lib/cpu_rmap.c
+++ b/lib/cpu_rmap.c
@@ -73,7 +73,7 @@ static void cpu_rmap_release(struct kref *ref)
* cpu_rmap_get - internal helper to get new ref on a cpu_rmap
* @rmap: reverse-map allocated with alloc_cpu_rmap()
*/
-static inline void cpu_rmap_get(struct cpu_rmap *rmap)
+void cpu_rmap_get(struct cpu_rmap *rmap)
{
kref_get(&rmap->refcount);
}
diff --git a/net/core/dev.c b/net/core/dev.c
index 4ebe8865833e..92b7a9d4c9b6 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6708,7 +6708,20 @@ EXPORT_SYMBOL(netif_queue_set_napi);
#ifdef CONFIG_RFS_ACCEL
static void netif_disable_cpu_rmap(struct net_device *dev)
{
- free_irq_cpu_rmap(dev->rx_cpu_rmap);
+ struct cpu_rmap *rmap = dev->rx_cpu_rmap;
+ struct napi_struct *napi;
+ u16 index;
+
+ if (!rmap || !dev->rx_cpu_rmap_auto)
+ return;
+
+ for (index = 0; index < rmap->size; index++) {
+ napi = rmap->obj[index];
+ if (napi && napi->irq > 0)
+ irq_set_affinity_notifier(napi->irq, NULL);
+ }
+
+ cpu_rmap_put(rmap);
dev->rx_cpu_rmap = NULL;
dev->rx_cpu_rmap_auto = false;
}
@@ -6723,6 +6736,56 @@ int netif_enable_cpu_rmap(struct net_device *dev, unsigned int num_irqs)
return 0;
}
EXPORT_SYMBOL(netif_enable_cpu_rmap);
+
+static void
+netif_irq_cpu_rmap_notify(struct irq_affinity_notify *notify,
+ const cpumask_t *mask)
+{
+ struct napi_struct *napi =
+ container_of(notify, struct napi_struct, notify);
+ struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
+ int err;
+
+ if (rmap && napi->dev->rx_cpu_rmap_auto) {
+ err = cpu_rmap_update(rmap, napi->napi_rmap_idx, mask);
+ if (err)
+ pr_warn("%s: RMAP update failed (%d)\n",
+ __func__, err);
+ }
+}
+
+static void
+netif_napi_affinity_release(struct kref __always_unused *ref)
+{
+}
+
+static int napi_irq_cpu_rmap_add(struct napi_struct *napi, int irq)
+{
+ struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
+ int rc;
+
+ if (!napi || !rmap)
+ return -EINVAL;
+ napi->notify.notify = netif_irq_cpu_rmap_notify;
+ napi->notify.release = netif_napi_affinity_release;
+ cpu_rmap_get(rmap);
+ rc = cpu_rmap_add(rmap, napi);
+ if (rc < 0)
+ goto err_add;
+
+ napi->napi_rmap_idx = rc;
+ rc = irq_set_affinity_notifier(irq, &napi->notify);
+ if (rc)
+ goto err_set;
+
+ return 0;
+
+err_set:
+ rmap->obj[napi->napi_rmap_idx] = NULL;
+err_add:
+ cpu_rmap_put(rmap);
+ return rc;
+}
#endif
void netif_napi_set_irq(struct napi_struct *napi, int irq)
@@ -6734,7 +6797,7 @@ void netif_napi_set_irq(struct napi_struct *napi, int irq)
#ifdef CONFIG_RFS_ACCEL
if (napi->dev->rx_cpu_rmap && napi->dev->rx_cpu_rmap_auto) {
- rc = irq_cpu_rmap_add(napi->dev->rx_cpu_rmap, irq);
+ rc = napi_irq_cpu_rmap_add(napi, irq);
if (rc) {
netdev_warn(napi->dev, "Unable to update ARFS map (%d)\n",
rc);
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next v3 3/6] net: napi: add CPU affinity to napi_config
2025-01-04 0:43 [PATCH net-next v3 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 1/6] net: move ARFS rmap management to core Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 2/6] net: napi: add internal ARFS rmap management Ahmed Zaki
@ 2025-01-04 0:43 ` Ahmed Zaki
2025-01-06 11:42 ` [Intel-wired-lan] " Dan Carpenter
2025-01-04 0:43 ` [PATCH net-next v3 4/6] bnxt: use napi's irq affinity Ahmed Zaki
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Ahmed Zaki @ 2025-01-04 0:43 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni, davem,
michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, Ahmed Zaki
A common task for most drivers is to remember the user-set CPU affinity
to its IRQs. On each netdev reset, the driver should re-assign the
user's settings to the IRQs.
Add CPU affinity mask to napi_config. To delegate the CPU affinity
management to the core, drivers must:
1 - set the new netdev flag "irq_affinity_auto":
netif_enable_irq_affinity(netdev)
2 - create the napi with persistent config:
netif_napi_add_config()
3 - bind an IRQ to the napi instance: netif_napi_set_irq()
the core will then make sure to use re-assign affinity to the napi's
IRQ.
The default IRQ mask is set to one cpu starting from the closest NUMA.
Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
---
include/linux/netdevice.h | 9 +++++++-
net/core/dev.c | 44 ++++++++++++++++++++++++++++++++-------
2 files changed, 45 insertions(+), 8 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index b0769f0a3795..37d3f954ccf6 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -351,6 +351,7 @@ struct napi_config {
u64 gro_flush_timeout;
u64 irq_suspend_timeout;
u32 defer_hard_irqs;
+ cpumask_t affinity_mask;
unsigned int napi_id;
};
@@ -392,8 +393,8 @@ struct napi_struct {
struct list_head dev_list;
struct hlist_node napi_hash_node;
int irq;
-#ifdef CONFIG_RFS_ACCEL
struct irq_affinity_notify notify;
+#ifdef CONFIG_RFS_ACCEL
int napi_rmap_idx;
#endif
int index;
@@ -2402,6 +2403,7 @@ struct net_device {
struct lock_class_key *qdisc_tx_busylock;
bool proto_down;
bool threaded;
+ bool irq_affinity_auto;
#ifdef CONFIG_RFS_ACCEL
bool rx_cpu_rmap_auto;
#endif
@@ -2637,6 +2639,11 @@ static inline void netdev_set_ml_priv(struct net_device *dev,
dev->ml_priv_type = type;
}
+static inline void netif_enable_irq_affinity(struct net_device *dev)
+{
+ dev->irq_affinity_auto = true;
+}
+
/*
* Net namespace inlines
*/
diff --git a/net/core/dev.c b/net/core/dev.c
index 92b7a9d4c9b6..86274d974ef4 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6736,22 +6736,30 @@ int netif_enable_cpu_rmap(struct net_device *dev, unsigned int num_irqs)
return 0;
}
EXPORT_SYMBOL(netif_enable_cpu_rmap);
+#endif
static void
-netif_irq_cpu_rmap_notify(struct irq_affinity_notify *notify,
- const cpumask_t *mask)
+netif_napi_irq_notify(struct irq_affinity_notify *notify,
+ const cpumask_t *mask)
{
struct napi_struct *napi =
container_of(notify, struct napi_struct, notify);
+#ifdef CONFIG_RFS_ACCEL
struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
int err;
+#endif
+ if (napi->config && napi->dev->irq_affinity_auto)
+ cpumask_copy(&napi->config->affinity_mask, mask);
+
+#ifdef CONFIG_RFS_ACCEL
if (rmap && napi->dev->rx_cpu_rmap_auto) {
err = cpu_rmap_update(rmap, napi->napi_rmap_idx, mask);
if (err)
pr_warn("%s: RMAP update failed (%d)\n",
__func__, err);
}
+#endif
}
static void
@@ -6759,6 +6767,7 @@ netif_napi_affinity_release(struct kref __always_unused *ref)
{
}
+#ifdef CONFIG_RFS_ACCEL
static int napi_irq_cpu_rmap_add(struct napi_struct *napi, int irq)
{
struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
@@ -6766,7 +6775,7 @@ static int napi_irq_cpu_rmap_add(struct napi_struct *napi, int irq)
if (!napi || !rmap)
return -EINVAL;
- napi->notify.notify = netif_irq_cpu_rmap_notify;
+ napi->notify.notify = netif_napi_irq_notify;
napi->notify.release = netif_napi_affinity_release;
cpu_rmap_get(rmap);
rc = cpu_rmap_add(rmap, napi);
@@ -6790,9 +6799,8 @@ static int napi_irq_cpu_rmap_add(struct napi_struct *napi, int irq)
void netif_napi_set_irq(struct napi_struct *napi, int irq)
{
-#ifdef CONFIG_RFS_ACCEL
int rc;
-#endif
+
napi->irq = irq;
#ifdef CONFIG_RFS_ACCEL
@@ -6803,8 +6811,18 @@ void netif_napi_set_irq(struct napi_struct *napi, int irq)
rc);
netif_disable_cpu_rmap(napi->dev);
}
- }
+ } else if (irq > 0 && napi->config && napi->dev->irq_affinity_auto) {
+#else
+ if (irq > 0 && napi->config && napi->dev->irq_affinity_auto) {
#endif
+ napi->notify.notify = netif_napi_irq_notify;
+ napi->notify.release = netif_napi_affinity_release;
+
+ rc = irq_set_affinity_notifier(irq, &napi->notify);
+ if (rc)
+ netdev_warn(napi->dev, "Unable to set IRQ notifier (%d)\n",
+ rc);
+ }
}
EXPORT_SYMBOL(netif_napi_set_irq);
@@ -6813,6 +6831,10 @@ static void napi_restore_config(struct napi_struct *n)
n->defer_hard_irqs = n->config->defer_hard_irqs;
n->gro_flush_timeout = n->config->gro_flush_timeout;
n->irq_suspend_timeout = n->config->irq_suspend_timeout;
+
+ if (n->irq > 0 && n->config && n->dev->irq_affinity_auto)
+ irq_set_affinity(n->irq, &n->config->affinity_mask);
+
/* a NAPI ID might be stored in the config, if so use it. if not, use
* napi_hash_add to generate one for us. It will be saved to the config
* in napi_disable.
@@ -6829,6 +6851,10 @@ static void napi_save_config(struct napi_struct *n)
n->config->gro_flush_timeout = n->gro_flush_timeout;
n->config->irq_suspend_timeout = n->irq_suspend_timeout;
n->config->napi_id = n->napi_id;
+
+ if (n->irq > 0 && n->config && n->dev->irq_affinity_auto)
+ irq_set_affinity_notifier(n->irq, NULL);
+
napi_hash_del(n);
}
@@ -11293,7 +11319,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
{
struct net_device *dev;
size_t napi_config_sz;
- unsigned int maxqs;
+ unsigned int maxqs, i, numa;
BUG_ON(strlen(name) >= sizeof(dev->name));
@@ -11389,6 +11415,10 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
dev->napi_config = kvzalloc(napi_config_sz, GFP_KERNEL_ACCOUNT);
if (!dev->napi_config)
goto free_all;
+ numa = dev_to_node(&dev->dev);
+ for (i = 0; i < maxqs; i++)
+ cpumask_set_cpu(cpumask_local_spread(i, numa),
+ &dev->napi_config[i].affinity_mask);
strscpy(dev->name, name);
dev->name_assign_type = name_assign_type;
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next v3 4/6] bnxt: use napi's irq affinity
2025-01-04 0:43 [PATCH net-next v3 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
` (2 preceding siblings ...)
2025-01-04 0:43 ` [PATCH net-next v3 3/6] net: napi: add CPU affinity to napi_config Ahmed Zaki
@ 2025-01-04 0:43 ` Ahmed Zaki
2025-01-05 6:42 ` Kalesh Anakkur Purayil
2025-01-04 0:43 ` [PATCH net-next v3 5/6] ice: " Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 6/6] idpf: " Ahmed Zaki
5 siblings, 1 reply; 12+ messages in thread
From: Ahmed Zaki @ 2025-01-04 0:43 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni, davem,
michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, Ahmed Zaki
Delete the driver CPU affinity info and use the core's napi config
instead.
Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 26 ++++-------------------
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 --
2 files changed, 4 insertions(+), 24 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index cc3ca3440b0a..fcf230fde1ec 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -11193,14 +11193,8 @@ static void bnxt_free_irq(struct bnxt *bp)
int map_idx = bnxt_cp_num_to_irq_num(bp, i);
irq = &bp->irq_tbl[map_idx];
- if (irq->requested) {
- if (irq->have_cpumask) {
- irq_update_affinity_hint(irq->vector, NULL);
- free_cpumask_var(irq->cpu_mask);
- irq->have_cpumask = 0;
- }
+ if (irq->requested)
free_irq(irq->vector, bp->bnapi[i]);
- }
irq->requested = 0;
}
@@ -11229,21 +11223,6 @@ static int bnxt_request_irq(struct bnxt *bp)
netif_napi_set_irq(&bp->bnapi[i]->napi, irq->vector);
irq->requested = 1;
-
- if (zalloc_cpumask_var(&irq->cpu_mask, GFP_KERNEL)) {
- int numa_node = dev_to_node(&bp->pdev->dev);
-
- irq->have_cpumask = 1;
- cpumask_set_cpu(cpumask_local_spread(i, numa_node),
- irq->cpu_mask);
- rc = irq_update_affinity_hint(irq->vector, irq->cpu_mask);
- if (rc) {
- netdev_warn(bp->dev,
- "Update affinity hint failed, IRQ = %d\n",
- irq->vector);
- break;
- }
- }
}
return rc;
}
@@ -13292,6 +13271,7 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features)
bp->flags = old_flags;
}
}
+
return rc;
}
@@ -16172,6 +16152,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
NETDEV_XDP_ACT_RX_SG;
+ netif_enable_irq_affinity(dev);
+
#ifdef CONFIG_BNXT_SRIOV
init_waitqueue_head(&bp->sriov_cfg_wait);
#endif
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 094c9e95b463..7be2f90d0c05 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -1228,9 +1228,7 @@ struct bnxt_irq {
irq_handler_t handler;
unsigned int vector;
u8 requested:1;
- u8 have_cpumask:1;
char name[IFNAMSIZ + BNXT_IRQ_NAME_EXTRA];
- cpumask_var_t cpu_mask;
};
#define HWRM_RING_ALLOC_TX 0x1
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next v3 5/6] ice: use napi's irq affinity
2025-01-04 0:43 [PATCH net-next v3 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
` (3 preceding siblings ...)
2025-01-04 0:43 ` [PATCH net-next v3 4/6] bnxt: use napi's irq affinity Ahmed Zaki
@ 2025-01-04 0:43 ` Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 6/6] idpf: " Ahmed Zaki
5 siblings, 0 replies; 12+ messages in thread
From: Ahmed Zaki @ 2025-01-04 0:43 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni, davem,
michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, Ahmed Zaki
Delete the driver CPU affinity info and use the core's napi config
instead.
Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
---
drivers/net/ethernet/intel/ice/ice.h | 3 --
drivers/net/ethernet/intel/ice/ice_base.c | 7 +---
drivers/net/ethernet/intel/ice/ice_lib.c | 6 ---
drivers/net/ethernet/intel/ice/ice_main.c | 47 ++---------------------
4 files changed, 5 insertions(+), 58 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
index 71e05d30f0fd..a6e6c9e1edc1 100644
--- a/drivers/net/ethernet/intel/ice/ice.h
+++ b/drivers/net/ethernet/intel/ice/ice.h
@@ -478,9 +478,6 @@ struct ice_q_vector {
struct ice_ring_container rx;
struct ice_ring_container tx;
- cpumask_t affinity_mask;
- struct irq_affinity_notify affinity_notify;
-
struct ice_channel *ch;
char name[ICE_INT_NAME_STR_LEN];
diff --git a/drivers/net/ethernet/intel/ice/ice_base.c b/drivers/net/ethernet/intel/ice/ice_base.c
index b2af8e3586f7..86cf715de00f 100644
--- a/drivers/net/ethernet/intel/ice/ice_base.c
+++ b/drivers/net/ethernet/intel/ice/ice_base.c
@@ -147,10 +147,6 @@ static int ice_vsi_alloc_q_vector(struct ice_vsi *vsi, u16 v_idx)
q_vector->reg_idx = q_vector->irq.index;
q_vector->vf_reg_idx = q_vector->irq.index;
- /* only set affinity_mask if the CPU is online */
- if (cpu_online(v_idx))
- cpumask_set_cpu(v_idx, &q_vector->affinity_mask);
-
/* This will not be called in the driver load path because the netdev
* will not be created yet. All other cases with register the NAPI
* handler here (i.e. resume, reset/rebuild, etc.)
@@ -276,7 +272,8 @@ static void ice_cfg_xps_tx_ring(struct ice_tx_ring *ring)
if (test_and_set_bit(ICE_TX_XPS_INIT_DONE, ring->xps_state))
return;
- netif_set_xps_queue(ring->netdev, &ring->q_vector->affinity_mask,
+ netif_set_xps_queue(ring->netdev,
+ &ring->q_vector->napi.config->affinity_mask,
ring->q_index);
}
diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c
index a7d45a8ce7ac..b5b93a426933 100644
--- a/drivers/net/ethernet/intel/ice/ice_lib.c
+++ b/drivers/net/ethernet/intel/ice/ice_lib.c
@@ -2589,12 +2589,6 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)
vsi->q_vectors[i]->num_ring_rx))
continue;
- /* clear the affinity notifier in the IRQ descriptor */
- if (!IS_ENABLED(CONFIG_RFS_ACCEL))
- irq_set_affinity_notifier(irq_num, NULL);
-
- /* clear the affinity_hint in the IRQ descriptor */
- irq_update_affinity_hint(irq_num, NULL);
synchronize_irq(irq_num);
devm_free_irq(ice_pf_to_dev(pf), irq_num, vsi->q_vectors[i]);
}
diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index 1701f7143f24..8df7332fcbbb 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -2512,34 +2512,6 @@ int ice_schedule_reset(struct ice_pf *pf, enum ice_reset_req reset)
return 0;
}
-/**
- * ice_irq_affinity_notify - Callback for affinity changes
- * @notify: context as to what irq was changed
- * @mask: the new affinity mask
- *
- * This is a callback function used by the irq_set_affinity_notifier function
- * so that we may register to receive changes to the irq affinity masks.
- */
-static void
-ice_irq_affinity_notify(struct irq_affinity_notify *notify,
- const cpumask_t *mask)
-{
- struct ice_q_vector *q_vector =
- container_of(notify, struct ice_q_vector, affinity_notify);
-
- cpumask_copy(&q_vector->affinity_mask, mask);
-}
-
-/**
- * ice_irq_affinity_release - Callback for affinity notifier release
- * @ref: internal core kernel usage
- *
- * This is a callback function used by the irq_set_affinity_notifier function
- * to inform the current notification subscriber that they will no longer
- * receive notifications.
- */
-static void ice_irq_affinity_release(struct kref __always_unused *ref) {}
-
/**
* ice_vsi_ena_irq - Enable IRQ for the given VSI
* @vsi: the VSI being configured
@@ -2603,19 +2575,6 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename)
err);
goto free_q_irqs;
}
-
- /* register for affinity change notifications */
- if (!IS_ENABLED(CONFIG_RFS_ACCEL)) {
- struct irq_affinity_notify *affinity_notify;
-
- affinity_notify = &q_vector->affinity_notify;
- affinity_notify->notify = ice_irq_affinity_notify;
- affinity_notify->release = ice_irq_affinity_release;
- irq_set_affinity_notifier(irq_num, affinity_notify);
- }
-
- /* assign the mask for this irq */
- irq_update_affinity_hint(irq_num, &q_vector->affinity_mask);
}
err = ice_set_cpu_rx_rmap(vsi);
@@ -2631,9 +2590,6 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename)
free_q_irqs:
while (vector--) {
irq_num = vsi->q_vectors[vector]->irq.virq;
- if (!IS_ENABLED(CONFIG_RFS_ACCEL))
- irq_set_affinity_notifier(irq_num, NULL);
- irq_update_affinity_hint(irq_num, NULL);
devm_free_irq(dev, irq_num, &vsi->q_vectors[vector]);
}
return err;
@@ -3674,6 +3630,9 @@ void ice_set_netdev_features(struct net_device *netdev)
*/
netdev->hw_features |= NETIF_F_RXFCS;
+ /* Allow core to manage IRQs affinity */
+ netif_enable_irq_affinity(netdev);
+
netif_set_tso_max_size(netdev, ICE_MAX_TSO_SIZE);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH net-next v3 6/6] idpf: use napi's irq affinity
2025-01-04 0:43 [PATCH net-next v3 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
` (4 preceding siblings ...)
2025-01-04 0:43 ` [PATCH net-next v3 5/6] ice: " Ahmed Zaki
@ 2025-01-04 0:43 ` Ahmed Zaki
5 siblings, 0 replies; 12+ messages in thread
From: Ahmed Zaki @ 2025-01-04 0:43 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni, davem,
michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, Ahmed Zaki
Delete the driver CPU affinity info and use the core's napi config
instead.
Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
---
drivers/net/ethernet/intel/idpf/idpf_lib.c | 1 +
drivers/net/ethernet/intel/idpf/idpf_txrx.c | 22 +++++++--------------
drivers/net/ethernet/intel/idpf/idpf_txrx.h | 6 ++----
3 files changed, 10 insertions(+), 19 deletions(-)
diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c b/drivers/net/ethernet/intel/idpf/idpf_lib.c
index b4fbb99bfad2..d54be068f53f 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_lib.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c
@@ -814,6 +814,7 @@ static int idpf_cfg_netdev(struct idpf_vport *vport)
netdev->hw_features |= dflt_features | offloads;
netdev->hw_enc_features |= dflt_features | offloads;
idpf_set_ethtool_ops(netdev);
+ netif_enable_irq_affinity(netdev);
SET_NETDEV_DEV(netdev, &adapter->pdev->dev);
/* carrier off on init to avoid Tx hangs */
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
index 2fa9c36e33c9..f6b5b45a061c 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
@@ -3554,8 +3554,6 @@ void idpf_vport_intr_rel(struct idpf_vport *vport)
q_vector->tx = NULL;
kfree(q_vector->rx);
q_vector->rx = NULL;
-
- free_cpumask_var(q_vector->affinity_mask);
}
kfree(vport->q_vectors);
@@ -3582,8 +3580,6 @@ static void idpf_vport_intr_rel_irq(struct idpf_vport *vport)
vidx = vport->q_vector_idxs[vector];
irq_num = adapter->msix_entries[vidx].vector;
- /* clear the affinity_mask in the IRQ descriptor */
- irq_set_affinity_hint(irq_num, NULL);
kfree(free_irq(irq_num, q_vector));
}
}
@@ -3771,8 +3767,6 @@ static int idpf_vport_intr_req_irq(struct idpf_vport *vport)
"Request_irq failed, error: %d\n", err);
goto free_q_irqs;
}
- /* assign the mask for this irq */
- irq_set_affinity_hint(irq_num, q_vector->affinity_mask);
}
return 0;
@@ -4184,7 +4178,8 @@ static int idpf_vport_intr_init_vec_idx(struct idpf_vport *vport)
static void idpf_vport_intr_napi_add_all(struct idpf_vport *vport)
{
int (*napi_poll)(struct napi_struct *napi, int budget);
- u16 v_idx;
+ u16 v_idx, qv_idx;
+ int irq_num;
if (idpf_is_queue_model_split(vport->txq_model))
napi_poll = idpf_vport_splitq_napi_poll;
@@ -4193,12 +4188,12 @@ static void idpf_vport_intr_napi_add_all(struct idpf_vport *vport)
for (v_idx = 0; v_idx < vport->num_q_vectors; v_idx++) {
struct idpf_q_vector *q_vector = &vport->q_vectors[v_idx];
+ qv_idx = vport->q_vector_idxs[v_idx];
+ irq_num = vport->adapter->msix_entries[qv_idx].vector;
- netif_napi_add(vport->netdev, &q_vector->napi, napi_poll);
-
- /* only set affinity_mask if the CPU is online */
- if (cpu_online(v_idx))
- cpumask_set_cpu(v_idx, q_vector->affinity_mask);
+ netif_napi_add_config(vport->netdev, &q_vector->napi,
+ napi_poll, v_idx);
+ netif_napi_set_irq(&q_vector->napi, irq_num);
}
}
@@ -4242,9 +4237,6 @@ int idpf_vport_intr_alloc(struct idpf_vport *vport)
q_vector->rx_intr_mode = IDPF_ITR_DYNAMIC;
q_vector->rx_itr_idx = VIRTCHNL2_ITR_IDX_0;
- if (!zalloc_cpumask_var(&q_vector->affinity_mask, GFP_KERNEL))
- goto error;
-
q_vector->tx = kcalloc(txqs_per_vector, sizeof(*q_vector->tx),
GFP_KERNEL);
if (!q_vector->tx)
diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.h b/drivers/net/ethernet/intel/idpf/idpf_txrx.h
index 0f71a6f5557b..13251f63c7c3 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_txrx.h
+++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.h
@@ -401,7 +401,6 @@ struct idpf_intr_reg {
* @rx_intr_mode: Dynamic ITR or not
* @rx_itr_idx: RX ITR index
* @v_idx: Vector index
- * @affinity_mask: CPU affinity mask
*/
struct idpf_q_vector {
__cacheline_group_begin_aligned(read_mostly);
@@ -438,13 +437,12 @@ struct idpf_q_vector {
__cacheline_group_begin_aligned(cold);
u16 v_idx;
- cpumask_var_t affinity_mask;
__cacheline_group_end_aligned(cold);
};
libeth_cacheline_set_assert(struct idpf_q_vector, 120,
24 + sizeof(struct napi_struct) +
2 * sizeof(struct dim),
- 8 + sizeof(cpumask_var_t));
+ 8);
struct idpf_rx_queue_stats {
u64_stats_t packets;
@@ -940,7 +938,7 @@ static inline int idpf_q_vector_to_mem(const struct idpf_q_vector *q_vector)
if (!q_vector)
return NUMA_NO_NODE;
- cpu = cpumask_first(q_vector->affinity_mask);
+ cpu = cpumask_first(&q_vector->napi.config->affinity_mask);
return cpu < nr_cpu_ids ? cpu_to_mem(cpu) : NUMA_NO_NODE;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH net-next v3 1/6] net: move ARFS rmap management to core
2025-01-04 0:43 ` [PATCH net-next v3 1/6] net: move ARFS rmap management to core Ahmed Zaki
@ 2025-01-04 5:13 ` kernel test robot
2025-01-04 12:20 ` kernel test robot
2025-01-04 13:02 ` kernel test robot
2 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2025-01-04 5:13 UTC (permalink / raw)
To: Ahmed Zaki, netdev
Cc: llvm, oe-kbuild-all, intel-wired-lan, andrew+netdev, edumazet,
kuba, pabeni, davem, michael.chan, tariqt, anthony.l.nguyen,
przemyslaw.kitszel, jdamato, shayd, akpm, Ahmed Zaki
Hi Ahmed,
kernel test robot noticed the following build errors:
[auto build test ERROR on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Ahmed-Zaki/net-move-ARFS-rmap-management-to-core/20250104-084501
base: net-next/main
patch link: https://lore.kernel.org/r/20250104004314.208259-2-ahmed.zaki%40intel.com
patch subject: [PATCH net-next v3 1/6] net: move ARFS rmap management to core
config: arm64-randconfig-002-20250104 (https://download.01.org/0day-ci/archive/20250104/202501041245.SDb1oN01-lkp@intel.com/config)
compiler: clang version 16.0.6 (https://github.com/llvm/llvm-project 7cbf1a2591520c2491aa35339f227775f4d3adf6)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250104/202501041245.SDb1oN01-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501041245.SDb1oN01-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/net/ethernet/amazon/ena/ena_netdev.c:165:46: error: too few arguments to function call, expected 2, have 1
return netif_enable_cpu_rmap(adapter->netdev);
~~~~~~~~~~~~~~~~~~~~~ ^
include/linux/netdevice.h:2769:5: note: 'netif_enable_cpu_rmap' declared here
int netif_enable_cpu_rmap(struct net_device *dev, unsigned int num_irqs);
^
1 error generated.
vim +165 drivers/net/ethernet/amazon/ena/ena_netdev.c
161
162 static int ena_init_rx_cpu_rmap(struct ena_adapter *adapter)
163 {
164 #ifdef CONFIG_RFS_ACCEL
> 165 return netif_enable_cpu_rmap(adapter->netdev);
166 #else
167 return 0;
168 #endif /* CONFIG_RFS_ACCEL */
169 }
170
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH net-next v3 1/6] net: move ARFS rmap management to core
2025-01-04 0:43 ` [PATCH net-next v3 1/6] net: move ARFS rmap management to core Ahmed Zaki
2025-01-04 5:13 ` kernel test robot
@ 2025-01-04 12:20 ` kernel test robot
2025-01-04 13:02 ` kernel test robot
2 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2025-01-04 12:20 UTC (permalink / raw)
To: Ahmed Zaki, netdev
Cc: oe-kbuild-all, intel-wired-lan, andrew+netdev, edumazet, kuba,
pabeni, davem, michael.chan, tariqt, anthony.l.nguyen,
przemyslaw.kitszel, jdamato, shayd, akpm, Ahmed Zaki
Hi Ahmed,
kernel test robot noticed the following build warnings:
[auto build test WARNING on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Ahmed-Zaki/net-move-ARFS-rmap-management-to-core/20250104-084501
base: net-next/main
patch link: https://lore.kernel.org/r/20250104004314.208259-2-ahmed.zaki%40intel.com
patch subject: [PATCH net-next v3 1/6] net: move ARFS rmap management to core
config: arm-allmodconfig (https://download.01.org/0day-ci/archive/20250104/202501042007.PjCFMiMs-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250104/202501042007.PjCFMiMs-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501042007.PjCFMiMs-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/net/ethernet/amazon/ena/ena_netdev.c: In function 'ena_init_rx_cpu_rmap':
drivers/net/ethernet/amazon/ena/ena_netdev.c:165:16: error: too few arguments to function 'netif_enable_cpu_rmap'
165 | return netif_enable_cpu_rmap(adapter->netdev);
| ^~~~~~~~~~~~~~~~~~~~~
In file included from include/net/inet_sock.h:19,
from include/net/ip.h:29,
from drivers/net/ethernet/amazon/ena/ena_netdev.c:16:
include/linux/netdevice.h:2769:5: note: declared here
2769 | int netif_enable_cpu_rmap(struct net_device *dev, unsigned int num_irqs);
| ^~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/amazon/ena/ena_netdev.c:169:1: warning: control reaches end of non-void function [-Wreturn-type]
169 | }
| ^
vim +169 drivers/net/ethernet/amazon/ena/ena_netdev.c
548c4940b9f1f5 Sameeh Jubran 2019-12-10 161
1738cd3ed34229 Netanel Belgazal 2016-08-10 162 static int ena_init_rx_cpu_rmap(struct ena_adapter *adapter)
1738cd3ed34229 Netanel Belgazal 2016-08-10 163 {
1738cd3ed34229 Netanel Belgazal 2016-08-10 164 #ifdef CONFIG_RFS_ACCEL
4f6e7588aa8a24 Ahmed Zaki 2025-01-03 165 return netif_enable_cpu_rmap(adapter->netdev);
4f6e7588aa8a24 Ahmed Zaki 2025-01-03 166 #else
1738cd3ed34229 Netanel Belgazal 2016-08-10 167 return 0;
4f6e7588aa8a24 Ahmed Zaki 2025-01-03 168 #endif /* CONFIG_RFS_ACCEL */
1738cd3ed34229 Netanel Belgazal 2016-08-10 @169 }
1738cd3ed34229 Netanel Belgazal 2016-08-10 170
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH net-next v3 1/6] net: move ARFS rmap management to core
2025-01-04 0:43 ` [PATCH net-next v3 1/6] net: move ARFS rmap management to core Ahmed Zaki
2025-01-04 5:13 ` kernel test robot
2025-01-04 12:20 ` kernel test robot
@ 2025-01-04 13:02 ` kernel test robot
2 siblings, 0 replies; 12+ messages in thread
From: kernel test robot @ 2025-01-04 13:02 UTC (permalink / raw)
To: Ahmed Zaki, netdev
Cc: oe-kbuild-all, intel-wired-lan, andrew+netdev, edumazet, kuba,
pabeni, davem, michael.chan, tariqt, anthony.l.nguyen,
przemyslaw.kitszel, jdamato, shayd, akpm, Ahmed Zaki
Hi Ahmed,
kernel test robot noticed the following build errors:
[auto build test ERROR on net-next/main]
url: https://github.com/intel-lab-lkp/linux/commits/Ahmed-Zaki/net-move-ARFS-rmap-management-to-core/20250104-084501
base: net-next/main
patch link: https://lore.kernel.org/r/20250104004314.208259-2-ahmed.zaki%40intel.com
patch subject: [PATCH net-next v3 1/6] net: move ARFS rmap management to core
config: arm-allyesconfig (https://download.01.org/0day-ci/archive/20250104/202501042032.NTXMscn3-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250104/202501042032.NTXMscn3-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202501042032.NTXMscn3-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/net/ethernet/amazon/ena/ena_netdev.c: In function 'ena_init_rx_cpu_rmap':
>> drivers/net/ethernet/amazon/ena/ena_netdev.c:165:16: error: too few arguments to function 'netif_enable_cpu_rmap'
165 | return netif_enable_cpu_rmap(adapter->netdev);
| ^~~~~~~~~~~~~~~~~~~~~
In file included from include/net/inet_sock.h:19,
from include/net/ip.h:29,
from drivers/net/ethernet/amazon/ena/ena_netdev.c:16:
include/linux/netdevice.h:2769:5: note: declared here
2769 | int netif_enable_cpu_rmap(struct net_device *dev, unsigned int num_irqs);
| ^~~~~~~~~~~~~~~~~~~~~
drivers/net/ethernet/amazon/ena/ena_netdev.c:169:1: warning: control reaches end of non-void function [-Wreturn-type]
169 | }
| ^
vim +/netif_enable_cpu_rmap +165 drivers/net/ethernet/amazon/ena/ena_netdev.c
161
162 static int ena_init_rx_cpu_rmap(struct ena_adapter *adapter)
163 {
164 #ifdef CONFIG_RFS_ACCEL
> 165 return netif_enable_cpu_rmap(adapter->netdev);
166 #else
167 return 0;
168 #endif /* CONFIG_RFS_ACCEL */
169 }
170
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH net-next v3 4/6] bnxt: use napi's irq affinity
2025-01-04 0:43 ` [PATCH net-next v3 4/6] bnxt: use napi's irq affinity Ahmed Zaki
@ 2025-01-05 6:42 ` Kalesh Anakkur Purayil
0 siblings, 0 replies; 12+ messages in thread
From: Kalesh Anakkur Purayil @ 2025-01-05 6:42 UTC (permalink / raw)
To: Ahmed Zaki
Cc: netdev, intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm
[-- Attachment #1: Type: text/plain, Size: 3654 bytes --]
On Sat, Jan 4, 2025 at 6:13 AM Ahmed Zaki <ahmed.zaki@intel.com> wrote:
>
> Delete the driver CPU affinity info and use the core's napi config
> instead.
>
> Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com>
> ---
> drivers/net/ethernet/broadcom/bnxt/bnxt.c | 26 ++++-------------------
> drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 --
> 2 files changed, 4 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> index cc3ca3440b0a..fcf230fde1ec 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> @@ -11193,14 +11193,8 @@ static void bnxt_free_irq(struct bnxt *bp)
> int map_idx = bnxt_cp_num_to_irq_num(bp, i);
>
> irq = &bp->irq_tbl[map_idx];
> - if (irq->requested) {
> - if (irq->have_cpumask) {
> - irq_update_affinity_hint(irq->vector, NULL);
> - free_cpumask_var(irq->cpu_mask);
> - irq->have_cpumask = 0;
> - }
> + if (irq->requested)
> free_irq(irq->vector, bp->bnapi[i]);
> - }
>
> irq->requested = 0;
> }
> @@ -11229,21 +11223,6 @@ static int bnxt_request_irq(struct bnxt *bp)
>
> netif_napi_set_irq(&bp->bnapi[i]->napi, irq->vector);
> irq->requested = 1;
> -
> - if (zalloc_cpumask_var(&irq->cpu_mask, GFP_KERNEL)) {
> - int numa_node = dev_to_node(&bp->pdev->dev);
> -
> - irq->have_cpumask = 1;
> - cpumask_set_cpu(cpumask_local_spread(i, numa_node),
> - irq->cpu_mask);
> - rc = irq_update_affinity_hint(irq->vector, irq->cpu_mask);
> - if (rc) {
> - netdev_warn(bp->dev,
> - "Update affinity hint failed, IRQ = %d\n",
> - irq->vector);
> - break;
> - }
> - }
> }
> return rc;
> }
> @@ -13292,6 +13271,7 @@ static int bnxt_set_features(struct net_device *dev, netdev_features_t features)
> bp->flags = old_flags;
> }
> }
> +
This change looks unrelated, please remove.
> return rc;
> }
>
> @@ -16172,6 +16152,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
> dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
> NETDEV_XDP_ACT_RX_SG;
>
> + netif_enable_irq_affinity(dev);
> +
> #ifdef CONFIG_BNXT_SRIOV
> init_waitqueue_head(&bp->sriov_cfg_wait);
> #endif
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> index 094c9e95b463..7be2f90d0c05 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
> @@ -1228,9 +1228,7 @@ struct bnxt_irq {
> irq_handler_t handler;
> unsigned int vector;
> u8 requested:1;
> - u8 have_cpumask:1;
> char name[IFNAMSIZ + BNXT_IRQ_NAME_EXTRA];
> - cpumask_var_t cpu_mask;
> };
>
> #define HWRM_RING_ALLOC_TX 0x1
> --
> 2.43.0
>
>
--
Regards,
Kalesh AP
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4239 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Intel-wired-lan] [PATCH net-next v3 3/6] net: napi: add CPU affinity to napi_config
2025-01-04 0:43 ` [PATCH net-next v3 3/6] net: napi: add CPU affinity to napi_config Ahmed Zaki
@ 2025-01-06 11:42 ` Dan Carpenter
0 siblings, 0 replies; 12+ messages in thread
From: Dan Carpenter @ 2025-01-06 11:42 UTC (permalink / raw)
To: oe-kbuild, Ahmed Zaki, netdev
Cc: lkp, oe-kbuild-all, intel-wired-lan, andrew+netdev, edumazet,
kuba, pabeni, davem, michael.chan, tariqt, anthony.l.nguyen,
przemyslaw.kitszel, jdamato, shayd, akpm, Ahmed Zaki
Hi Ahmed,
kernel test robot noticed the following build warnings:
url: https://github.com/intel-lab-lkp/linux/commits/Ahmed-Zaki/net-move-ARFS-rmap-management-to-core/20250104-084501
base: net-next/main
patch link: https://lore.kernel.org/r/20250104004314.208259-4-ahmed.zaki%40intel.com
patch subject: [Intel-wired-lan] [PATCH net-next v3 3/6] net: napi: add CPU affinity to napi_config
config: i386-randconfig-141-20250104 (https://download.01.org/0day-ci/archive/20250105/202501050625.nY1c97EX-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
| Closes: https://lore.kernel.org/r/202501050625.nY1c97EX-lkp@intel.com/
smatch warnings:
net/core/dev.c:6835 napi_restore_config() warn: variable dereferenced before check 'n->config' (see line 6831)
net/core/dev.c:6855 napi_save_config() warn: variable dereferenced before check 'n->config' (see line 6850)
vim +6835 net/core/dev.c
86e25f40aa1e9e5 Joe Damato 2024-10-11 6829 static void napi_restore_config(struct napi_struct *n)
86e25f40aa1e9e5 Joe Damato 2024-10-11 6830 {
86e25f40aa1e9e5 Joe Damato 2024-10-11 @6831 n->defer_hard_irqs = n->config->defer_hard_irqs;
86e25f40aa1e9e5 Joe Damato 2024-10-11 6832 n->gro_flush_timeout = n->config->gro_flush_timeout;
5dc51ec86df6e22 Martin Karsten 2024-11-09 6833 n->irq_suspend_timeout = n->config->irq_suspend_timeout;
^^^^^^^^^
These lines all dereference n->config.
d6b43b8a2e5297b Ahmed Zaki 2025-01-03 6834
d6b43b8a2e5297b Ahmed Zaki 2025-01-03 @6835 if (n->irq > 0 && n->config && n->dev->irq_affinity_auto)
^^^^^^^^^
This code assumes it can be NULL
d6b43b8a2e5297b Ahmed Zaki 2025-01-03 6836 irq_set_affinity(n->irq, &n->config->affinity_mask);
d6b43b8a2e5297b Ahmed Zaki 2025-01-03 6837
86e25f40aa1e9e5 Joe Damato 2024-10-11 6838 /* a NAPI ID might be stored in the config, if so use it. if not, use
86e25f40aa1e9e5 Joe Damato 2024-10-11 6839 * napi_hash_add to generate one for us. It will be saved to the config
86e25f40aa1e9e5 Joe Damato 2024-10-11 6840 * in napi_disable.
86e25f40aa1e9e5 Joe Damato 2024-10-11 6841 */
86e25f40aa1e9e5 Joe Damato 2024-10-11 6842 if (n->config->napi_id)
86e25f40aa1e9e5 Joe Damato 2024-10-11 6843 napi_hash_add_with_id(n, n->config->napi_id);
86e25f40aa1e9e5 Joe Damato 2024-10-11 6844 else
86e25f40aa1e9e5 Joe Damato 2024-10-11 6845 napi_hash_add(n);
86e25f40aa1e9e5 Joe Damato 2024-10-11 6846 }
86e25f40aa1e9e5 Joe Damato 2024-10-11 6847
86e25f40aa1e9e5 Joe Damato 2024-10-11 6848 static void napi_save_config(struct napi_struct *n)
86e25f40aa1e9e5 Joe Damato 2024-10-11 6849 {
86e25f40aa1e9e5 Joe Damato 2024-10-11 @6850 n->config->defer_hard_irqs = n->defer_hard_irqs;
86e25f40aa1e9e5 Joe Damato 2024-10-11 6851 n->config->gro_flush_timeout = n->gro_flush_timeout;
5dc51ec86df6e22 Martin Karsten 2024-11-09 6852 n->config->irq_suspend_timeout = n->irq_suspend_timeout;
86e25f40aa1e9e5 Joe Damato 2024-10-11 6853 n->config->napi_id = n->napi_id;
d6b43b8a2e5297b Ahmed Zaki 2025-01-03 6854
d6b43b8a2e5297b Ahmed Zaki 2025-01-03 @6855 if (n->irq > 0 && n->config && n->dev->irq_affinity_auto)
Same
d6b43b8a2e5297b Ahmed Zaki 2025-01-03 6856 irq_set_affinity_notifier(n->irq, NULL);
d6b43b8a2e5297b Ahmed Zaki 2025-01-03 6857
86e25f40aa1e9e5 Joe Damato 2024-10-11 6858 napi_hash_del(n);
86e25f40aa1e9e5 Joe Damato 2024-10-11 6859 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2025-01-06 11:42 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-04 0:43 [PATCH net-next v3 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 1/6] net: move ARFS rmap management to core Ahmed Zaki
2025-01-04 5:13 ` kernel test robot
2025-01-04 12:20 ` kernel test robot
2025-01-04 13:02 ` kernel test robot
2025-01-04 0:43 ` [PATCH net-next v3 2/6] net: napi: add internal ARFS rmap management Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 3/6] net: napi: add CPU affinity to napi_config Ahmed Zaki
2025-01-06 11:42 ` [Intel-wired-lan] " Dan Carpenter
2025-01-04 0:43 ` [PATCH net-next v3 4/6] bnxt: use napi's irq affinity Ahmed Zaki
2025-01-05 6:42 ` Kalesh Anakkur Purayil
2025-01-04 0:43 ` [PATCH net-next v3 5/6] ice: " Ahmed Zaki
2025-01-04 0:43 ` [PATCH net-next v3 6/6] idpf: " Ahmed Zaki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).