• Mathieu Desnoyers's avatar
    sched: fix exit_mm vs membarrier (v4) · 5bc78502
    Mathieu Desnoyers authored
    exit_mm should issue memory barriers after user-space memory accesses,
    before clearing current->mm, to order user-space memory accesses
    performed prior to exit_mm before clearing tsk->mm, which has the
    effect of skipping the membarrier private expedited IPIs.
    
    exit_mm should also update the runqueue's membarrier_state so
    membarrier global expedited IPIs are not sent when they are not
    needed.
    
    The membarrier system call can be issued concurrently with do_exit
    if we have thread groups created with CLONE_VM but not CLONE_THREAD.
    
    Here is the scenario I have in mind:
    
    Two thread groups are created, A and B. Thread group B is created by
    issuing clone from group A with flag CLONE_VM set, but not CLONE_THREAD.
    Let's assume we have a single thread within each thread group (Thread A
    and Thread B).
    
    The AFAIU we can have:
    
    Userspace variables:
    
    int x = 0, y = 0;
    
    CPU 0                   CPU 1
    Thread A                Thread B
    (in thread group A)     (in thread group B)
    
    x = 1
    barrier()
    y = 1
    exit()
    exit_mm()
    current->mm = NULL;
                            r1 = load y
                            membarrier()
                              skips CPU 0 (no IPI) because its current mm is NULL
                            r2 = load x
                            BUG_ON(r1 == 1 && r2 == 0)
    Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20201020134715.13909-2-mathieu.desnoyers@efficios.com
    5bc78502
exit.c 43.6 KB