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