sched: Improve the Scheduler

This change is for general scheduler improvement.

Change-Id: Id6818d7f79e8babb316aff3568cb65397df53c6f
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
Signed-off-by: Shaleen Agrawal <shalagra@codeaurora.org>
This commit is contained in:
Shaleen Agrawal 2021-09-01 17:32:14 -07:00 committed by Rishabh Bhatnagar
parent 0808e3fa4d
commit b6b9ecaecb
5 changed files with 45 additions and 15 deletions

View File

@ -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 {

View File

@ -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,

View File

@ -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,

View File

@ -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;
}

View File

@ -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;