linux/include/linux/cpu_rmap.h
<<
>>
Prefs
   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