Loading include/trace/events/walt.h +1 −1 Original line number Diff line number Diff line Loading @@ -183,7 +183,7 @@ TRACE_EVENT(sched_get_task_cpu_cycles, __entry->cycles = cycles; __entry->exec_time = exec_time; __entry->freq = cpu_cycles_to_freq(cycles, exec_time); __entry->legacy_freq = cpu_cur_freq(cpu); __entry->legacy_freq = sched_cpu_legacy_freq(cpu); __entry->pid = p->pid; memcpy(__entry->comm, p->comm, TASK_COMM_LEN); ), Loading kernel/sched/walt.c +51 −2 Original line number Diff line number Diff line Loading @@ -2338,10 +2338,59 @@ static struct notifier_block notifier_policy_block = { .notifier_call = cpufreq_notifier_policy }; static int cpufreq_notifier_trans(struct notifier_block *nb, unsigned long val, void *data) { struct cpufreq_freqs *freq = (struct cpufreq_freqs *)data; unsigned int cpu = freq->cpu, new_freq = freq->new; unsigned long flags; struct sched_cluster *cluster; struct cpumask policy_cpus = cpu_rq(cpu)->freq_domain_cpumask; int i, j; if (use_cycle_counter) return NOTIFY_DONE; if (val != CPUFREQ_POSTCHANGE) return NOTIFY_DONE; if (cpu_cur_freq(cpu) == new_freq) return NOTIFY_OK; for_each_cpu(i, &policy_cpus) { cluster = cpu_rq(i)->cluster; for_each_cpu(j, &cluster->cpus) { struct rq *rq = cpu_rq(j); raw_spin_lock_irqsave(&rq->lock, flags); update_task_ravg(rq->curr, rq, TASK_UPDATE, ktime_get_ns(), 0); raw_spin_unlock_irqrestore(&rq->lock, flags); } cluster->cur_freq = new_freq; cpumask_andnot(&policy_cpus, &policy_cpus, &cluster->cpus); } return NOTIFY_OK; } static struct notifier_block notifier_trans_block = { .notifier_call = cpufreq_notifier_trans }; static int register_walt_callback(void) { return cpufreq_register_notifier(¬ifier_policy_block, int ret; ret = cpufreq_register_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); if (!ret) ret = cpufreq_register_notifier(¬ifier_trans_block, CPUFREQ_TRANSITION_NOTIFIER); return ret; } /* * cpufreq callbacks can be registered at core_initcall or later time. Loading kernel/sched/walt.h +8 −0 Original line number Diff line number Diff line Loading @@ -229,6 +229,14 @@ static inline unsigned int cpu_cur_freq(int cpu) return cpu_rq(cpu)->cluster->cur_freq; } static inline unsigned int sched_cpu_legacy_freq(int cpu) { unsigned long curr_cap = arch_scale_freq_capacity(NULL, cpu); return (curr_cap * (u64) cpu_rq(cpu)->cluster->max_freq) >> SCHED_CAPACITY_SHIFT; } static inline void move_list(struct list_head *dst, struct list_head *src, bool sync_rcu) { Loading Loading
include/trace/events/walt.h +1 −1 Original line number Diff line number Diff line Loading @@ -183,7 +183,7 @@ TRACE_EVENT(sched_get_task_cpu_cycles, __entry->cycles = cycles; __entry->exec_time = exec_time; __entry->freq = cpu_cycles_to_freq(cycles, exec_time); __entry->legacy_freq = cpu_cur_freq(cpu); __entry->legacy_freq = sched_cpu_legacy_freq(cpu); __entry->pid = p->pid; memcpy(__entry->comm, p->comm, TASK_COMM_LEN); ), Loading
kernel/sched/walt.c +51 −2 Original line number Diff line number Diff line Loading @@ -2338,10 +2338,59 @@ static struct notifier_block notifier_policy_block = { .notifier_call = cpufreq_notifier_policy }; static int cpufreq_notifier_trans(struct notifier_block *nb, unsigned long val, void *data) { struct cpufreq_freqs *freq = (struct cpufreq_freqs *)data; unsigned int cpu = freq->cpu, new_freq = freq->new; unsigned long flags; struct sched_cluster *cluster; struct cpumask policy_cpus = cpu_rq(cpu)->freq_domain_cpumask; int i, j; if (use_cycle_counter) return NOTIFY_DONE; if (val != CPUFREQ_POSTCHANGE) return NOTIFY_DONE; if (cpu_cur_freq(cpu) == new_freq) return NOTIFY_OK; for_each_cpu(i, &policy_cpus) { cluster = cpu_rq(i)->cluster; for_each_cpu(j, &cluster->cpus) { struct rq *rq = cpu_rq(j); raw_spin_lock_irqsave(&rq->lock, flags); update_task_ravg(rq->curr, rq, TASK_UPDATE, ktime_get_ns(), 0); raw_spin_unlock_irqrestore(&rq->lock, flags); } cluster->cur_freq = new_freq; cpumask_andnot(&policy_cpus, &policy_cpus, &cluster->cpus); } return NOTIFY_OK; } static struct notifier_block notifier_trans_block = { .notifier_call = cpufreq_notifier_trans }; static int register_walt_callback(void) { return cpufreq_register_notifier(¬ifier_policy_block, int ret; ret = cpufreq_register_notifier(¬ifier_policy_block, CPUFREQ_POLICY_NOTIFIER); if (!ret) ret = cpufreq_register_notifier(¬ifier_trans_block, CPUFREQ_TRANSITION_NOTIFIER); return ret; } /* * cpufreq callbacks can be registered at core_initcall or later time. Loading
kernel/sched/walt.h +8 −0 Original line number Diff line number Diff line Loading @@ -229,6 +229,14 @@ static inline unsigned int cpu_cur_freq(int cpu) return cpu_rq(cpu)->cluster->cur_freq; } static inline unsigned int sched_cpu_legacy_freq(int cpu) { unsigned long curr_cap = arch_scale_freq_capacity(NULL, cpu); return (curr_cap * (u64) cpu_rq(cpu)->cluster->max_freq) >> SCHED_CAPACITY_SHIFT; } static inline void move_list(struct list_head *dst, struct list_head *src, bool sync_rcu) { Loading