• Lee Schermerhorn's avatar
    mempolicy: write lock mmap_sem while changing task mempolicy · f4e53d91
    Lee Schermerhorn authored
    A read of /proc/<pid>/numa_maps holds the target task's mmap_sem for read
    while examining each vma's mempolicy.  A vma's mempolicy can fall back to the
    task's policy.  However, the task could be changing it's task policy and free
    the one that the show_numa_maps() is examining.
    
    To prevent this, grab the mmap_sem for write when updating task mempolicy.
    Pointed out to me by Christoph Lameter and extracted and reworked from
    Christoph's alternative mempol reference counting patch.
    
    This is analogous to the way that do_mbind() and do_get_mempolicy() prevent
    races between task's sharing an mm_struct [a.k.a.  threads] setting and
    querying a mempolicy for a particular address.
    
    Note: this is necessary, but not sufficient, to allow us to stop taking an
    extra reference on "other task's mempolicy" in get_vma_policy.  Subsequent
    patches will complete this update, allowing us to simplify the tests for
    whether we need to unref a mempolicy at various points in the code.
    Signed-off-by: default avatarLee Schermerhorn <lee.schermerhorn@hp.com>
    Cc: Christoph Lameter <clameter@sgi.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Mel Gorman <mel@csn.ul.ie>
    Cc: Andi Kleen <ak@suse.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f4e53d91
mempolicy.c 54.3 KB