• David Rientjes's avatar
    cpusets: avoid looping when storing to mems_allowed if one node remains set · 89e8a244
    David Rientjes authored
    {get,put}_mems_allowed() exist so that general kernel code may locklessly
    access a task's set of allowable nodes without having the chance that a
    concurrent write will cause the nodemask to be empty on configurations
    where MAX_NUMNODES > BITS_PER_LONG.
    
    This could incur a significant delay, however, especially in low memory
    conditions because the page allocator is blocking and reclaim requires
    get_mems_allowed() itself.  It is not atypical to see writes to
    cpuset.mems take over 2 seconds to complete, for example.  In low memory
    conditions, this is problematic because it's one of the most imporant
    times to change cpuset.mems in the first place!
    
    The only way a task's set of allowable nodes may change is through cpusets
    by writing to cpuset.mems and when attaching a task to a generic code is
    not reading the nodemask with get_mems_allowed() at the same time, and
    then clearing all the old nodes.  This prevents the possibility that a
    reader will see an empty nodemask at the same time the writer is storing a
    new nodemask.
    
    If at least one node remains unchanged, though, it's possible to simply
    set all new nodes and then clear all the old nodes.  Changing a task's
    nodemask is protected by cgroup_mutex so it's guaranteed that two threads
    are not changing the same task's nodemask at the same time, so the
    nodemask is guaranteed to be stored before another thread changes it and
    determines whether a node remains set or not.
    Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
    Cc: Miao Xie <miaox@cn.fujitsu.com>
    Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    Cc: Nick Piggin <npiggin@kernel.dk>
    Cc: Paul Menage <paul@paulmenage.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    89e8a244
cpuset.c 74.3 KB