[RFC PATCH v4 22/28] sched: Turn EPOCH_PERIOD and EPOCH_OLD into tunnable debugfs

Chen Yu posted 28 patches 1 month, 3 weeks ago
[RFC PATCH v4 22/28] sched: Turn EPOCH_PERIOD and EPOCH_OLD into tunnable debugfs
Posted by Chen Yu 1 month, 3 weeks ago
Convert EPOCH_PERIOD and EPOCH_OLD into tunable debugfs
entries. Users can adjust the decay rate as needed.
By default, occupancy decays by half every 10 ms.

Suggested-by: Shrikanth Hegde <sshegde@linux.ibm.com>
Signed-off-by: Chen Yu <yu.c.chen@intel.com>
---
 kernel/sched/debug.c | 2 ++
 kernel/sched/fair.c  | 9 ++++++---
 kernel/sched/sched.h | 2 ++
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c
index 682fd91a42a0..7a9ec03704b9 100644
--- a/kernel/sched/debug.c
+++ b/kernel/sched/debug.c
@@ -535,6 +535,8 @@ static __init int sched_init_debug(void)
 #ifdef CONFIG_SCHED_CACHE
 	debugfs_create_u32("llc_aggr_cap", 0644, debugfs_sched, &sysctl_llc_aggr_cap);
 	debugfs_create_u32("llc_aggr_imb", 0644, debugfs_sched, &sysctl_llc_aggr_imb);
+	debugfs_create_u32("llc_period", 0644, debugfs_sched, &sysctl_llc_period);
+	debugfs_create_u32("llc_old", 0644, debugfs_sched, &sysctl_llc_old);
 #endif
 	debugfs_create_file("debug", 0444, debugfs_sched, NULL, &sched_debug_fops);
 
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 194ec594561b..64f757ad39fc 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -1175,6 +1175,9 @@ static s64 update_curr_se(struct rq *rq, struct sched_entity *curr)
 #define EPOCH_PERIOD	(HZ/100)	/* 10 ms */
 #define EPOCH_OLD	5		/* 50 ms */
 
+__read_mostly unsigned int sysctl_llc_period    = EPOCH_PERIOD;
+__read_mostly unsigned int sysctl_llc_old       = EPOCH_OLD;
+
 DEFINE_STATIC_KEY_FALSE(sched_cache_present);
 
 static int llc_id(int cpu)
@@ -1283,9 +1286,9 @@ static inline void __update_mm_sched(struct rq *rq, struct mm_sched *pcpu_sched)
 	long delta = now - rq->cpu_epoch_next;
 
 	if (delta > 0) {
-		n = (delta + EPOCH_PERIOD - 1) / EPOCH_PERIOD;
+		n = (delta + sysctl_llc_period - 1) / sysctl_llc_period;
 		rq->cpu_epoch += n;
-		rq->cpu_epoch_next += n * EPOCH_PERIOD;
+		rq->cpu_epoch_next += n * sysctl_llc_period;
 		__shr_u64(&rq->cpu_runtime, n);
 	}
 
@@ -1346,7 +1349,7 @@ void account_mm_sched(struct rq *rq, struct task_struct *p, s64 delta_exec)
 	 * has only 1 thread, invalidate
 	 * it's preferred state.
 	 */
-	if (epoch - READ_ONCE(mm->mm_sched_epoch) > EPOCH_OLD ||
+	if (epoch - READ_ONCE(mm->mm_sched_epoch) > sysctl_llc_old ||
 	    get_nr_threads(p) <= 1) {
 		mm->mm_sched_cpu = -1;
 		pcpu_sched->occ = 0;
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 3e60618a88e9..d752d64d4acd 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -2858,6 +2858,8 @@ extern unsigned int sysctl_numa_balancing_hot_threshold;
 extern unsigned int sysctl_llc_aggr_cap;
 extern unsigned int sysctl_llc_aggr_imb;
 extern struct static_key_false sched_cache_present;
+extern unsigned int sysctl_llc_period;
+extern unsigned int sysctl_llc_old;
 #endif
 
 #ifdef CONFIG_SCHED_HRTICK
-- 
2.25.1