lkml.org 
[lkml]   [2015]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 06/12] x86/mm: Enable and use the arch_pgd_init_late() method

* Oleg Nesterov <oleg@redhat.com> wrote:

> On 06/11, Ingo Molnar wrote:
> >
> > +void arch_pgd_init_late(struct mm_struct *mm, pgd_t *pgd)
> > +{
> > + /*
> > + * This is called after a new MM has been made visible
> > + * in fork() or exec().
> > + *
> > + * This barrier makes sure the MM is visible to new RCU
> > + * walkers before we initialize it, so that we don't miss
> > + * updates:
> > + */
> > + smp_wmb();
>
> I can't understand the comment and the barrier...
>
> Afaics, we need to ensure that:
>
> > + if (pgd_val(*pgd_src))
> > + WRITE_ONCE(*pgd_dst, *pgd_src);
>
> either we notice the recent update of this PGD, or (say) the subsequent
> sync_global_pgds() can miss the child.
>
> How the write barrier can help?

So the real thing this pairs with is the earlier:

tsk->mm = mm;

plus the linking of the new task in the task list.

_that_ write must become visible to others before we do the (conditional) copy
ourselves.

Granted, it happens quite a bit earlier, and the task linking's use of locking is
a natural barrier - but since this is lockless I didn't want to leave a silent
assumption in.

Perhaps remove the barrier and just leave a comment in that describes the
assumption on task-linking being a full barrier?

Thanks,

Ingo


\
 
 \ /
  Last update: 2015-06-13 09:41    [W:0.084 / U:0.048 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site