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 | ||
10 | #include <linux/cpumask.h> | |
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 BH |
18 | * @size: Number of objects to be reverse-mapped |
19 | * @used: Number of objects added | |
20 | * @obj: Pointer to array of object pointers | |
21 | * @near: For each CPU, the index and distance to the nearest object, | |
22 | * based on affinity masks | |
23 | */ | |
24 | struct cpu_rmap { | |
896f97ea | 25 | struct kref refcount; |
c39649c3 BH |
26 | u16 size, used; |
27 | void **obj; | |
28 | struct { | |
29 | u16 index; | |
30 | u16 dist; | |
31 | } near[0]; | |
32 | }; | |
33 | #define CPU_RMAP_DIST_INF 0xffff | |
34 | ||
35 | extern struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags); | |
896f97ea | 36 | extern int cpu_rmap_put(struct cpu_rmap *rmap); |
c39649c3 BH |
37 | |
38 | extern int cpu_rmap_add(struct cpu_rmap *rmap, void *obj); | |
39 | extern int cpu_rmap_update(struct cpu_rmap *rmap, u16 index, | |
40 | const struct cpumask *affinity); | |
41 | ||
42 | static inline u16 cpu_rmap_lookup_index(struct cpu_rmap *rmap, unsigned int cpu) | |
43 | { | |
44 | return rmap->near[cpu].index; | |
45 | } | |
46 | ||
47 | static inline void *cpu_rmap_lookup_obj(struct cpu_rmap *rmap, unsigned int cpu) | |
48 | { | |
49 | return rmap->obj[rmap->near[cpu].index]; | |
50 | } | |
51 | ||
c39649c3 BH |
52 | /** |
53 | * alloc_irq_cpu_rmap - allocate CPU affinity reverse-map for IRQs | |
54 | * @size: Number of objects to be mapped | |
55 | * | |
56 | * Must be called in process context. | |
57 | */ | |
58 | static inline struct cpu_rmap *alloc_irq_cpu_rmap(unsigned int size) | |
59 | { | |
60 | return alloc_cpu_rmap(size, GFP_KERNEL); | |
61 | } | |
62 | extern void free_irq_cpu_rmap(struct cpu_rmap *rmap); | |
63 | ||
64 | extern int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq); | |
65 | ||
122733a1 | 66 | #endif /* __LINUX_CPU_RMAP_H */ |