2018-01-30 04:20:11 +08:00
|
|
|
#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 (likely(!(atomic_read(&next->membarrier_state) &
|
2018-01-30 04:20:13 +08:00
|
|
|
(MEMBARRIER_STATE_PRIVATE_EXPEDITED |
|
|
|
|
MEMBARRIER_STATE_GLOBAL_EXPEDITED)) || !prev))
|
2018-01-30 04:20:11 +08:00
|
|
|
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 */
|