From b6b9ecaecb7ddd2f7ff7e3ad8cfc4f5cee0c624c Mon Sep 17 00:00:00 2001 From: Shaleen Agrawal Date: Wed, 1 Sep 2021 17:32:14 -0700 Subject: [PATCH] sched: Improve the Scheduler This change is for general scheduler improvement. Change-Id: Id6818d7f79e8babb316aff3568cb65397df53c6f Signed-off-by: Abhijeet Dharmapurikar Signed-off-by: Shaleen Agrawal --- include/linux/sched/walt.h | 2 +- kernel/sched/walt/sysctl.c | 9 +++++++++ kernel/sched/walt/trace.h | 22 ++++++++++++++++++---- kernel/sched/walt/walt.c | 25 +++++++++++++++---------- kernel/sched/walt/walt.h | 2 ++ 5 files changed, 45 insertions(+), 15 deletions(-) diff --git a/include/linux/sched/walt.h b/include/linux/sched/walt.h index ec39456e2e8b..3d4106c4f4d9 100644 --- a/include/linux/sched/walt.h +++ b/include/linux/sched/walt.h @@ -43,7 +43,7 @@ struct walt_related_thread_group { struct rcu_head rcu; u64 last_update; u64 downmigrate_ts; - u64 start_ts; + u64 start_ktime_ts; }; struct walt_task_struct { diff --git a/kernel/sched/walt/sysctl.c b/kernel/sched/walt/sysctl.c index 85df1c2836dd..091990b4b98c 100644 --- a/kernel/sched/walt/sysctl.c +++ b/kernel/sched/walt/sysctl.c @@ -66,6 +66,7 @@ unsigned int sysctl_sched_bug_on_rt_throttle; unsigned int sysctl_panic_on_walt_bug; unsigned int sysctl_sched_suppress_region2; unsigned int sysctl_sched_skip_sp_newly_idle_lb = 1; +unsigned int sysctl_sched_hyst_min_coloc_ns = 80000000; /* range is [1 .. INT_MAX] */ static int sysctl_task_read_pid = 1; @@ -752,6 +753,14 @@ struct ctl_table walt_table[] = { .extra1 = SYSCTL_ZERO, .extra2 = SYSCTL_ONE, }, + { + .procname = "sched_hyst_min_coloc_ns", + .data = &sysctl_sched_hyst_min_coloc_ns, + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + }, { .procname = "panic_on_walt_bug", .data = &sysctl_panic_on_walt_bug, diff --git a/kernel/sched/walt/trace.h b/kernel/sched/walt/trace.h index aa7b56c95432..96f2cd1acfff 100644 --- a/kernel/sched/walt/trace.h +++ b/kernel/sched/walt/trace.h @@ -300,25 +300,39 @@ extern const char *migrate_type_names[]; TRACE_EVENT(sched_set_preferred_cluster, - TP_PROTO(struct walt_related_thread_group *grp, u64 total_demand), + TP_PROTO(struct walt_related_thread_group *grp, u64 total_demand, + bool prev_skip_min), - TP_ARGS(grp, total_demand), + TP_ARGS(grp, total_demand, prev_skip_min), TP_STRUCT__entry( __field(int, id) __field(u64, total_demand) __field(bool, skip_min) + __field(bool, prev_skip_min) + __field(u64, start_ktime_ts) + __field(u64, last_update) + __field(unsigned int, sysctl_sched_hyst_min_coloc_ns) + __field(u64, downmigrate_ts) ), TP_fast_assign( __entry->id = grp->id; __entry->total_demand = total_demand; __entry->skip_min = grp->skip_min; + __entry->prev_skip_min = prev_skip_min; + __entry->start_ktime_ts = grp->start_ktime_ts; + __entry->last_update = grp->last_update; + __entry->sysctl_sched_hyst_min_coloc_ns = sysctl_sched_hyst_min_coloc_ns; + __entry->downmigrate_ts = grp->downmigrate_ts; ), - TP_printk("group_id %d total_demand %llu skip_min %d", + TP_printk("group_id %d total_demand %llu skip_min %d prev_skip_min %d start_ktime_ts %llu last_update %llu min_coloc_ns %u downmigrate_ts %llu", __entry->id, __entry->total_demand, - __entry->skip_min) + __entry->skip_min, __entry->prev_skip_min, + __entry->start_ktime_ts, __entry->last_update, + __entry->sysctl_sched_hyst_min_coloc_ns, + __entry->downmigrate_ts) ); TRACE_EVENT(sched_migration_update_sum, diff --git a/kernel/sched/walt/walt.c b/kernel/sched/walt/walt.c index bad638335220..e8dad614e7f3 100644 --- a/kernel/sched/walt/walt.c +++ b/kernel/sched/walt/walt.c @@ -2693,7 +2693,7 @@ static DEFINE_RWLOCK(related_thread_group_lock); static inline void update_best_cluster(struct walt_related_thread_group *grp, - u64 demand, bool boost) + u64 combined_demand, bool boost) { if (boost) { /* @@ -2705,15 +2705,18 @@ void update_best_cluster(struct walt_related_thread_group *grp, } if (is_suh_max()) - demand = sched_group_upmigrate; + combined_demand = sched_group_upmigrate; if (!grp->skip_min) { - if (demand >= sched_group_upmigrate) + if (combined_demand >= sched_group_upmigrate) grp->skip_min = true; return; } - if (demand < sched_group_downmigrate) { - if (!sysctl_sched_coloc_downmigrate_ns) { + if (combined_demand < sched_group_downmigrate) { + if (!sysctl_sched_coloc_downmigrate_ns || + (grp->last_update - grp->start_ktime_ts) < + sysctl_sched_hyst_min_coloc_ns) { + grp->downmigrate_ts = 0; grp->skip_min = false; return; } @@ -2780,13 +2783,15 @@ static void _set_preferred_cluster(struct walt_related_thread_group *grp) grp->last_update = wallclock; update_best_cluster(grp, combined_demand, group_boost); - trace_sched_set_preferred_cluster(grp, combined_demand); out: + trace_sched_set_preferred_cluster(grp, combined_demand, prev_skip_min); if (grp->id == DEFAULT_CGROUP_COLOC_ID && grp->skip_min != prev_skip_min) { if (grp->skip_min) - grp->start_ts = sched_clock(); + grp->start_ktime_ts = wallclock; + else + grp->start_ktime_ts = 0; sched_update_hyst_times(); } } @@ -3297,12 +3302,12 @@ bool is_rtgb_active(void) u64 get_rtgb_active_time(void) { struct walt_related_thread_group *grp; - u64 now = sched_clock(); + u64 now = walt_ktime_get_ns(); grp = lookup_related_thread_group(DEFAULT_CGROUP_COLOC_ID); - if (grp && grp->skip_min && grp->start_ts) - return now - grp->start_ts; + if (grp && grp->skip_min && grp->start_ktime_ts) + return now - grp->start_ktime_ts; return 0; } diff --git a/kernel/sched/walt/walt.h b/kernel/sched/walt/walt.h index d6bd55f6e975..243d16a5138d 100644 --- a/kernel/sched/walt/walt.h +++ b/kernel/sched/walt/walt.h @@ -225,6 +225,8 @@ extern unsigned int sysctl_input_boost_freq[8]; extern unsigned int sysctl_sched_boost_on_input; extern unsigned int sysctl_sched_user_hint; extern unsigned int sysctl_sched_conservative_pl; +extern unsigned int sysctl_sched_hyst_min_coloc_ns; + #define WALT_MANY_WAKEUP_DEFAULT 1000 extern unsigned int sysctl_sched_many_wakeup_threshold; extern unsigned int sysctl_walt_rtg_cfs_boost_prio;