mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
cgroup,freezer: hold cpu_hotplug_lock before freezer_mutex in freezer_css_{online,offline}()
syzbot is again reporting circular locking dependency between cpu_hotplug_lock and freezer_mutex. Do like what we did with commit57dcd64c7e
("cgroup,freezer: hold cpu_hotplug_lock before freezer_mutex"). Reported-by: syzbot <syzbot+2ab700fe1829880a2ec6@syzkaller.appspotmail.com> Closes: https://syzkaller.appspot.com/bug?extid=2ab700fe1829880a2ec6 Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Tested-by: syzbot <syzbot+2ab700fe1829880a2ec6@syzkaller.appspotmail.com> Fixes:f5d39b0208
("freezer,sched: Rewrite core freezer logic") Cc: stable@vger.kernel.org # v6.1+ Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
@@ -108,16 +108,18 @@ static int freezer_css_online(struct cgroup_subsys_state *css)
|
|||||||
struct freezer *freezer = css_freezer(css);
|
struct freezer *freezer = css_freezer(css);
|
||||||
struct freezer *parent = parent_freezer(freezer);
|
struct freezer *parent = parent_freezer(freezer);
|
||||||
|
|
||||||
|
cpus_read_lock();
|
||||||
mutex_lock(&freezer_mutex);
|
mutex_lock(&freezer_mutex);
|
||||||
|
|
||||||
freezer->state |= CGROUP_FREEZER_ONLINE;
|
freezer->state |= CGROUP_FREEZER_ONLINE;
|
||||||
|
|
||||||
if (parent && (parent->state & CGROUP_FREEZING)) {
|
if (parent && (parent->state & CGROUP_FREEZING)) {
|
||||||
freezer->state |= CGROUP_FREEZING_PARENT | CGROUP_FROZEN;
|
freezer->state |= CGROUP_FREEZING_PARENT | CGROUP_FROZEN;
|
||||||
static_branch_inc(&freezer_active);
|
static_branch_inc_cpuslocked(&freezer_active);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&freezer_mutex);
|
mutex_unlock(&freezer_mutex);
|
||||||
|
cpus_read_unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,14 +134,16 @@ static void freezer_css_offline(struct cgroup_subsys_state *css)
|
|||||||
{
|
{
|
||||||
struct freezer *freezer = css_freezer(css);
|
struct freezer *freezer = css_freezer(css);
|
||||||
|
|
||||||
|
cpus_read_lock();
|
||||||
mutex_lock(&freezer_mutex);
|
mutex_lock(&freezer_mutex);
|
||||||
|
|
||||||
if (freezer->state & CGROUP_FREEZING)
|
if (freezer->state & CGROUP_FREEZING)
|
||||||
static_branch_dec(&freezer_active);
|
static_branch_dec_cpuslocked(&freezer_active);
|
||||||
|
|
||||||
freezer->state = 0;
|
freezer->state = 0;
|
||||||
|
|
||||||
mutex_unlock(&freezer_mutex);
|
mutex_unlock(&freezer_mutex);
|
||||||
|
cpus_read_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freezer_css_free(struct cgroup_subsys_state *css)
|
static void freezer_css_free(struct cgroup_subsys_state *css)
|
||||||
|
Reference in New Issue
Block a user