cpu_rmap.h (1721B)
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 */ 24struct cpu_rmap { 25 struct kref refcount; 26 u16 size, used; 27 void **obj; 28 struct { 29 u16 index; 30 u16 dist; 31 } near[]; 32}; 33#define CPU_RMAP_DIST_INF 0xffff 34 35extern struct cpu_rmap *alloc_cpu_rmap(unsigned int size, gfp_t flags); 36extern int cpu_rmap_put(struct cpu_rmap *rmap); 37 38extern int cpu_rmap_add(struct cpu_rmap *rmap, void *obj); 39extern int cpu_rmap_update(struct cpu_rmap *rmap, u16 index, 40 const struct cpumask *affinity); 41 42static inline u16 cpu_rmap_lookup_index(struct cpu_rmap *rmap, unsigned int cpu) 43{ 44 return rmap->near[cpu].index; 45} 46 47static 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 */ 58static inline struct cpu_rmap *alloc_irq_cpu_rmap(unsigned int size) 59{ 60 return alloc_cpu_rmap(size, GFP_KERNEL); 61} 62extern void free_irq_cpu_rmap(struct cpu_rmap *rmap); 63 64extern int irq_cpu_rmap_add(struct cpu_rmap *rmap, int irq); 65 66#endif /* __LINUX_CPU_RMAP_H */