diff options
Diffstat (limited to 'include/asm-generic/percpu.h')
| -rw-r--r-- | include/asm-generic/percpu.h | 25 | 
1 files changed, 23 insertions, 2 deletions
| diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index 0504ef8f3aa3..1817a8415a5e 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _ASM_GENERIC_PERCPU_H_  #define _ASM_GENERIC_PERCPU_H_ @@ -115,15 +116,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;						\ |