From 1d29740b604cb17354ea038f97293d8b4b65d755 Mon Sep 17 00:00:00 2001 From: Zheng Zucheng Date: Mon, 29 Nov 2021 15:12:36 +0800 Subject: [PATCH] sched: Fix throttle offline task trigger panic hulk inclusion category: bugfix bugzilla: 51828, https://gitee.com/openeuler/kernel/issues/I4K96G CVE: NA -------------------------------- offline task invokes sched_setscheduler interface to change the scheduling policy to SCHED_OTHER, trigger a system panic. Signed-off-by: Zheng Zucheng Reviewed-by: Chen Hui Reviewed-by: Xiu Jianfeng Signed-off-by: Yang Yingliang --- kernel/sched/core.c | 12 ++++++++++++ kernel/sched/fair.c | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 1e8fca9b53d8..155391164de1 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -4333,6 +4333,18 @@ static int __sched_setscheduler(struct task_struct *p, } change: +#ifdef CONFIG_QOS_SCHED + /* + * If the scheduling policy of an offline task is set to a policy + * other than SCHED_IDLE, the online task preemption will be invalid, + * so return -EINVAL in this case. + */ + if (unlikely(task_group(p)->qos_level == -1 && !idle_policy(policy))) { + task_rq_unlock(rq, p, &rf); + return -EINVAL; + } +#endif + if (user) { #ifdef CONFIG_RT_GROUP_SCHED /* diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 01ae00776037..1dd1e34f3d59 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -6991,7 +6991,8 @@ static bool check_qos_cfs_rq(struct cfs_rq *cfs_rq) return false; if (cfs_rq && cfs_rq->tg->qos_level < 0 && - !sched_idle_cpu(cpu_of(rq_of(cfs_rq)))) { + !sched_idle_cpu(cpu_of(rq_of(cfs_rq))) && + cfs_rq->h_nr_running == cfs_rq->idle_h_nr_running) { throttle_qos_cfs_rq(cfs_rq); return true; } -- GitLab