diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 468427a25c9de48cc494b77193139d03cdfcc6d5..1f569c37a7dd5fb1c61aaf92a4c9e9459f1340b1 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -8569,6 +8569,13 @@ static inline int alloc_qos_sched_group(struct task_group *tg, #ifdef CONFIG_QOS_SCHED_SMT_EXPELLER tg->smt_expell = parent->smt_expell; #endif + tg->qos_level_mutex = kzalloc(sizeof(struct mutex), GFP_KERNEL); + + if (!tg->qos_level_mutex) + return 0; + + mutex_init(tg->qos_level_mutex); + return 1; } @@ -9512,6 +9519,7 @@ static int tg_change_scheduler(struct task_group *tg, void *data) s64 qos_level = *(s64 *)data; struct cgroup_subsys_state *css = &tg->css; + mutex_lock(tg->qos_level_mutex); tg->qos_level = qos_level; if (is_offline_level(qos_level)) policy = SCHED_IDLE; @@ -9529,6 +9537,7 @@ static int tg_change_scheduler(struct task_group *tg, void *data) sched_setscheduler(tsk, policy, ¶m); } css_task_iter_end(&it); + mutex_unlock(tg->qos_level_mutex); return 0; } diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 25f5fd2152228c720324d08fbf34e6bb5dfd5997..1797541d575b417e27807096a5fd02afedc71dff 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -12853,6 +12853,9 @@ void free_fair_sched_group(struct task_group *tg) kfree(tg->se[i]); } +#ifdef CONFIG_QOS_SCHED + kfree(tg->qos_level_mutex); +#endif kfree(tg->cfs_rq); kfree(tg->se); } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 0f871e9b169c598996dbe3177e49aba6d07e1f25..738c0ea74b46a1b10db480b4d8b6c7462ad13cea 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -466,7 +466,11 @@ struct task_group { #else KABI_RESERVE(2) #endif +#ifdef CONFIG_QOS_SCHED + KABI_USE(3, struct mutex *qos_level_mutex) +#else KABI_RESERVE(3) +#endif KABI_RESERVE(4) };