|
@@ -115,15 +115,35 @@ do { \
|
|
|
(__ret); \
|
|
|
})
|
|
|
|
|
|
-#define this_cpu_generic_read(pcp) \
|
|
|
+#define __this_cpu_generic_read_nopreempt(pcp) \
|
|
|
({ \
|
|
|
typeof(pcp) __ret; \
|
|
|
preempt_disable_notrace(); \
|
|
|
- __ret = raw_cpu_generic_read(pcp); \
|
|
|
+ __ret = READ_ONCE(*raw_cpu_ptr(&(pcp))); \
|
|
|
preempt_enable_notrace(); \
|
|
|
__ret; \
|
|
|
})
|
|
|
|
|
|
+#define __this_cpu_generic_read_noirq(pcp) \
|
|
|
+({ \
|
|
|
+ typeof(pcp) __ret; \
|
|
|
+ unsigned long __flags; \
|
|
|
+ raw_local_irq_save(__flags); \
|
|
|
+ __ret = raw_cpu_generic_read(pcp); \
|
|
|
+ raw_local_irq_restore(__flags); \
|
|
|
+ __ret; \
|
|
|
+})
|
|
|
+
|
|
|
+#define this_cpu_generic_read(pcp) \
|
|
|
+({ \
|
|
|
+ typeof(pcp) __ret; \
|
|
|
+ if (__native_word(pcp)) \
|
|
|
+ __ret = __this_cpu_generic_read_nopreempt(pcp); \
|
|
|
+ else \
|
|
|
+ __ret = __this_cpu_generic_read_noirq(pcp); \
|
|
|
+ __ret; \
|
|
|
+})
|
|
|
+
|
|
|
#define this_cpu_generic_to_op(pcp, val, op) \
|
|
|
do { \
|
|
|
unsigned long __flags; \
|