• Zefan Li's avatar
    cpuset: PF_SPREAD_PAGE and PF_SPREAD_SLAB should be atomic flags · 2ad654bc
    Zefan Li authored
    When we change cpuset.memory_spread_{page,slab}, cpuset will flip
    PF_SPREAD_{PAGE,SLAB} bit of tsk->flags for each task in that cpuset.
    This should be done using atomic bitops, but currently we don't,
    which is broken.
    
    Tetsuo reported a hard-to-reproduce kernel crash on RHEL6, which happened
    when one thread tried to clear PF_USED_MATH while at the same time another
    thread tried to flip PF_SPREAD_PAGE/PF_SPREAD_SLAB. They both operate on
    the same task.
    
    Here's the full report:
    https://lkml.org/lkml/2014/9/19/230
    
    To fix this, we make PF_SPREAD_PAGE and PF_SPREAD_SLAB atomic flags.
    
    v4:
    - updated mm/slab.c. (Fengguang Wu)
    - updated Documentation.
    
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Miao Xie <miaox@cn.fujitsu.com>
    Cc: Kees Cook <keescook@chromium.org>
    Fixes: 950592f7 ("cpusets: update tasks' page/slab spread flags in time")
    Cc: <stable@vger.kernel.org> # 2.6.31+
    Reported-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Signed-off-by: default avatarZefan Li <lizefan@huawei.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    2ad654bc
cpuset.c 77.8 KB