1 From f0cc749254d12c78e93dae3b27b21dc9546843d0 Mon Sep 17 00:00:00 2001
2 From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
3 Date: Sun, 11 Jun 2023 22:48:12 +0900
4 Subject: cgroup,freezer: hold cpu_hotplug_lock before freezer_mutex in freezer_css_{online,offline}()
6 From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
8 commit f0cc749254d12c78e93dae3b27b21dc9546843d0 upstream.
10 syzbot is again reporting circular locking dependency between
11 cpu_hotplug_lock and freezer_mutex. Do like what we did with
12 commit 57dcd64c7e036299 ("cgroup,freezer: hold cpu_hotplug_lock
13 before freezer_mutex").
15 Reported-by: syzbot <syzbot+2ab700fe1829880a2ec6@syzkaller.appspotmail.com>
16 Closes: https://syzkaller.appspot.com/bug?extid=2ab700fe1829880a2ec6
17 Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
18 Tested-by: syzbot <syzbot+2ab700fe1829880a2ec6@syzkaller.appspotmail.com>
19 Fixes: f5d39b020809 ("freezer,sched: Rewrite core freezer logic")
20 Cc: stable@vger.kernel.org # v6.1+
21 Signed-off-by: Tejun Heo <tj@kernel.org>
22 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
24 kernel/cgroup/legacy_freezer.c | 8 ++++++--
25 1 file changed, 6 insertions(+), 2 deletions(-)
27 --- a/kernel/cgroup/legacy_freezer.c
28 +++ b/kernel/cgroup/legacy_freezer.c
29 @@ -108,16 +108,18 @@ static int freezer_css_online(struct cgr
30 struct freezer *freezer = css_freezer(css);
31 struct freezer *parent = parent_freezer(freezer);
34 mutex_lock(&freezer_mutex);
36 freezer->state |= CGROUP_FREEZER_ONLINE;
38 if (parent && (parent->state & CGROUP_FREEZING)) {
39 freezer->state |= CGROUP_FREEZING_PARENT | CGROUP_FROZEN;
40 - static_branch_inc(&freezer_active);
41 + static_branch_inc_cpuslocked(&freezer_active);
44 mutex_unlock(&freezer_mutex);
49 @@ -132,14 +134,16 @@ static void freezer_css_offline(struct c
51 struct freezer *freezer = css_freezer(css);
54 mutex_lock(&freezer_mutex);
56 if (freezer->state & CGROUP_FREEZING)
57 - static_branch_dec(&freezer_active);
58 + static_branch_dec_cpuslocked(&freezer_active);
62 mutex_unlock(&freezer_mutex);
66 static void freezer_css_free(struct cgroup_subsys_state *css)