* [PATCH net-next v4 1/6] net: move ARFS rmap management to core
2025-01-09 23:31 [PATCH net-next v4 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
@ 2025-01-09 23:31 ` Ahmed Zaki
2025-01-10 11:59 ` Simon Horman
2025-01-09 23:31 ` [PATCH net-next v4 2/6] net: napi: add internal ARFS rmap management Ahmed Zaki
` (4 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Ahmed Zaki @ 2025-01-09 23:31 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, horms, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, shayagr, kalesh-anakkur.purayil, 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..a3fceaa83cd5 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, adapter->num_io_queues);
+#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 1812564b5204..acf20191e114 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 26f0c2fbb8aa..8373e4cf56d8 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6730,6 +6730,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;
@@ -11406,6 +11446,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] 13+ messages in thread* Re: [PATCH net-next v4 1/6] net: move ARFS rmap management to core
2025-01-09 23:31 ` [PATCH net-next v4 1/6] net: move ARFS rmap management to core Ahmed Zaki
@ 2025-01-10 11:59 ` Simon Horman
2025-01-10 15:13 ` Ahmed Zaki
0 siblings, 1 reply; 13+ messages in thread
From: Simon Horman @ 2025-01-10 11:59 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, shayagr, kalesh-anakkur.purayil
On Thu, Jan 09, 2025 at 04:31:02PM -0700, Ahmed Zaki wrote:
> 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>
...
> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index 1812564b5204..acf20191e114 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
nit: rx_cpu_rmap_auto should also be added to the Kernel doc for
struct net_device.
>
> /* priv_flags_slow, ungrouped to save space */
> unsigned long see_all_hwtstamp_requests:1;
...
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH net-next v4 1/6] net: move ARFS rmap management to core
2025-01-10 11:59 ` Simon Horman
@ 2025-01-10 15:13 ` Ahmed Zaki
0 siblings, 0 replies; 13+ messages in thread
From: Ahmed Zaki @ 2025-01-10 15:13 UTC (permalink / raw)
To: Simon Horman
Cc: netdev, intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, shayagr, kalesh-anakkur.purayil
On 2025-01-10 4:59 a.m., Simon Horman wrote:
> On Thu, Jan 09, 2025 at 04:31:02PM -0700, Ahmed Zaki wrote:
>> 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>
>
> ...
>
>> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
>> index 1812564b5204..acf20191e114 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
>
> nit: rx_cpu_rmap_auto should also be added to the Kernel doc for
> struct net_device.
>
Hi Simon,
Sure. Will also do the same for "rq_affinity_auto" in patch 3.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH net-next v4 2/6] net: napi: add internal ARFS rmap management
2025-01-09 23:31 [PATCH net-next v4 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
2025-01-09 23:31 ` [PATCH net-next v4 1/6] net: move ARFS rmap management to core Ahmed Zaki
@ 2025-01-09 23:31 ` Ahmed Zaki
2025-01-10 11:55 ` Simon Horman
2025-01-09 23:31 ` [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config Ahmed Zaki
` (3 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Ahmed Zaki @ 2025-01-09 23:31 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, horms, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, shayagr, kalesh-anakkur.purayil, 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 | 73 +++++++++++++++++++++++++++++++++++++--
4 files changed, 77 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 acf20191e114..c789218cca5d 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 8373e4cf56d8..1d4378962857 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6733,7 +6733,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;
}
@@ -6748,6 +6761,62 @@ 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 *ref)
+{
+ struct napi_struct *napi =
+ container_of(ref, struct napi_struct, notify.kref);
+ struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
+
+ rmap->obj[napi->napi_rmap_idx] = NULL;
+ cpu_rmap_put(rmap);
+}
+
+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)
@@ -6759,7 +6828,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] 13+ messages in thread* Re: [PATCH net-next v4 2/6] net: napi: add internal ARFS rmap management
2025-01-09 23:31 ` [PATCH net-next v4 2/6] net: napi: add internal ARFS rmap management Ahmed Zaki
@ 2025-01-10 11:55 ` Simon Horman
2025-01-10 15:16 ` Ahmed Zaki
0 siblings, 1 reply; 13+ messages in thread
From: Simon Horman @ 2025-01-10 11:55 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, shayagr, kalesh-anakkur.purayil
On Thu, Jan 09, 2025 at 04:31:03PM -0700, Ahmed Zaki wrote:
> 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>
...
> diff --git a/net/core/dev.c b/net/core/dev.c
...
> +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;
Hi Ahmed,
Here it is assumed that napi may be NULL. But it is dereferenced
unconditionally on the first like of this function.
Flagged by Smatch.
> + 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)
...
--
pw-bot: changes-requested
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [PATCH net-next v4 2/6] net: napi: add internal ARFS rmap management
2025-01-10 11:55 ` Simon Horman
@ 2025-01-10 15:16 ` Ahmed Zaki
0 siblings, 0 replies; 13+ messages in thread
From: Ahmed Zaki @ 2025-01-10 15:16 UTC (permalink / raw)
To: Simon Horman
Cc: netdev, intel-wired-lan, andrew+netdev, edumazet, kuba, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, shayagr, kalesh-anakkur.purayil
On 2025-01-10 4:55 a.m., Simon Horman wrote:
> On Thu, Jan 09, 2025 at 04:31:03PM -0700, Ahmed Zaki wrote:
>> 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>
>
> ...
>
>> diff --git a/net/core/dev.c b/net/core/dev.c
>
> ...
>
>> +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;
>
> Hi Ahmed,
>
> Here it is assumed that napi may be NULL. But it is dereferenced
> unconditionally on the first like of this function.
>
> Flagged by Smatch.
>
Correct. This was probably a defensive check, I will remove it since the
caller already dereferences the napi ptr.
Thanks for the review.
Ahmed
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config
2025-01-09 23:31 [PATCH net-next v4 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
2025-01-09 23:31 ` [PATCH net-next v4 1/6] net: move ARFS rmap management to core Ahmed Zaki
2025-01-09 23:31 ` [PATCH net-next v4 2/6] net: napi: add internal ARFS rmap management Ahmed Zaki
@ 2025-01-09 23:31 ` Ahmed Zaki
2025-01-10 2:28 ` [Intel-wired-lan] " kernel test robot
2025-01-10 3:00 ` kernel test robot
2025-01-09 23:31 ` [PATCH net-next v4 4/6] bnxt: use napi's irq affinity Ahmed Zaki
` (2 subsequent siblings)
5 siblings, 2 replies; 13+ messages in thread
From: Ahmed Zaki @ 2025-01-09 23:31 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, horms, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, shayagr, kalesh-anakkur.purayil, 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 c789218cca5d..82da827b5ec6 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 1d4378962857..72b3caf0e79f 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -6761,22 +6761,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
@@ -6790,6 +6798,7 @@ netif_napi_affinity_release(struct kref *ref)
cpu_rmap_put(rmap);
}
+#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;
@@ -6797,7 +6806,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);
@@ -6821,9 +6830,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
@@ -6834,8 +6842,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);
@@ -6844,6 +6862,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->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.
*/
@@ -6860,6 +6882,10 @@ static void napi_save_config(struct napi_struct *n)
n->config->defer_hard_irqs = n->defer_hard_irqs;
n->config->gro_flush_timeout = n->gro_flush_timeout;
n->config->irq_suspend_timeout = n->irq_suspend_timeout;
+
+ if (n->irq > 0 && n->dev->irq_affinity_auto)
+ irq_set_affinity_notifier(n->irq, NULL);
+
napi_hash_del(n);
}
@@ -11358,7 +11384,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));
@@ -11454,6 +11480,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] 13+ messages in thread* Re: [Intel-wired-lan] [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config
2025-01-09 23:31 ` [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config Ahmed Zaki
@ 2025-01-10 2:28 ` kernel test robot
2025-01-10 3:00 ` kernel test robot
1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-01-10 2:28 UTC (permalink / raw)
To: Ahmed Zaki, netdev
Cc: oe-kbuild-all, intel-wired-lan, andrew+netdev, edumazet, kuba,
horms, pabeni, davem, michael.chan, tariqt, anthony.l.nguyen,
przemyslaw.kitszel, jdamato, shayd, akpm, shayagr,
kalesh-anakkur.purayil, 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/20250110-073339
base: net-next/main
patch link: https://lore.kernel.org/r/20250109233107.17519-4-ahmed.zaki%40intel.com
patch subject: [Intel-wired-lan] [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config
config: s390-randconfig-001-20250110 (https://download.01.org/0day-ci/archive/20250110/202501101042.2q2geY9c-lkp@intel.com/config)
compiler: s390-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250110/202501101042.2q2geY9c-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/202501101042.2q2geY9c-lkp@intel.com/
All errors (new ones prefixed by >>):
net/core/dev.c: In function 'netif_napi_affinity_release':
>> net/core/dev.c:6795:42: error: 'struct net_device' has no member named 'rx_cpu_rmap'
6795 | struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
| ^~
>> net/core/dev.c:6797:23: error: 'struct napi_struct' has no member named 'napi_rmap_idx'
6797 | rmap->obj[napi->napi_rmap_idx] = NULL;
| ^~
vim +6795 net/core/dev.c
064d6072cac4f49 Ahmed Zaki 2025-01-09 6789
064d6072cac4f49 Ahmed Zaki 2025-01-09 6790 static void
064d6072cac4f49 Ahmed Zaki 2025-01-09 6791 netif_napi_affinity_release(struct kref *ref)
064d6072cac4f49 Ahmed Zaki 2025-01-09 6792 {
064d6072cac4f49 Ahmed Zaki 2025-01-09 6793 struct napi_struct *napi =
064d6072cac4f49 Ahmed Zaki 2025-01-09 6794 container_of(ref, struct napi_struct, notify.kref);
064d6072cac4f49 Ahmed Zaki 2025-01-09 @6795 struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
064d6072cac4f49 Ahmed Zaki 2025-01-09 6796
064d6072cac4f49 Ahmed Zaki 2025-01-09 @6797 rmap->obj[napi->napi_rmap_idx] = NULL;
064d6072cac4f49 Ahmed Zaki 2025-01-09 6798 cpu_rmap_put(rmap);
064d6072cac4f49 Ahmed Zaki 2025-01-09 6799 }
064d6072cac4f49 Ahmed Zaki 2025-01-09 6800
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: [Intel-wired-lan] [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config
2025-01-09 23:31 ` [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config Ahmed Zaki
2025-01-10 2:28 ` [Intel-wired-lan] " kernel test robot
@ 2025-01-10 3:00 ` kernel test robot
1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2025-01-10 3:00 UTC (permalink / raw)
To: Ahmed Zaki, netdev
Cc: llvm, oe-kbuild-all, intel-wired-lan, andrew+netdev, edumazet,
kuba, horms, pabeni, davem, michael.chan, tariqt,
anthony.l.nguyen, przemyslaw.kitszel, jdamato, shayd, akpm,
shayagr, kalesh-anakkur.purayil, 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/20250110-073339
base: net-next/main
patch link: https://lore.kernel.org/r/20250109233107.17519-4-ahmed.zaki%40intel.com
patch subject: [Intel-wired-lan] [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config
config: arm-randconfig-003-20250110 (https://download.01.org/0day-ci/archive/20250110/202501101047.KVl1kI5I-lkp@intel.com/config)
compiler: clang version 19.1.3 (https://github.com/llvm/llvm-project ab51eccf88f5321e7c60591c5546b254b6afab99)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250110/202501101047.KVl1kI5I-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/202501101047.KVl1kI5I-lkp@intel.com/
All errors (new ones prefixed by >>):
>> net/core/dev.c:6795:37: error: no member named 'rx_cpu_rmap' in 'struct net_device'
6795 | struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
| ~~~~~~~~~ ^
>> net/core/dev.c:6797:18: error: no member named 'napi_rmap_idx' in 'struct napi_struct'
6797 | rmap->obj[napi->napi_rmap_idx] = NULL;
| ~~~~ ^
2 errors generated.
vim +6795 net/core/dev.c
064d6072cac4f4 Ahmed Zaki 2025-01-09 6789
064d6072cac4f4 Ahmed Zaki 2025-01-09 6790 static void
064d6072cac4f4 Ahmed Zaki 2025-01-09 6791 netif_napi_affinity_release(struct kref *ref)
064d6072cac4f4 Ahmed Zaki 2025-01-09 6792 {
064d6072cac4f4 Ahmed Zaki 2025-01-09 6793 struct napi_struct *napi =
064d6072cac4f4 Ahmed Zaki 2025-01-09 6794 container_of(ref, struct napi_struct, notify.kref);
064d6072cac4f4 Ahmed Zaki 2025-01-09 @6795 struct cpu_rmap *rmap = napi->dev->rx_cpu_rmap;
064d6072cac4f4 Ahmed Zaki 2025-01-09 6796
064d6072cac4f4 Ahmed Zaki 2025-01-09 @6797 rmap->obj[napi->napi_rmap_idx] = NULL;
064d6072cac4f4 Ahmed Zaki 2025-01-09 6798 cpu_rmap_put(rmap);
064d6072cac4f4 Ahmed Zaki 2025-01-09 6799 }
064d6072cac4f4 Ahmed Zaki 2025-01-09 6800
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH net-next v4 4/6] bnxt: use napi's irq affinity
2025-01-09 23:31 [PATCH net-next v4 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
` (2 preceding siblings ...)
2025-01-09 23:31 ` [PATCH net-next v4 3/6] net: napi: add CPU affinity to napi_config Ahmed Zaki
@ 2025-01-09 23:31 ` Ahmed Zaki
2025-01-09 23:31 ` [PATCH net-next v4 5/6] ice: " Ahmed Zaki
2025-01-09 23:31 ` [PATCH net-next v4 6/6] idpf: " Ahmed Zaki
5 siblings, 0 replies; 13+ messages in thread
From: Ahmed Zaki @ 2025-01-09 23:31 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, horms, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, shayagr, kalesh-anakkur.purayil, 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 | 25 +++--------------------
drivers/net/ethernet/broadcom/bnxt/bnxt.h | 2 --
2 files changed, 3 insertions(+), 24 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index cc3ca3440b0a..b11bd9d31e91 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;
}
@@ -16172,6 +16151,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] 13+ messages in thread* [PATCH net-next v4 5/6] ice: use napi's irq affinity
2025-01-09 23:31 [PATCH net-next v4 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
` (3 preceding siblings ...)
2025-01-09 23:31 ` [PATCH net-next v4 4/6] bnxt: use napi's irq affinity Ahmed Zaki
@ 2025-01-09 23:31 ` Ahmed Zaki
2025-01-09 23:31 ` [PATCH net-next v4 6/6] idpf: " Ahmed Zaki
5 siblings, 0 replies; 13+ messages in thread
From: Ahmed Zaki @ 2025-01-09 23:31 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, horms, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, shayagr, kalesh-anakkur.purayil, 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] 13+ messages in thread* [PATCH net-next v4 6/6] idpf: use napi's irq affinity
2025-01-09 23:31 [PATCH net-next v4 0/6] net: napi: add CPU affinity to napi->config Ahmed Zaki
` (4 preceding siblings ...)
2025-01-09 23:31 ` [PATCH net-next v4 5/6] ice: " Ahmed Zaki
@ 2025-01-09 23:31 ` Ahmed Zaki
5 siblings, 0 replies; 13+ messages in thread
From: Ahmed Zaki @ 2025-01-09 23:31 UTC (permalink / raw)
To: netdev
Cc: intel-wired-lan, andrew+netdev, edumazet, kuba, horms, pabeni,
davem, michael.chan, tariqt, anthony.l.nguyen, przemyslaw.kitszel,
jdamato, shayd, akpm, shayagr, kalesh-anakkur.purayil, 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] 13+ messages in thread