| /* 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.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 |
| * @used: Number of objects added |
| * @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, used; |
| 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 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); |
| |
| extern int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq); |
| |
| #endif /* __LINUX_CPU_RMAP_H */ |