diff --git a/kernel/sched/walt/trace.h b/kernel/sched/walt/trace.h index 7a4d8ace0d30..0a53034c6917 100644 --- a/kernel/sched/walt/trace.h +++ b/kernel/sched/walt/trace.h @@ -881,9 +881,11 @@ TRACE_EVENT(sched_cpu_util, __field(int, reserved) __field(int, high_irq_load) __field(unsigned int, nr_rtg_high_prio_tasks) + __field(u64, prs_gprs) ), TP_fast_assign( + struct walt_rq *wrq = (struct walt_rq *) cpu_rq(cpu)->android_vendor_data1; __entry->cpu = cpu; __entry->nr_running = cpu_rq(cpu)->nr_running; __entry->cpu_util = cpu_util(cpu); @@ -898,15 +900,16 @@ TRACE_EVENT(sched_cpu_util, __entry->reserved = is_reserved(cpu); __entry->high_irq_load = sched_cpu_high_irqload(cpu); __entry->nr_rtg_high_prio_tasks = walt_nr_rtg_high_prio(cpu); + __entry->prs_gprs = wrq->prev_runnable_sum + wrq->grp_time.prev_runnable_sum; ), - TP_printk("cpu=%d nr_running=%d cpu_util=%ld cpu_util_cum=%ld capacity_curr=%u capacity=%u capacity_orig=%u idle_exit_latency=%u irqload=%llu online=%u, inactive=%u, reserved=%u, high_irq_load=%u nr_rtg_hp=%u", + TP_printk("cpu=%d nr_running=%d cpu_util=%ld cpu_util_cum=%ld capacity_curr=%u capacity=%u capacity_orig=%u idle_exit_latency=%u irqload=%llu online=%u, inactive=%u, reserved=%u, high_irq_load=%u nr_rtg_hp=%u prs_gprs=%llu", __entry->cpu, __entry->nr_running, __entry->cpu_util, __entry->cpu_util_cum, __entry->capacity_curr, __entry->capacity, __entry->capacity_orig, __entry->idle_exit_latency, __entry->irqload, __entry->online, __entry->inactive, __entry->reserved, __entry->high_irq_load, - __entry->nr_rtg_high_prio_tasks) + __entry->nr_rtg_high_prio_tasks, __entry->prs_gprs) ); TRACE_EVENT(sched_compute_energy, @@ -915,10 +918,11 @@ TRACE_EVENT(sched_compute_energy, unsigned long eval_energy, unsigned long prev_energy, unsigned long best_energy, - unsigned long best_energy_cpu), + unsigned long best_energy_cpu, + struct compute_energy_output *o), TP_ARGS(p, eval_cpu, eval_energy, prev_energy, best_energy, - best_energy_cpu), + best_energy_cpu, o), TP_STRUCT__entry( __field(int, pid) @@ -930,6 +934,18 @@ TRACE_EVENT(sched_compute_energy, __field(unsigned long, eval_energy) __field(int, best_energy_cpu) __field(unsigned long, best_energy) + __field(unsigned int, cluster_first_cpu0) + __field(unsigned int, cluster_first_cpu1) + __field(unsigned int, cluster_first_cpu2) + __field(unsigned long, s0) + __field(unsigned long, s1) + __field(unsigned long, s2) + __field(unsigned long, m0) + __field(unsigned long, m1) + __field(unsigned long, m2) + __field(u16, c0) + __field(u16, c1) + __field(u16, c2) ), TP_fast_assign( @@ -942,12 +958,27 @@ TRACE_EVENT(sched_compute_energy, __entry->eval_energy = eval_energy; __entry->best_energy_cpu = best_energy_cpu; __entry->best_energy = best_energy; + __entry->cluster_first_cpu0 = o->cluster_first_cpu[0]; + __entry->cluster_first_cpu1 = o->cluster_first_cpu[1]; + __entry->cluster_first_cpu2 = o->cluster_first_cpu[2]; + __entry->s0 = o->sum_util[0]; + __entry->s1 = o->sum_util[1]; + __entry->s2 = o->sum_util[2]; + __entry->m0 = o->max_util[0]; + __entry->m1 = o->max_util[1]; + __entry->m2 = o->max_util[2]; + __entry->c0 = o->cost[0]; + __entry->c1 = o->cost[1]; + __entry->c2 = o->cost[2]; ), - TP_printk("pid=%d comm=%s util=%lu prev_cpu=%d prev_energy=%lu eval_cpu=%d eval_energy=%lu best_energy_cpu=%d best_energy=%lu", + TP_printk("pid=%d comm=%s util=%lu prev_cpu=%d prev_energy=%lu eval_cpu=%d eval_energy=%lu best_energy_cpu=%d best_energy=%lu, fcpu s m c = %u %u %u %u, %u %u %u %u, %u %u %u %u", __entry->pid, __entry->comm, __entry->util, __entry->prev_cpu, __entry->prev_energy, __entry->eval_cpu, __entry->eval_energy, - __entry->best_energy_cpu, __entry->best_energy) + __entry->best_energy_cpu, __entry->best_energy, + __entry->cluster_first_cpu0, __entry->s0, __entry->m0, __entry->c0, + __entry->cluster_first_cpu1, __entry->s1, __entry->m1, __entry->c1, + __entry->cluster_first_cpu2, __entry->s2, __entry->m2, __entry->c2) ) TRACE_EVENT(sched_task_util, diff --git a/kernel/sched/walt/walt.h b/kernel/sched/walt/walt.h index 5a5e643b9aa3..f1dca89e2f0e 100644 --- a/kernel/sched/walt/walt.h +++ b/kernel/sched/walt/walt.h @@ -894,4 +894,10 @@ extern __read_mostly unsigned int walt_scale_demand_divisor; #define scale_demand(d) ((d)/walt_scale_demand_divisor) void create_util_to_cost(void); +struct compute_energy_output { + unsigned long sum_util[MAX_CLUSTERS]; + unsigned long max_util[MAX_CLUSTERS]; + u16 cost[MAX_CLUSTERS]; + unsigned int cluster_first_cpu[MAX_CLUSTERS]; +}; #endif /* _WALT_H */ diff --git a/kernel/sched/walt/walt_cfs.c b/kernel/sched/walt/walt_cfs.c index 2a06a0c3c19b..0839c90c72bb 100644 --- a/kernel/sched/walt/walt_cfs.c +++ b/kernel/sched/walt/walt_cfs.c @@ -497,7 +497,8 @@ cpu_util_next_walt_prs(int cpu, struct task_struct *p, int dst_cpu, bool prev_ds * a capacity state satisfying the max utilization of the domain. */ static inline unsigned long walt_em_cpu_energy(struct em_perf_domain *pd, - unsigned long max_util, unsigned long sum_util) + unsigned long max_util, unsigned long sum_util, + struct compute_energy_output *output, unsigned int x) { unsigned long scale_cpu; int cpu; @@ -563,6 +564,12 @@ static inline unsigned long walt_em_cpu_energy(struct em_perf_domain *pd, max_util = 1023; wrq = (struct walt_rq *) cpu_rq(cpu)->android_vendor_data1; + + if (output) { + output->cost[x] = wrq->cluster->util_to_cost[max_util]; + output->max_util[x] = max_util; + output->sum_util[x] = sum_util; + } return wrq->cluster->util_to_cost[max_util] * sum_util / scale_cpu; } @@ -574,7 +581,8 @@ static inline unsigned long walt_em_cpu_energy(struct em_perf_domain *pd, * task. */ static long -walt_pd_compute_energy(struct task_struct *p, int dst_cpu, struct perf_domain *pd, u64 *prs) +walt_pd_compute_energy(struct task_struct *p, int dst_cpu, struct perf_domain *pd, u64 *prs, + struct compute_energy_output *output, unsigned int x) { struct cpumask *pd_mask = perf_domain_span(pd); unsigned long max_util = 0, sum_util = 0; @@ -602,21 +610,28 @@ walt_pd_compute_energy(struct task_struct *p, int dst_cpu, struct perf_domain *p max_util = scale_demand(max_util); sum_util = scale_demand(sum_util); - return walt_em_cpu_energy(pd->em_pd, max_util, sum_util); + + if (output) + output->cluster_first_cpu[x] = cpumask_first(pd_mask); + + return walt_em_cpu_energy(pd->em_pd, max_util, sum_util, output, x); } static inline long walt_compute_energy(struct task_struct *p, int dst_cpu, struct perf_domain *pd, - cpumask_t *candidates, u64 *prs) + cpumask_t *candidates, u64 *prs, struct compute_energy_output *output) { long energy = 0; + unsigned int x = 0; for (; pd; pd = pd->next) { struct cpumask *pd_mask = perf_domain_span(pd); if (cpumask_intersects(candidates, pd_mask) - || cpumask_test_cpu(task_cpu(p), pd_mask)) - energy += walt_pd_compute_energy(p, dst_cpu, pd, prs); + || cpumask_test_cpu(task_cpu(p), pd_mask)) { + energy += walt_pd_compute_energy(p, dst_cpu, pd, prs, output, x); + x++; + } } return energy; @@ -673,6 +688,7 @@ int walt_find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, int start_cpu, order_index, end_index; int max_cap_cpu = -1; bool energy_eval_needed = true; + struct compute_energy_output output; if (walt_is_many_wakeup(sibling_count_hint) && prev_cpu != cpu && cpumask_test_cpu(prev_cpu, &p->cpus_mask)) @@ -750,20 +766,38 @@ int walt_find_energy_efficient_cpu(struct task_struct *p, int prev_cpu, if (p->state == TASK_WAKING) delta = task_util(p); - if (cpumask_test_cpu(prev_cpu, &p->cpus_mask) && !__cpu_overutilized(prev_cpu, delta)) - prev_energy = best_energy = - walt_compute_energy(p, prev_cpu, pd, candidates, fbt_env.prs); - else + if (cpumask_test_cpu(prev_cpu, &p->cpus_mask) && !__cpu_overutilized(prev_cpu, delta)) { + if (trace_sched_compute_energy_enabled()) { + memset(&output, 0, sizeof(output)); + prev_energy = walt_compute_energy(p, prev_cpu, pd, candidates, fbt_env.prs, + &output); + } else { + prev_energy = walt_compute_energy(p, prev_cpu, pd, candidates, fbt_env.prs, + NULL); + } + + best_energy = prev_energy; + trace_sched_compute_energy(p, prev_cpu, prev_energy, 0, 0, 0, &output); + } else { prev_energy = best_energy = ULONG_MAX; + } /* Select the best candidate energy-wise. */ for_each_cpu(cpu, candidates) { if (cpu == prev_cpu) continue; - cur_energy = walt_compute_energy(p, cpu, pd, candidates, fbt_env.prs); + if (trace_sched_compute_energy_enabled()) { + memset(&output, 0, sizeof(output)); + cur_energy = walt_compute_energy(p, cpu, pd, candidates, fbt_env.prs, + &output); + } else { + cur_energy = walt_compute_energy(p, cpu, pd, candidates, fbt_env.prs, + NULL); + } + trace_sched_compute_energy(p, cpu, cur_energy, - prev_energy, best_energy, best_energy_cpu); + prev_energy, best_energy, best_energy_cpu, &output); if (cur_energy < best_energy) { best_energy = cur_energy;