Loading drivers/cpufreq/cpufreq.c +26 −1 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <linux/suspend.h> #include <linux/suspend.h> #include <linux/syscore_ops.h> #include <linux/syscore_ops.h> #include <linux/tick.h> #include <linux/tick.h> #include <linux/sched/sysctl.h> #include <trace/events/power.h> #include <trace/events/power.h> static LIST_HEAD(cpufreq_policy_list); static LIST_HEAD(cpufreq_policy_list); Loading Loading @@ -688,11 +689,35 @@ static ssize_t show_##file_name \ } } show_one(cpuinfo_min_freq, cpuinfo.min_freq); show_one(cpuinfo_min_freq, cpuinfo.min_freq); show_one(cpuinfo_max_freq, cpuinfo.max_freq); show_one(cpuinfo_transition_latency, cpuinfo.transition_latency); show_one(cpuinfo_transition_latency, cpuinfo.transition_latency); show_one(scaling_min_freq, min); show_one(scaling_min_freq, min); show_one(scaling_max_freq, max); show_one(scaling_max_freq, max); unsigned int cpuinfo_max_freq_cached; static bool should_use_cached_freq(int cpu) { if (!cpuinfo_max_freq_cached) return false; if (!(BIT(cpu) & sched_lib_mask_force)) return false; return is_sched_lib_based_app(current->pid); } static ssize_t show_cpuinfo_max_freq(struct cpufreq_policy *policy, char *buf) { unsigned int freq = policy->cpuinfo.max_freq; if (should_use_cached_freq(policy->cpu)) freq = cpuinfo_max_freq_cached << 1; else freq = policy->cpuinfo.max_freq; return scnprintf(buf, PAGE_SIZE, "%u\n", freq); } __weak unsigned int arch_freq_get_on_cpu(int cpu) __weak unsigned int arch_freq_get_on_cpu(int cpu) { { return 0; return 0; Loading drivers/cpufreq/freq_table.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -54,6 +54,9 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, policy->min = policy->cpuinfo.min_freq = min_freq; policy->min = policy->cpuinfo.min_freq = min_freq; policy->max = policy->cpuinfo.max_freq = max_freq; policy->max = policy->cpuinfo.max_freq = max_freq; if (max_freq > cpuinfo_max_freq_cached) cpuinfo_max_freq_cached = max_freq; if (policy->min == ~0) if (policy->min == ~0) return -EINVAL; return -EINVAL; else else Loading drivers/cpuidle/cpuidle.c +2 −2 Original line number Original line Diff line number Diff line Loading @@ -220,7 +220,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, } } /* Take note of the planned idle state. */ /* Take note of the planned idle state. */ sched_idle_set_state(target_state); sched_idle_set_state(target_state, index); trace_cpu_idle_rcuidle(index, dev->cpu); trace_cpu_idle_rcuidle(index, dev->cpu); time_start = ns_to_ktime(local_clock()); time_start = ns_to_ktime(local_clock()); Loading @@ -234,7 +234,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); /* The cpu is no longer idle or about to enter idle. */ /* The cpu is no longer idle or about to enter idle. */ sched_idle_set_state(NULL); sched_idle_set_state(NULL, -1); if (broadcast) { if (broadcast) { if (WARN_ON_ONCE(!irqs_disabled())) if (WARN_ON_ONCE(!irqs_disabled())) Loading include/linux/cpufreq.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -1000,4 +1000,6 @@ unsigned int cpufreq_generic_get(unsigned int cpu); void cpufreq_generic_init(struct cpufreq_policy *policy, void cpufreq_generic_init(struct cpufreq_policy *policy, struct cpufreq_frequency_table *table, struct cpufreq_frequency_table *table, unsigned int transition_latency); unsigned int transition_latency); extern unsigned int cpuinfo_max_freq_cached; #endif /* _LINUX_CPUFREQ_H */ #endif /* _LINUX_CPUFREQ_H */ include/linux/cpuidle.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -221,7 +221,7 @@ static inline void cpuidle_use_deepest_state(bool enable) #endif #endif /* kernel/sched/idle.c */ /* kernel/sched/idle.c */ extern void sched_idle_set_state(struct cpuidle_state *idle_state); extern void sched_idle_set_state(struct cpuidle_state *idle_state, int index); extern void default_idle_call(void); extern void default_idle_call(void); #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED Loading Loading
drivers/cpufreq/cpufreq.c +26 −1 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <linux/suspend.h> #include <linux/suspend.h> #include <linux/syscore_ops.h> #include <linux/syscore_ops.h> #include <linux/tick.h> #include <linux/tick.h> #include <linux/sched/sysctl.h> #include <trace/events/power.h> #include <trace/events/power.h> static LIST_HEAD(cpufreq_policy_list); static LIST_HEAD(cpufreq_policy_list); Loading Loading @@ -688,11 +689,35 @@ static ssize_t show_##file_name \ } } show_one(cpuinfo_min_freq, cpuinfo.min_freq); show_one(cpuinfo_min_freq, cpuinfo.min_freq); show_one(cpuinfo_max_freq, cpuinfo.max_freq); show_one(cpuinfo_transition_latency, cpuinfo.transition_latency); show_one(cpuinfo_transition_latency, cpuinfo.transition_latency); show_one(scaling_min_freq, min); show_one(scaling_min_freq, min); show_one(scaling_max_freq, max); show_one(scaling_max_freq, max); unsigned int cpuinfo_max_freq_cached; static bool should_use_cached_freq(int cpu) { if (!cpuinfo_max_freq_cached) return false; if (!(BIT(cpu) & sched_lib_mask_force)) return false; return is_sched_lib_based_app(current->pid); } static ssize_t show_cpuinfo_max_freq(struct cpufreq_policy *policy, char *buf) { unsigned int freq = policy->cpuinfo.max_freq; if (should_use_cached_freq(policy->cpu)) freq = cpuinfo_max_freq_cached << 1; else freq = policy->cpuinfo.max_freq; return scnprintf(buf, PAGE_SIZE, "%u\n", freq); } __weak unsigned int arch_freq_get_on_cpu(int cpu) __weak unsigned int arch_freq_get_on_cpu(int cpu) { { return 0; return 0; Loading
drivers/cpufreq/freq_table.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -54,6 +54,9 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, policy->min = policy->cpuinfo.min_freq = min_freq; policy->min = policy->cpuinfo.min_freq = min_freq; policy->max = policy->cpuinfo.max_freq = max_freq; policy->max = policy->cpuinfo.max_freq = max_freq; if (max_freq > cpuinfo_max_freq_cached) cpuinfo_max_freq_cached = max_freq; if (policy->min == ~0) if (policy->min == ~0) return -EINVAL; return -EINVAL; else else Loading
drivers/cpuidle/cpuidle.c +2 −2 Original line number Original line Diff line number Diff line Loading @@ -220,7 +220,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, } } /* Take note of the planned idle state. */ /* Take note of the planned idle state. */ sched_idle_set_state(target_state); sched_idle_set_state(target_state, index); trace_cpu_idle_rcuidle(index, dev->cpu); trace_cpu_idle_rcuidle(index, dev->cpu); time_start = ns_to_ktime(local_clock()); time_start = ns_to_ktime(local_clock()); Loading @@ -234,7 +234,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv, trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, dev->cpu); /* The cpu is no longer idle or about to enter idle. */ /* The cpu is no longer idle or about to enter idle. */ sched_idle_set_state(NULL); sched_idle_set_state(NULL, -1); if (broadcast) { if (broadcast) { if (WARN_ON_ONCE(!irqs_disabled())) if (WARN_ON_ONCE(!irqs_disabled())) Loading
include/linux/cpufreq.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -1000,4 +1000,6 @@ unsigned int cpufreq_generic_get(unsigned int cpu); void cpufreq_generic_init(struct cpufreq_policy *policy, void cpufreq_generic_init(struct cpufreq_policy *policy, struct cpufreq_frequency_table *table, struct cpufreq_frequency_table *table, unsigned int transition_latency); unsigned int transition_latency); extern unsigned int cpuinfo_max_freq_cached; #endif /* _LINUX_CPUFREQ_H */ #endif /* _LINUX_CPUFREQ_H */
include/linux/cpuidle.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -221,7 +221,7 @@ static inline void cpuidle_use_deepest_state(bool enable) #endif #endif /* kernel/sched/idle.c */ /* kernel/sched/idle.c */ extern void sched_idle_set_state(struct cpuidle_state *idle_state); extern void sched_idle_set_state(struct cpuidle_state *idle_state, int index); extern void default_idle_call(void); extern void default_idle_call(void); #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED Loading