• Qi Zheng's avatar
    cgroup: fix missing cpus_read_{lock,unlock}() in cgroup_transfer_tasks() · ab1de7ea
    Qi Zheng authored
    The commit 4f7e7236 ("cgroup: Fix threadgroup_rwsem <-> cpus_read_lock()
    deadlock") fixed the deadlock between cgroup_threadgroup_rwsem and
    cpus_read_lock() by introducing cgroup_attach_{lock,unlock}() and removing
    cpus_read_{lock,unlock}() from cpuset_attach(). But cgroup_transfer_tasks()
    was missed and not handled, which will cause th following warning:
    
     WARNING: CPU: 0 PID: 589 at kernel/cpu.c:526 lockdep_assert_cpus_held+0x32/0x40
     CPU: 0 PID: 589 Comm: kworker/1:4 Not tainted 6.4.0-rc2-next-20230517 #50
     Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-2 04/01/2014
     Workqueue: events cpuset_hotplug_workfn
     RIP: 0010:lockdep_assert_cpus_held+0x32/0x40
     <...>
     Call Trace:
      <TASK>
      cpuset_attach+0x40/0x240
      cgroup_migrate_execute+0x452/0x5e0
      ? _raw_spin_unlock_irq+0x28/0x40
      cgroup_transfer_tasks+0x1f3/0x360
      ? find_held_lock+0x32/0x90
      ? cpuset_hotplug_workfn+0xc81/0xed0
      cpuset_hotplug_workfn+0xcb1/0xed0
      ? process_one_work+0x248/0x5b0
      process_one_work+0x2b9/0x5b0
      worker_thread+0x56/0x3b0
      ? process_one_work+0x5b0/0x5b0
      kthread+0xf1/0x120
      ? kthread_complete_and_exit+0x20/0x20
      ret_from_fork+0x1f/0x30
      </TASK>
    
    So just use the cgroup_attach_{lock,unlock}() helper to fix it.
    Reported-by: default avatarZhao Gongyi <zhaogongyi@bytedance.com>
    Signed-off-by: default avatarQi Zheng <zhengqi.arch@bytedance.com>
    Acked-by: default avatarMuchun Song <songmuchun@bytedance.com>
    Fixes: 05c7b7a9 ("cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug")
    Cc: stable@vger.kernel.org # v5.17+
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    ab1de7ea
cgroup-v1.c 34.1 KB