diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index 5e9eb38d3058316698d81f795498dbc902bd9c78..6dc908ee837d7cddc3727b67054745ac6e246b7d 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 9b0b5ac4b3991a43e61c40af3ce446a94c8c92df..9a6bfea589b662a08f7da8d2602b8c8cd97572dd 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 cb9816a035a16e6accbb5b8b39fd2cbb7a8a7433..1a3bcc0cfd03ce4af6060a655baae4149c0e72eb 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, + }, { } };