FRV: Fix the section attribute on UP DECLARE_PER_CPU()
[linux-2.6-block.git] / include / asm-generic / percpu.h
index 00f45ff081a63fc9f4401d2656346e1e5444f469..af47b9e1006432c82a8140dc52999fc055132128 100644 (file)
@@ -73,63 +73,50 @@ extern void setup_per_cpu_areas(void);
 
 #endif /* SMP */
 
-#ifndef PER_CPU_ATTRIBUTES
-#define PER_CPU_ATTRIBUTES
+#ifndef PER_CPU_BASE_SECTION
+#ifdef CONFIG_SMP
+#define PER_CPU_BASE_SECTION ".data.percpu"
+#else
+#define PER_CPU_BASE_SECTION ".data"
+#endif
 #endif
 
-#define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \
-                                       __typeof__(type) per_cpu_var(name)
+#ifdef CONFIG_SMP
 
-/*
- * Optional methods for optimized non-lvalue per-cpu variable access.
- *
- * @var can be a percpu variable or a field of it and its size should
- * equal char, int or long.  percpu_read() evaluates to a lvalue and
- * all others to void.
- *
- * These operations are guaranteed to be atomic w.r.t. preemption.
- * The generic versions use plain get/put_cpu_var().  Archs are
- * encouraged to implement single-instruction alternatives which don't
- * require preemption protection.
- */
-#ifndef percpu_read
-# define percpu_read(var)                                              \
-  ({                                                                   \
-       typeof(per_cpu_var(var)) __tmp_var__;                           \
-       __tmp_var__ = get_cpu_var(var);                                 \
-       put_cpu_var(var);                                               \
-       __tmp_var__;                                                    \
-  })
+#ifdef MODULE
+#define PER_CPU_SHARED_ALIGNED_SECTION ""
+#else
+#define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned"
 #endif
+#define PER_CPU_FIRST_SECTION ".first"
 
-#define __percpu_generic_to_op(var, val, op)                           \
-do {                                                                   \
-       get_cpu_var(var) op val;                                        \
-       put_cpu_var(var);                                               \
-} while (0)
+#else
 
-#ifndef percpu_write
-# define percpu_write(var, val)                __percpu_generic_to_op(var, (val), =)
-#endif
+#define PER_CPU_SHARED_ALIGNED_SECTION ""
+#define PER_CPU_FIRST_SECTION ""
 
-#ifndef percpu_add
-# define percpu_add(var, val)          __percpu_generic_to_op(var, (val), +=)
 #endif
 
-#ifndef percpu_sub
-# define percpu_sub(var, val)          __percpu_generic_to_op(var, (val), -=)
+#ifndef PER_CPU_ATTRIBUTES
+#define PER_CPU_ATTRIBUTES
 #endif
 
-#ifndef percpu_and
-# define percpu_and(var, val)          __percpu_generic_to_op(var, (val), &=)
-#endif
+#define DECLARE_PER_CPU_SECTION(type, name, section)                   \
+       extern \
+       __attribute__((__section__(PER_CPU_BASE_SECTION section)))      \
+       PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name
 
-#ifndef percpu_or
-# define percpu_or(var, val)           __percpu_generic_to_op(var, (val), |=)
-#endif
+#define DECLARE_PER_CPU(type, name)                                    \
+       DECLARE_PER_CPU_SECTION(type, name, "")
 
-#ifndef percpu_xor
-# define percpu_xor(var, val)          __percpu_generic_to_op(var, (val), ^=)
-#endif
+#define DECLARE_PER_CPU_SHARED_ALIGNED(type, name)                     \
+       DECLARE_PER_CPU_SECTION(type, name, PER_CPU_SHARED_ALIGNED_SECTION) \
+       ____cacheline_aligned_in_smp
+
+#define DECLARE_PER_CPU_PAGE_ALIGNED(type, name)                               \
+       DECLARE_PER_CPU_SECTION(type, name, ".page_aligned")
+
+#define DECLARE_PER_CPU_FIRST(type, name)                              \
+       DECLARE_PER_CPU_SECTION(type, name, PER_CPU_FIRST_SECTION)
 
 #endif /* _ASM_GENERIC_PERCPU_H_ */