Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #ifndef _ASM_GENERIC_PERCPU_H_
  2 #define _ASM_GENERIC_PERCPU_H_
  3 #include <linux/compiler.h>
  4 #include <linux/threads.h>
  5 
  6 /*
  7  * Determine the real variable name from the name visible in the
  8  * kernel sources.
  9  */
 10 #define per_cpu_var(var) per_cpu__##var
 11 
 12 #define __per_cpu_var_lock(var) per_cpu_lock__##var##_locked
 13 #define __per_cpu_var_lock_var(var) per_cpu__##var##_locked
 14 
 15 #ifdef CONFIG_SMP
 16 
 17 /*
 18  * per_cpu_offset() is the offset that has to be added to a
 19  * percpu variable to get to the instance for a certain processor.
 20  *
 21  * Most arches use the __per_cpu_offset array for those offsets but
 22  * some arches have their own ways of determining the offset (x86_64, s390).
 23  */
 24 #ifndef __per_cpu_offset
 25 extern unsigned long __per_cpu_offset[NR_CPUS];
 26 
 27 #define per_cpu_offset(x) (__per_cpu_offset[x])
 28 #endif
 29 
 30 /*
 31  * Determine the offset for the currently active processor.
 32  * An arch may define __my_cpu_offset to provide a more effective
 33  * means of obtaining the offset to the per cpu variables of the
 34  * current processor.
 35  */
 36 #ifndef __my_cpu_offset
 37 #define __my_cpu_offset per_cpu_offset(raw_smp_processor_id())
 38 #endif
 39 #ifdef CONFIG_DEBUG_PREEMPT
 40 #define my_cpu_offset per_cpu_offset(smp_processor_id())
 41 #else
 42 #define my_cpu_offset __my_cpu_offset
 43 #endif
 44 
 45 /*
 46  * Add a offset to a pointer but keep the pointer as is.
 47  *
 48  * Only S390 provides its own means of moving the pointer.
 49  */
 50 #ifndef SHIFT_PERCPU_PTR
 51 #define SHIFT_PERCPU_PTR(__p, __offset) RELOC_HIDE((__p), (__offset))
 52 #endif
 53 
 54 /*
 55  * A percpu variable may point to a discarded regions. The following are
 56  * established ways to produce a usable pointer from the percpu variable
 57  * offset.
 58  */
 59 #define per_cpu(var, cpu) \
 60         (*SHIFT_PERCPU_PTR(&per_cpu_var(var), per_cpu_offset(cpu)))
 61 #define __get_cpu_var(var) \
 62         (*SHIFT_PERCPU_PTR(&per_cpu_var(var), my_cpu_offset))
 63 #define __raw_get_cpu_var(var) \
 64         (*SHIFT_PERCPU_PTR(&per_cpu_var(var), __my_cpu_offset))
 65 
 66 #define per_cpu_lock(var, cpu) \
 67         (*SHIFT_PERCPU_PTR(&__per_cpu_var_lock(var), per_cpu_offset(cpu)))
 68 #define per_cpu_var_locked(var, cpu) \
 69         (*SHIFT_PERCPU_PTR(&__per_cpu_var_lock_var(var), per_cpu_offset(cpu)))
 70 #define __get_cpu_lock(var, cpu) \
 71                 per_cpu_lock(var, cpu)
 72 #define __get_cpu_var_locked(var, cpu) \
 73                 per_cpu_var_locked(var, cpu)
 74 
 75 #ifdef CONFIG_HAVE_SETUP_PER_CPU_AREA
 76 extern void setup_per_cpu_areas(void);
 77 #endif
 78 
 79 #else /* ! SMP */
 80 
 81 #define per_cpu(var, cpu)                       (*((void)(cpu), &per_cpu_var(var)))
 82 #define per_cpu_var_locked(var, cpu)            (*((void)(cpu), &__per_cpu_var_lock_var(var)))
 83 #define __get_cpu_var(var)                      per_cpu_var(var)
 84 #define __raw_get_cpu_var(var)                  per_cpu_var(var)
 85 #define __get_cpu_lock(var, cpu)                __per_cpu_var_lock(var)
 86 #define __get_cpu_var_locked(var, cpu)          __per_cpu_var_lock_var(var)
 87 #endif  /* SMP */
 88 
 89 #ifndef PER_CPU_ATTRIBUTES
 90 #define PER_CPU_ATTRIBUTES
 91 #endif
 92 
 93 #define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \
 94                                         __typeof__(type) per_cpu_var(name)
 95 #define DECLARE_PER_CPU_LOCKED(type, name)                                      \
 96         extern PER_CPU_ATTRIBUTES spinlock_t __per_cpu_var_lock(name);          \
 97         extern PER_CPU_ATTRIBUTES __typeof__(type) __per_cpu_var_lock_var(name)
 98 
 99 #endif /* _ASM_GENERIC_PERCPU_H_ */
100 
  This page was automatically generated by the LXR engine.