• Li Zefan's avatar
    cpuset: fix a locking issue in cpuset_migrate_mm() · 47295830
    Li Zefan authored
    I can trigger a lockdep warning:
    
      # mount -t cgroup -o cpuset xxx /cgroup
      # mkdir /cgroup/cpuset
      # mkdir /cgroup/tmp
      # echo 0 > /cgroup/tmp/cpuset.cpus
      # echo 0 > /cgroup/tmp/cpuset.mems
      # echo 1 > /cgroup/tmp/cpuset.memory_migrate
      # echo $$ > /cgroup/tmp/tasks
      # echo 1 > /cgruop/tmp/cpuset.mems
    
      ===============================
      [ INFO: suspicious RCU usage. ]
      3.14.0-rc1-0.1-default+ #32 Not tainted
      -------------------------------
      include/linux/cgroup.h:682 suspicious rcu_dereference_check() usage!
      ...
        [<ffffffff81582174>] dump_stack+0x72/0x86
        [<ffffffff810b8f01>] lockdep_rcu_suspicious+0x101/0x140
        [<ffffffff81105ba1>] cpuset_migrate_mm+0xb1/0xe0
      ...
    
    We used to hold cgroup_mutex when calling cpuset_migrate_mm(), but now
    we hold cpuset_mutex, which causes task_css() to complain.
    
    This is not a false-positive but a real issue.
    
    Holding cpuset_mutex won't prevent a task from migrating to another
    cpuset, and it won't prevent the original task->cgroup from destroying
    during this change.
    
    Fixes: 5d21cc2d (cpuset: replace cgroup_mutex locking with cpuset internal locking)
    Cc: <stable@vger.kernel.org> # 3.9+
    Signed-off-by: default avatarLi Zefan <lizefan@huawei.com>
    Sigend-off-by: default avatarTejun Heo <tj@kernel.org>
    47295830
cpuset.c 76.7 KB