diff options
-rw-r--r-- | include/linux/sched/sysctl.h | 1 | ||||
-rw-r--r-- | kernel/sched/hmp.c | 5 | ||||
-rw-r--r-- | kernel/sched/sched.h | 3 | ||||
-rw-r--r-- | kernel/sysctl.c | 7 |
4 files changed, 14 insertions, 2 deletions
diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index a1bf22116cce..0538de6dfb6f 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h @@ -73,6 +73,7 @@ extern unsigned int sysctl_sched_enable_thread_grouping; extern unsigned int sysctl_sched_freq_aggregate_threshold_pct; extern unsigned int sysctl_sched_prefer_sync_wakee_to_waker; extern unsigned int sysctl_sched_short_burst; +extern unsigned int sysctl_sched_short_sleep; #else /* CONFIG_SCHED_HMP */ diff --git a/kernel/sched/hmp.c b/kernel/sched/hmp.c index 158fc748873b..652e19ea7bb0 100644 --- a/kernel/sched/hmp.c +++ b/kernel/sched/hmp.c @@ -959,9 +959,12 @@ unsigned int __read_mostly sysctl_sched_restrict_cluster_spill; /* * Scheduler tries to avoid waking up idle CPUs for tasks running * in short bursts. If the task average burst is less than - * sysctl_sched_short_burst nanoseconds, it is eligible for packing. + * sysctl_sched_short_burst nanoseconds and it sleeps on an average + * for more than sysctl_sched_short_sleep nanoseconds, then the + * task is eligible for packing. */ unsigned int __read_mostly sysctl_sched_short_burst; +unsigned int __read_mostly sysctl_sched_short_sleep = 1 * NSEC_PER_MSEC; static void _update_up_down_migrate(unsigned int *up_migrate, unsigned int *down_migrate) diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 5f23462f3a60..afccfd0878b1 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1420,7 +1420,8 @@ static inline u64 cpu_cravg_sync(int cpu, int sync) static inline bool is_short_burst_task(struct task_struct *p) { - return p->ravg.avg_burst < sysctl_sched_short_burst; + return p->ravg.avg_burst < sysctl_sched_short_burst && + p->ravg.avg_sleep_time > sysctl_sched_short_sleep; } extern void check_for_migration(struct rq *rq, struct task_struct *p); diff --git a/kernel/sysctl.c b/kernel/sysctl.c index ba69f4c96d7c..12ea4f09c04b 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -514,6 +514,13 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, + { + .procname = "sched_short_sleep_ns", + .data = &sysctl_sched_short_sleep, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, #endif /* CONFIG_SCHED_HMP */ #ifdef CONFIG_SCHED_DEBUG { |