diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index a5e3f8a365e6..464d0e429ff9 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c @@ -642,6 +642,7 @@ static const char *cgroup_mode_str[] = { "smp", "concur", "max", + "tasks", }; static int sched_cgroup_mode(const char *str) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 64181e49b20f..4a204eb4f9e6 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -4851,6 +4851,19 @@ static inline int tg_tasks(struct task_group *tg) return max(1, atomic_long_read(&tg->runnable_avg) >> SCHED_CAPACITY_SHIFT); } +/* + * Func: fraction(nr_tasks * tg->shares) + * + * Scale tg->shares by the number of tasks. + */ +static long calc_tasks_shares(struct cfs_rq *cfs_rq) +{ + struct task_group *tg = cfs_rq->tg; + int nr = tg_tasks(tg); + long tg_shares = READ_ONCE(tg->shares); + return __calc_smp_shares(cfs_rq, nr * tg_shares, nr * tg_shares); +} + /* * Func: min(fraction(nr_cpus * tg->shares), nice -20) * @@ -4921,6 +4934,9 @@ void __sched_cgroup_mode_update(int mode) case 3: func = &calc_max_shares; break; + case 4: + func = &calc_tasks_shares; + break; } static_call_update(calc_group_shares, func); }