| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #ifndef _ASM_GENERIC_PERCPU_H_
 | 
					
						
							|  |  |  | #define _ASM_GENERIC_PERCPU_H_
 | 
					
						
							|  |  |  | #include <linux/compiler.h>
 | 
					
						
							| 
									
										
										
										
											2007-05-02 19:27:10 +02:00
										 |  |  | #include <linux/threads.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define __GENERIC_PER_CPU
 | 
					
						
							|  |  |  | #ifdef CONFIG_SMP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern unsigned long __per_cpu_offset[NR_CPUS]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-03 00:24:26 -07:00
										 |  |  | #define per_cpu_offset(x) (__per_cpu_offset[x])
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* Separate out the type, so (int[3], foo) works. */ | 
					
						
							|  |  |  | #define DEFINE_PER_CPU(type, name) \
 | 
					
						
							|  |  |  |     __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-19 01:48:12 -07:00
										 |  |  | #define DEFINE_PER_CPU_SHARED_ALIGNED(type, name)		\
 | 
					
						
							|  |  |  |     __attribute__((__section__(".data.percpu.shared_aligned"))) \ | 
					
						
							|  |  |  |     __typeof__(type) per_cpu__##name				\ | 
					
						
							|  |  |  |     ____cacheline_aligned_in_smp | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* var is in discarded region: offset to particular copy we want */ | 
					
						
							| 
									
										
										
										
											2006-09-25 23:30:53 -07:00
										 |  |  | #define per_cpu(var, cpu) (*({				\
 | 
					
						
							| 
									
										
										
										
											2006-10-06 00:43:58 -07:00
										 |  |  | 	extern int simple_identifier_##var(void);	\ | 
					
						
							| 
									
										
										
										
											2006-09-25 23:30:53 -07:00
										 |  |  | 	RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]); })) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #define __get_cpu_var(var) per_cpu(var, smp_processor_id())
 | 
					
						
							| 
									
										
											  
											
												[PATCH] Define __raw_get_cpu_var and use it
There are several instances of per_cpu(foo, raw_smp_processor_id()), which
is semantically equivalent to __get_cpu_var(foo) but without the warning
that smp_processor_id() can give if CONFIG_DEBUG_PREEMPT is enabled.  For
those architectures with optimized per-cpu implementations, namely ia64,
powerpc, s390, sparc64 and x86_64, per_cpu() turns into more and slower
code than __get_cpu_var(), so it would be preferable to use __get_cpu_var
on those platforms.
This defines a __raw_get_cpu_var(x) macro which turns into per_cpu(x,
raw_smp_processor_id()) on architectures that use the generic per-cpu
implementation, and turns into __get_cpu_var(x) on the architectures that
have an optimized per-cpu implementation.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Acked-by: David S. Miller <davem@davemloft.net>
Acked-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
											
										 
											2006-06-25 05:47:14 -07:00
										 |  |  | #define __raw_get_cpu_var(var) per_cpu(var, raw_smp_processor_id())
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* A macro to avoid #include hell... */ | 
					
						
							|  |  |  | #define percpu_modcopy(pcpudst, src, size)			\
 | 
					
						
							|  |  |  | do {								\ | 
					
						
							|  |  |  | 	unsigned int __i;					\ | 
					
						
							| 
									
										
										
										
											2006-03-28 01:56:37 -08:00
										 |  |  | 	for_each_possible_cpu(__i)				\ | 
					
						
							| 
									
										
										
										
											2006-03-23 03:01:05 -08:00
										 |  |  | 		memcpy((pcpudst)+__per_cpu_offset[__i],		\ | 
					
						
							|  |  |  | 		       (src), (size));				\ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } while (0) | 
					
						
							|  |  |  | #else /* ! SMP */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define DEFINE_PER_CPU(type, name) \
 | 
					
						
							|  |  |  |     __typeof__(type) per_cpu__##name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-19 01:48:12 -07:00
										 |  |  | #define DEFINE_PER_CPU_SHARED_ALIGNED(type, name)	\
 | 
					
						
							|  |  |  |     DEFINE_PER_CPU(type, name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-23 00:09:59 -07:00
										 |  |  | #define per_cpu(var, cpu)			(*((void)(cpu), &per_cpu__##var))
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #define __get_cpu_var(var)			per_cpu__##var
 | 
					
						
							| 
									
										
											  
											
												[PATCH] Define __raw_get_cpu_var and use it
There are several instances of per_cpu(foo, raw_smp_processor_id()), which
is semantically equivalent to __get_cpu_var(foo) but without the warning
that smp_processor_id() can give if CONFIG_DEBUG_PREEMPT is enabled.  For
those architectures with optimized per-cpu implementations, namely ia64,
powerpc, s390, sparc64 and x86_64, per_cpu() turns into more and slower
code than __get_cpu_var(), so it would be preferable to use __get_cpu_var
on those platforms.
This defines a __raw_get_cpu_var(x) macro which turns into per_cpu(x,
raw_smp_processor_id()) on architectures that use the generic per-cpu
implementation, and turns into __get_cpu_var(x) on the architectures that
have an optimized per-cpu implementation.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Acked-by: David S. Miller <davem@davemloft.net>
Acked-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
											
										 
											2006-06-25 05:47:14 -07:00
										 |  |  | #define __raw_get_cpu_var(var)			per_cpu__##var
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif	/* SMP */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var)
 | 
					
						
							|  |  |  | #define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* _ASM_GENERIC_PERCPU_H_ */
 |