On Tue, Sep 19, 2017 at 06:13:41PM -0400, Mathieu Desnoyers wrote: [...] > +static inline void membarrier_arch_sched_in(struct task_struct *prev, > + struct task_struct *next) > +{ > + /* > + * Only need the full barrier when switching between processes. > + */ > + if (likely(!test_ti_thread_flag(task_thread_info(next), > + TIF_MEMBARRIER_PRIVATE_EXPEDITED) > + || prev->mm == next->mm)) And we also don't need the smp_mb() if !prev->mm, because switching from kernel to user will have a smp_mb() implied by mmdrop()? > + return; > + > + /* > + * The membarrier system call requires a full memory barrier > + * after storing to rq->curr, before going back to user-space. > + */ > + smp_mb(); > +} [...] > +static inline void membarrier_fork(struct task_struct *t, > + unsigned long clone_flags) > +{ > + if (!current->mm || !t->mm) > + return; > + t->mm->membarrier_private_expedited = > + current->mm->membarrier_private_expedited; Have we already done the copy of ->membarrier_private_expedited in copy_mm()? Regards, Boqun > + membarrier_arch_fork(t, clone_flags); > +} > +static inline void membarrier_execve(struct task_struct *t) > +{ > + t->mm->membarrier_private_expedited = 0; > + membarrier_arch_execve(t); > +} > +#else > +static inline void membarrier_sched_in(struct task_struct *prev, > + struct task_struct *next) > +{ > +} > +static inline void membarrier_fork(struct task_struct *t, > + unsigned long clone_flags) > +{ > +} > +static inline void membarrier_execve(struct task_struct *t) > +{ > +} > +#endif > + [...]
Attachment:
signature.asc
Description: PGP signature