On 26.04.2018 18:20, Peter Zijlstra wrote: > On Thu, Apr 26, 2018 at 04:52:39PM +0300, Kirill Tkhai wrote: >>>> >>>> 1)for_each_process(g) copy_process() >>>> p->mm = mm >>>> smp_rmb(); smp_wmb() implied by alloc_pid() >>>> if (g->flags & PF_KTHREAD) list_add_tail_rcu(&p->tasks, >>>> &init_task.tasks) >>>> >>>> 2)for_each_thread(g, c) copy_process() >>>> p->mm = mm >>>> smp_rmb(); smp_wmb() implied by alloc_pid() >>>> tmp = READ_ONCE(c->mm) list_add_tail_rcu(&p->thread_node, ...) > > For these two; what's the purpose of the smp_rmb()? which loads are > ordered?
(1) and (2) make visible g->flags and c->mm in case we see process is linked to the task list. It seems in mm_update_next_owner() we may see result of list_add_tail_rcu(&p->thread_node, ...), but p->mm = mm will not be visible. Hm, also I've dived into list_add_tail_rcu() and it contains smp_wmb(). So, it seems we do not need the barrier implied by alloc_pid(). Kirill