mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-27 06:50:37 +00:00

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. Unify this task across all drivers by moving the CPU affinity to napi->config. However, to move the CPU affinity to core, we also need to move aRFS rmap management since aRFS uses its own IRQ notifiers. For the aRFS, 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 rmaps. Freeing the rmap is also done by core when the netdev is freed. For better IRQ affinity management, move the IRQ rmap notifier inside the napi_struct and add new notify.notify and notify.release functions: netif_irq_cpu_rmap_notify() and netif_napi_affinity_release(). Now we have the aRFS rmap management in core, 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> Link: https://patch.msgid.link/20250224232228.990783-2-ahmed.zaki@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
68 lines
1.8 KiB
C
68 lines
1.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
#ifndef __LINUX_CPU_RMAP_H
|
|
#define __LINUX_CPU_RMAP_H
|
|
|
|
/*
|
|
* cpu_rmap.c: CPU affinity reverse-map support
|
|
* Copyright 2011 Solarflare Communications Inc.
|
|
*/
|
|
|
|
#include <linux/cpumask_types.h>
|
|
#include <linux/gfp.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/kref.h>
|
|
|
|
/**
|
|
* struct cpu_rmap - CPU affinity reverse-map
|
|
* @refcount: kref for object
|
|
* @size: Number of objects to be reverse-mapped
|
|
* @obj: Pointer to array of object pointers
|
|
* @near: For each CPU, the index and distance to the nearest object,
|
|
* based on affinity masks
|
|
*/
|
|
struct cpu_rmap {
|
|
struct kref refcount;
|
|
u16 size;
|
|
void **obj;
|
|
struct {
|
|
u16 index;
|
|
u16 dist;
|
|
} near[];
|
|
};
|
|
#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);
|
|
extern int cpu_rmap_update(struct cpu_rmap *rmap, u16 index,
|
|
const struct cpumask *affinity);
|
|
|
|
static inline u16 cpu_rmap_lookup_index(struct cpu_rmap *rmap, unsigned int cpu)
|
|
{
|
|
return rmap->near[cpu].index;
|
|
}
|
|
|
|
static inline void *cpu_rmap_lookup_obj(struct cpu_rmap *rmap, unsigned int cpu)
|
|
{
|
|
return rmap->obj[rmap->near[cpu].index];
|
|
}
|
|
|
|
/**
|
|
* alloc_irq_cpu_rmap - allocate CPU affinity reverse-map for IRQs
|
|
* @size: Number of objects to be mapped
|
|
*
|
|
* Must be called in process context.
|
|
*/
|
|
static inline struct cpu_rmap *alloc_irq_cpu_rmap(unsigned int size)
|
|
{
|
|
return alloc_cpu_rmap(size, GFP_KERNEL);
|
|
}
|
|
extern void free_irq_cpu_rmap(struct cpu_rmap *rmap);
|
|
|
|
int irq_cpu_rmap_remove(struct cpu_rmap *rmap, int irq);
|
|
extern int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq);
|
|
|
|
#endif /* __LINUX_CPU_RMAP_H */
|