Home | History | Annotate | Download | only in asm-generic
      1 #ifndef _ASM_GENERIC_PERCPU_H_
      2 #define _ASM_GENERIC_PERCPU_H_
      3 #include <linux/compiler.h>
      4 
      5 #define __GENERIC_PER_CPU
      6 #ifdef CONFIG_SMP
      7 
      8 extern unsigned long __per_cpu_offset[NR_CPUS];
      9 
     10 #define per_cpu_offset(x) (__per_cpu_offset[x])
     11 
     12 /* Separate out the type, so (int[3], foo) works. */
     13 #define DEFINE_PER_CPU(type, name) \
     14     __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name
     15 
     16 /* var is in discarded region: offset to particular copy we want */
     17 #define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
     18 #define __get_cpu_var(var) per_cpu(var, smp_processor_id())
     19 #define __raw_get_cpu_var(var) per_cpu(var, raw_smp_processor_id())
     20 
     21 /* A macro to avoid #include hell... */
     22 #define percpu_modcopy(pcpudst, src, size)			\
     23 do {								\
     24 	unsigned int __i;					\
     25 	for_each_possible_cpu(__i)				\
     26 		memcpy((pcpudst)+__per_cpu_offset[__i],		\
     27 		       (src), (size));				\
     28 } while (0)
     29 #else /* ! SMP */
     30 
     31 #define DEFINE_PER_CPU(type, name) \
     32     __typeof__(type) per_cpu__##name
     33 
     34 #define per_cpu(var, cpu)			(*((void)(cpu), &per_cpu__##var))
     35 #define __get_cpu_var(var)			per_cpu__##var
     36 #define __raw_get_cpu_var(var)			per_cpu__##var
     37 
     38 #endif	/* SMP */
     39 
     40 #define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
     41 
     42 #define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
     43 #define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
     44 
     45 #endif /* _ASM_GENERIC_PERCPU_H_ */
     46