From 826a343ded35009e39397c4c22795b3bdfe56ad5 Mon Sep 17 00:00:00 2001 From: Peng Wang Date: Tue, 28 Apr 2026 17:16:12 +0800 Subject: [PATCH] anolis: sched: support small value for sched_idle ANBZ: #31858 for sched_idle task,cpu.weight is scaled and can not be set to <10. support small value write. Signed-off-by: Peng Wang --- include/linux/sched/sysctl.h | 1 + kernel/sched/fair.c | 6 +++++- kernel/sysctl.c | 11 +++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index 5e9eb38d3058..6dc908ee837d 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h @@ -45,4 +45,5 @@ extern int sched_group_balancer_enable_handler(struct ctl_table *table, int writ extern unsigned int sysctl_sched_push_expellee_interval; #endif extern unsigned int sysctl_sched_idle_shares_relax; +extern unsigned int sysctl_sched_idle_shares_value; #endif /* _LINUX_SCHED_SYSCTL_H */ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 9b0b5ac4b399..9a6bfea589b6 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -85,6 +85,7 @@ static unsigned int normalized_sysctl_sched_base_slice = 700000ULL; unsigned int sysctl_sched_child_runs_first __read_mostly; unsigned int sysctl_sched_idle_shares_relax; +unsigned int sysctl_sched_idle_shares_value; const_debug unsigned int sysctl_sched_migration_cost = 500000UL; unsigned int sysctl_sched_id_book_cpu_nr_tries = 5; @@ -15363,8 +15364,11 @@ int sched_group_set_shares(struct task_group *tg, unsigned long shares) mutex_lock(&shares_mutex); if (tg_is_idle(tg) && !sysctl_sched_idle_shares_relax) ret = -EINVAL; - else + else { + if (tg_is_idle(tg) && sysctl_sched_idle_shares_value) + shares = scale_load((unsigned long)sysctl_sched_idle_shares_value); ret = __sched_group_set_shares(tg, shares); + } mutex_unlock(&shares_mutex); return ret; diff --git a/kernel/sysctl.c b/kernel/sysctl.c index cb9816a035a1..1a3bcc0cfd03 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1645,6 +1645,8 @@ int proc_do_static_key(struct ctl_table *table, int write, return ret; } +static int max_shares = 1 << 18; /* MAX_SHARES */ + static struct ctl_table kern_table[] = { { .procname = "panic", @@ -2211,6 +2213,15 @@ static struct ctl_table kern_table[] = { .extra1 = SYSCTL_ZERO, .extra2 = SYSCTL_ONE, }, + { + .procname = "sched_idle_shares_value", + .data = &sysctl_sched_idle_shares_value, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = &max_shares, + }, { } }; -- Gitee