Patch "cgroup: fix missing cpus_read_{lock,unlock}() in cgroup_transfer_tasks()" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    cgroup: fix missing cpus_read_{lock,unlock}() in cgroup_transfer_tasks()

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     cgroup-fix-missing-cpus_read_-lock-unlock-in-cgroup_.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f4468345ce48cebe2e72d418e477538ec17b5935
Author: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx>
Date:   Wed May 17 07:45:45 2023 +0000

    cgroup: fix missing cpus_read_{lock,unlock}() in cgroup_transfer_tasks()
    
    [ Upstream commit ab1de7ead871ebe6d12a774c3c25de0388cde082 ]
    
    The commit 4f7e7236435c ("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: Zhao Gongyi <zhaogongyi@xxxxxxxxxxxxx>
    Signed-off-by: Qi Zheng <zhengqi.arch@xxxxxxxxxxxxx>
    Acked-by: Muchun Song <songmuchun@xxxxxxxxxxxxx>
    Fixes: 05c7b7a92cc8 ("cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug")
    Cc: stable@xxxxxxxxxxxxxxx # v5.17+
    Signed-off-by: Tejun Heo <tj@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index aeef06c465ef1..5407241dbb45f 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c
@@ -108,7 +108,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
 
 	cgroup_lock();
 
-	percpu_down_write(&cgroup_threadgroup_rwsem);
+	cgroup_attach_lock(true);
 
 	/* all tasks in @from are being moved, all csets are source */
 	spin_lock_irq(&css_set_lock);
@@ -144,7 +144,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
 	} while (task && !ret);
 out_err:
 	cgroup_migrate_finish(&mgctx);
-	percpu_up_write(&cgroup_threadgroup_rwsem);
+	cgroup_attach_unlock(true);
 	cgroup_unlock();
 	return ret;
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux