1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | #ifndef __LINUX_CPU_RMAP_H |
3 | #define __LINUX_CPU_RMAP_H |
4 | |
5 | /* |
6 | * cpu_rmap.c: CPU affinity reverse-map support |
7 | * Copyright 2011 Solarflare Communications Inc. |
8 | */ |
9 | |
10 | #include <linux/cpumask.h> |
11 | #include <linux/gfp.h> |
12 | #include <linux/slab.h> |
13 | #include <linux/kref.h> |
14 | |
15 | /** |
16 | * struct cpu_rmap - CPU affinity reverse-map |
17 | * @refcount: kref for object |
18 | * @size: Number of objects to be reverse-mapped |
19 | * @obj: Pointer to array of object pointers |
20 | * @near: For each CPU, the index and distance to the nearest object, |
21 | * based on affinity masks |
22 | */ |
23 | struct cpu_rmap { |
24 | struct kref refcount; |
25 | u16 size; |
26 | void **obj; |
27 | struct { |
28 | u16 index; |
29 | u16 dist; |
30 | } near[]; |
31 | }; |
32 | #define CPU_RMAP_DIST_INF 0xffff |
33 | |
34 | extern struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags); |
35 | extern int cpu_rmap_put(struct cpu_rmap *rmap); |
36 | |
37 | extern int cpu_rmap_add(struct cpu_rmap *rmap, void *obj); |
38 | extern int cpu_rmap_update(struct cpu_rmap *rmap, u16 index, |
39 | const struct cpumask *affinity); |
40 | |
41 | static inline u16 cpu_rmap_lookup_index(struct cpu_rmap *rmap, unsigned int cpu) |
42 | { |
43 | return rmap->near[cpu].index; |
44 | } |
45 | |
46 | static inline void *cpu_rmap_lookup_obj(struct cpu_rmap *rmap, unsigned int cpu) |
47 | { |
48 | return rmap->obj[rmap->near[cpu].index]; |
49 | } |
50 | |
51 | /** |
52 | * alloc_irq_cpu_rmap - allocate CPU affinity reverse-map for IRQs |
53 | * @size: Number of objects to be mapped |
54 | * |
55 | * Must be called in process context. |
56 | */ |
57 | static inline struct cpu_rmap *alloc_irq_cpu_rmap(unsigned int size) |
58 | { |
59 | return alloc_cpu_rmap(size, GFP_KERNEL); |
60 | } |
61 | extern void free_irq_cpu_rmap(struct cpu_rmap *rmap); |
62 | |
63 | int irq_cpu_rmap_remove(struct cpu_rmap *rmap, int irq); |
64 | extern int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq); |
65 | |
66 | #endif /* __LINUX_CPU_RMAP_H */ |
67 | |