Branch data Line data Source code
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 : : * @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 { 25 : : struct kref refcount; 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); 36 : : extern int cpu_rmap_put(struct cpu_rmap *rmap); 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 : 0 : 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 : : 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 : : 66 : : #endif /* __LINUX_CPU_RMAP_H */