[RFC PATCH v1 11/11] sched/idle: Add a tuning knob to allow changing fast idle threshold

Aubrey Li
2017-07-10T01:49:18Z

From: Aubrey Li <aubrey.li@linux.intel.com>

Short idle periods varies from different workload, make the switch
tunable
---
include/linux/sched/sysctl.h | 1 +
kernel/sched/idle.c | 5 +++--
kernel/sysctl.c | 10 ++++++++++
3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
index 0f5ecd4..9771506 100644
--- a/include/linux/sched/sysctl.h
+++ b/include/linux/sched/sysctl.h
@@ -65,6 +65,7 @@ extern unsigned int sysctl_sched_autogroup_enabled;

extern int sysctl_sched_rr_timeslice;
extern int sched_rr_timeslice;
+extern unsigned int sysctl_fast_idle_threshold;

extern int sched_rr_handler(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp,
diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
index 3358db2..555b02d 100644
--- a/kernel/sched/idle.c
+++ b/kernel/sched/idle.c
@@ -287,6 +287,8 @@ static void cpuidle_generic(void)
tick_nohz_idle_exit();
}

+unsigned int sysctl_fast_idle_threshold = USEC_PER_SEC / HZ / 2;
+
/*
* Generic idle loop implementation
*
@@ -295,7 +297,6 @@ static void cpuidle_generic(void)
static void do_idle(void)
{
unsigned int predicted_idle_us;
- unsigned int short_idle_threshold = jiffies_to_usecs(1) / 2;
/*
* If the arch has a polling bit, we maintain an invariant:
*
@@ -309,7 +310,7 @@ static void do_idle(void)

predicted_idle_us = cpuidle_predict();

- if (likely(predicted_idle_us < short_idle_threshold))
+ if (likely(predicted_idle_us < sysctl_fast_idle_threshold))
cpuidle_fast();
else
cpuidle_generic();
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 8c8714f..0acf81d 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -128,6 +128,7 @@ static int __maybe_unused four = 4;
static unsigned long one_ul = 1;
static int one_hundred = 100;
static int one_thousand = 1000;
+static int one_tick_to_us = USEC_PER_SEC / HZ;
#ifdef CONFIG_PRINTK
static int ten_thousand = 10000;
#endif
@@ -1201,6 +1202,15 @@ static struct ctl_table kern_table[] = {
.extra2 = &one,
},
#endif
+ {
+ .procname = "sched_fast_idle_threshold",
+ .data = &sysctl_fast_idle_threshold,
+ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec_minmax,
+ .extra1 = &zero,
+ .extra2 = &one_tick_to_us,
+ },
{ }
};

--
2.7.4