xref: /linux/arch/powerpc/include/asm/membarrier.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 #ifndef _ASM_POWERPC_MEMBARRIER_H
2 #define _ASM_POWERPC_MEMBARRIER_H
3 
4 static inline void membarrier_arch_switch_mm(struct mm_struct *prev,
5 					     struct mm_struct *next,
6 					     struct task_struct *tsk)
7 {
8 	/*
9 	 * Only need the full barrier when switching between processes.
10 	 * Barrier when switching from kernel to userspace is not
11 	 * required here, given that it is implied by mmdrop(). Barrier
12 	 * when switching from userspace to kernel is not needed after
13 	 * store to rq->curr.
14 	 */
15 	if (IS_ENABLED(CONFIG_SMP) &&
16 	    likely(!(atomic_read(&next->membarrier_state) &
17 		     (MEMBARRIER_STATE_PRIVATE_EXPEDITED |
18 		      MEMBARRIER_STATE_GLOBAL_EXPEDITED)) || !prev))
19 		return;
20 
21 	/*
22 	 * The membarrier system call requires a full memory barrier
23 	 * after storing to rq->curr, before going back to user-space.
24 	 */
25 	smp_mb();
26 }
27 
28 #endif /* _ASM_POWERPC_MEMBARRIER_H */
29