Skip to content

Commit

Permalink
ANDROID: cgroup: Fix bad merge of "Fix threadgroup_rwsem <-> cpus_rea…
Browse files Browse the repository at this point in the history
…d_lock() deadlock"

In commit 7e9fc61 ("Merge 5.10.143 into android13-5.10-lts")
the fix dee1e2b ("cgroup: Fix threadgroup_rwsem <->
cpus_read_lock() deadlock") was merged in.

However, it seems like the merge went awry and undid the
critical locking fix in cpuset_attach().

This causes lockdep to give the following splat:
[   35.132948] ============================================
[   35.132951] WARNING: possible recursive locking detected
[   35.132957] 5.10.157-android13-4-00001-g87c7751c5c84-dirty #1 Tainted: G           OE
[   35.132959] --------------------------------------------
[   35.132963] init/400 is trying to acquire lock:
[   35.132968] ffffffe936b8c0f0 (cpu_hotplug_lock){++++}-{0:0}, at: cpuset_attach+0x54/0x30c
[   35.132994] but task is already holding lock:
[   35.132997] ffffffe936b8c0f0 (cpu_hotplug_lock){++++}-{0:0}, at: cgroup_procs_write_start+0x98/0x28c
[   35.133016] other info that might help us debug this:
[   35.133018] Possible unsafe locking scenario:
[   35.133021] CPU0
[   35.133024] ----
[   35.133026] lock(cpu_hotplug_lock);
[   35.133033] lock(cpu_hotplug_lock);
[   35.133040]  *** DEADLOCK ***
[   35.133042] May be due to missing lock nesting notation
[   35.133046] 5 locks held by init/400:
[   35.133049] #0: ffffff880700a490 (sb_writers#9){.+.+}-{0:0}, at: vfs_write+0xc8/0x358
[   35.133073] #1: ffffff8804fdbc88 (&of->mutex){+.+.}-{4:4}, at: kernfs_fop_write_iter+0xc8/0x200
[   35.133093] #2: ffffffe936c15488 (cgroup_mutex){+.+.}-{4:4}, at: cgroup_kn_lock_live+0x80/0xe8
[   35.133112] #3: ffffffe936b8c0f0 (cpu_hotplug_lock){++++}-{0:0}, at: cgroup_procs_write_start+0x98/0x28c
[   35.133128] #4: ffffffe936c15610 (cgroup_threadgroup_rwsem){++++}-{0:0}, at: cgroup_procs_write_start+0xa8/0x28c
[   35.133149] stack backtrace:
[   35.133155] CPU: 3 PID: 400 Comm: init Tainted: G           OE     5.10.157-android13-4-00001-g87c7751c5c84-dirty #1
[   35.133159] Hardware name: Oriole DVT (DT)
[   35.133162] Call trace:
[   35.133171] dump_backtrace.cfi_jt+0x0/0x8
[   35.133178] show_stack+0x1c/0x2c
[   35.133186] dump_stack_lvl+0xe0/0x17c
[   35.133193] __lock_acquire+0x5e4/0x2fb4
[   35.133197] lock_acquire+0x100/0x210
[   35.133205] cpus_read_lock+0x7c/0x1b0
[   35.133210] cpuset_attach+0x54/0x30c
[   35.133215] cgroup_migrate_execute+0x2e4/0x568
[   35.133221] cgroup_migrate+0x104/0x120
[   35.133226] cgroup_attach_task+0x204/0x2b8
[   35.133233] __cgroup1_procs_write+0x104/0x1bc
[   35.133239] cgroup1_procs_write+0x18/0x28
[   35.133243] cgroup_file_write+0xac/0x308
[   35.133248] kernfs_fop_write_iter+0x134/0x200
[   35.133252] vfs_write+0x2e4/0x358
[   35.133256] ksys_write+0x7c/0xec
[   35.133261] __arm64_sys_write+0x20/0x30
[   35.133269] el0_svc_common.llvm.12320387402837011898+0xd4/0x1ec
[   35.133273] do_el0_svc+0x28/0xa0
[   35.133280] el0_svc+0x24/0x38
[   35.133285] el0_sync_handler+0x88/0xec
[   35.133292] el0_sync+0x1b4/0x1c0

So this patch tries to fix that merge by including the dropped
changes.

Original upstream commit: 4f7e723

Cc: Greg Kroah-Hartman <gregkh@google.com>
Bug: 287147292
Fixes: f5094ec ("Merge 5.10.150 into android13-5.10-lts")
Signed-off-by: John Stultz <jstultz@google.com>
Change-Id: Iaadcdc76ed9470bf02e352a5ea8b0f254a1df976
  • Loading branch information
johnstultz-work committed Sep 8, 2023
1 parent 7a7749b commit 6140a0c
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 3 deletions.
1 change: 0 additions & 1 deletion kernel/cgroup/cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -2851,7 +2851,6 @@ int cgroup_attach_task(struct cgroup *dst_cgrp, struct task_struct *leader,
struct task_struct *cgroup_procs_write_start(char *buf, bool threadgroup,
bool *threadgroup_locked,
struct cgroup *dst_cgrp)
__acquires(&cgroup_threadgroup_rwsem)
{
struct task_struct *tsk;
pid_t pid;
Expand Down
3 changes: 1 addition & 2 deletions kernel/cgroup/cpuset.c
Original file line number Diff line number Diff line change
Expand Up @@ -2252,7 +2252,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)
cgroup_taskset_first(tset, &css);
cs = css_cs(css);

cpus_read_lock();
lockdep_assert_cpus_held(); /* see cgroup_attach_lock() */
mutex_lock(&cpuset_mutex);

guarantee_online_mems(cs, &cpuset_attach_nodemask_to);
Expand Down Expand Up @@ -2306,7 +2306,6 @@ static void cpuset_attach(struct cgroup_taskset *tset)
wake_up(&cpuset_attach_wq);

mutex_unlock(&cpuset_mutex);
cpus_read_unlock();
}

/* The various types of files and directories in a cpuset file system */
Expand Down

0 comments on commit 6140a0c

Please sign in to comment.