summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2025-02-26 19:51:43 -0800
committerJakub Kicinski <kuba@kernel.org>2025-02-26 19:51:43 -0800
commit0493f7a54e5bcf490f943f7b25ec6e1051832f98 (patch)
tree8891f6113e03f007c711cddc12fe5662c920c8fc /include/linux
parent28d68d396a1cd21591e8c6d74afbde33a7ea107e (diff)
parent185646a8a0a88c9016a782f9b98eea0eb6078512 (diff)
Merge branch 'net-napi-add-cpu-affinity-to-napi-config'
Ahmed Zaki says: ==================== net: napi: add CPU affinity to napi->config Drivers usually need to re-apply the user-set IRQ affinity to their IRQs after reset. However, since there can be only one IRQ affinity notifier for each IRQ, registering IRQ notifiers conflicts with the ARFS rmap management in the core (which also registers separate IRQ affinity notifiers). Move the IRQ affinity management to the napi struct. This way we can have a unified IRQ notifier to re-apply the user-set affinity and also manage the ARFS rmaps. The first patch moves the aRFS rmap management to core. It also adds the IRQ affinity mask to napi_config and re-applies the mask after reset. Patches 2, 4 and 5 use the new API for ena, ice and idpf drivers. ICE does not always delete the NAPIs before releasing the IRQs. The third patch makes sure the driver removes the IRQ number along with the queue when the NAPIs are disabled. Without this, the next patches in this series would free the IRQ before releasing the IRQ notifier (which generates warnings). Tested on ice and idpf. v8: https://lore.kernel.org/20250211210657.428439-1-ahmed.zaki@intel.com v7: https://lore.kernel.org/20250204220622.156061-1-ahmed.zaki@intel.com v6: https://lore.kernel.org/20250118003335.155379-1-ahmed.zaki@intel.com v5: https://lore.kernel.org/20250113171042.158123-1-ahmed.zaki@intel.com v4: https://lore.kernel.org/20250109233107.17519-1-ahmed.zaki@intel.com v3: https://lore.kernel.org/20250104004314.208259-1-ahmed.zaki@intel.com v2: https://lore.kernel.org/202412190454.nwvp3hU2-lkp@intel.com v1: https://lore.kernel.org/20241210002626.366878-1-ahmed.zaki@intel.com ==================== Link: https://patch.msgid.link/20250224232228.990783-1-ahmed.zaki@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/cpu_rmap.h1
-rw-r--r--include/linux/netdevice.h24
2 files changed, 21 insertions, 4 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 9a387d456592..2094d3edda73 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -352,6 +352,7 @@ struct napi_config {
u64 gro_flush_timeout;
u64 irq_suspend_timeout;
u32 defer_hard_irqs;
+ cpumask_t affinity_mask;
unsigned int napi_id;
};
@@ -394,6 +395,8 @@ struct napi_struct {
struct list_head dev_list;
struct hlist_node napi_hash_node;
int irq;
+ struct irq_affinity_notify notify;
+ int napi_rmap_idx;
int index;
struct napi_config *config;
};
@@ -409,6 +412,7 @@ enum {
NAPI_STATE_PREFER_BUSY_POLL, /* prefer busy-polling over softirq processing*/
NAPI_STATE_THREADED, /* The poll is performed inside its own thread*/
NAPI_STATE_SCHED_THREADED, /* Napi is currently scheduled in threaded mode */
+ NAPI_STATE_HAS_NOTIFIER, /* Napi has an IRQ notifier */
};
enum {
@@ -422,6 +426,7 @@ enum {
NAPIF_STATE_PREFER_BUSY_POLL = BIT(NAPI_STATE_PREFER_BUSY_POLL),
NAPIF_STATE_THREADED = BIT(NAPI_STATE_THREADED),
NAPIF_STATE_SCHED_THREADED = BIT(NAPI_STATE_SCHED_THREADED),
+ NAPIF_STATE_HAS_NOTIFIER = BIT(NAPI_STATE_HAS_NOTIFIER),
};
enum gro_result {
@@ -1989,6 +1994,15 @@ enum netdev_reg_state {
*
* @threaded: napi threaded mode is enabled
*
+ * @irq_affinity_auto: driver wants the core to store and re-assign the IRQ
+ * affinity. Set by netif_enable_irq_affinity(), then
+ * the driver must create a persistent napi by
+ * netif_napi_add_config() and finally bind the napi to
+ * IRQ (via netif_napi_set_irq()).
+ *
+ * @rx_cpu_rmap_auto: driver wants the core to manage the ARFS rmap.
+ * Set by calling netif_enable_cpu_rmap().
+ *
* @see_all_hwtstamp_requests: device wants to see calls to
* ndo_hwtstamp_set() for all timestamp requests
* regardless of source, even if those aren't
@@ -2396,6 +2410,8 @@ struct net_device {
struct lock_class_key *qdisc_tx_busylock;
bool proto_down;
bool threaded;
+ bool irq_affinity_auto;
+ bool rx_cpu_rmap_auto;
/* priv_flags_slow, ungrouped to save space */
unsigned long see_all_hwtstamp_requests:1;
@@ -2724,10 +2740,7 @@ static inline void netdev_assert_locked_or_invisible(struct net_device *dev)
netdev_assert_locked(dev);
}
-static inline void netif_napi_set_irq_locked(struct napi_struct *napi, int irq)
-{
- napi->irq = irq;
-}
+void netif_napi_set_irq_locked(struct napi_struct *napi, int irq);
static inline void netif_napi_set_irq(struct napi_struct *napi, int irq)
{
@@ -2865,6 +2878,9 @@ static inline void netif_napi_del(struct napi_struct *napi)
synchronize_net();
}
+int netif_enable_cpu_rmap(struct net_device *dev, unsigned int num_irqs);
+void netif_set_affinity_auto(struct net_device *dev);
+
struct packet_type {
__be16 type; /* This is really htons(ether_type). */
bool ignore_outgoing;