]>
Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
122733a1 AV |
2 | #ifndef __LINUX_CPU_RMAP_H |
3 | #define __LINUX_CPU_RMAP_H | |
4 | ||
c39649c3 BH |
5 | /* |
6 | * cpu_rmap.c: CPU affinity reverse-map support | |
7 | * Copyright 2011 Solarflare Communications Inc. | |
c39649c3 BH |
8 | */ |
9 | ||
e1b6705b | 10 | #include <linux/cpumask_types.h> |
c39649c3 BH |
11 | #include <linux/gfp.h> |
12 | #include <linux/slab.h> | |
896f97ea | 13 | #include <linux/kref.h> |
c39649c3 BH |
14 | |
15 | /** | |
16 | * struct cpu_rmap - CPU affinity reverse-map | |
896f97ea | 17 | * @refcount: kref for object |
c39649c3 | 18 | * @size: Number of objects to be reverse-mapped |
c39649c3 BH |
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 { | |
896f97ea | 24 | struct kref refcount; |
9821d8d4 | 25 | u16 size; |
c39649c3 BH |
26 | void **obj; |
27 | struct { | |
28 | u16 index; | |
29 | u16 dist; | |
31232272 | 30 | } near[]; |
c39649c3 BH |
31 | }; |
32 | #define CPU_RMAP_DIST_INF 0xffff | |
33 | ||
34 | extern struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags); | |
896f97ea | 35 | extern int cpu_rmap_put(struct cpu_rmap *rmap); |
c39649c3 BH |
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 | ||
c39649c3 BH |
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 | ||
71f0a247 | 63 | int irq_cpu_rmap_remove(struct cpu_rmap *rmap, int irq); |
c39649c3 BH |
64 | extern int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq); |
65 | ||
122733a1 | 66 | #endif /* __LINUX_CPU_RMAP_H */ |