29 lines
877 B
C
29 lines
877 B
C
|
#ifndef _ASM_POWERPC_MEMBARRIER_H
|
||
|
#define _ASM_POWERPC_MEMBARRIER_H
|
||
|
|
||
|
static inline void membarrier_arch_switch_mm(struct mm_struct *prev,
|
||
|
struct mm_struct *next,
|
||
|
struct task_struct *tsk)
|
||
|
{
|
||
|
/*
|
||
|
* Only need the full barrier when switching between processes.
|
||
|
* Barrier when switching from kernel to userspace is not
|
||
|
* required here, given that it is implied by mmdrop(). Barrier
|
||
|
* when switching from userspace to kernel is not needed after
|
||
|
* store to rq->curr.
|
||
|
*/
|
||
|
if (IS_ENABLED(CONFIG_SMP) &&
|
||
|
likely(!(atomic_read(&next->membarrier_state) &
|
||
|
(MEMBARRIER_STATE_PRIVATE_EXPEDITED |
|
||
|
MEMBARRIER_STATE_GLOBAL_EXPEDITED)) || !prev))
|
||
|
return;
|
||
|
|
||
|
/*
|
||
|
* The membarrier system call requires a full memory barrier
|
||
|
* after storing to rq->curr, before going back to user-space.
|
||
|
*/
|
||
|
smp_mb();
|
||
|
}
|
||
|
|
||
|
#endif /* _ASM_POWERPC_MEMBARRIER_H */
|