Loading drivers/cpufreq/cpufreq.c +31 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <linux/syscore_ops.h> #include <linux/tick.h> #include <linux/sched/topology.h> #include <linux/sched/sysctl.h> #include <trace/events/power.h> Loading Loading @@ -657,11 +658,40 @@ static ssize_t show_##file_name \ } 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(scaling_min_freq, min); show_one(scaling_max_freq, max); unsigned int cpuinfo_max_freq_cached; static bool should_use_cached_freq(int cpu) { /* This is a safe check. may not be needed */ if (!cpuinfo_max_freq_cached) return false; /* * perfd already configure sched_lib_mask_force to * 0xf0 from user space. so re-using it. */ 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) { return 0; Loading drivers/cpufreq/freq_table.c +3 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,9 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, policy->min = policy->cpuinfo.min_freq = min_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) return -EINVAL; else Loading include/linux/cpufreq.h +2 −0 Original line number Diff line number Diff line Loading @@ -937,4 +937,6 @@ unsigned int cpufreq_generic_get(unsigned int cpu); int cpufreq_generic_init(struct cpufreq_policy *policy, struct cpufreq_frequency_table *table, unsigned int transition_latency); extern unsigned int cpuinfo_max_freq_cached; #endif /* _LINUX_CPUFREQ_H */ include/linux/sched/sysctl.h +1 −1 Original line number Diff line number Diff line Loading @@ -133,7 +133,7 @@ extern int sched_little_cluster_coloc_fmin_khz_handler(struct ctl_table *table, #define LIB_PATH_LENGTH 512 extern char sched_lib_name[LIB_PATH_LENGTH]; extern unsigned int sched_lib_mask_check; extern unsigned int sched_lib_mask_force; extern bool is_sched_lib_based_app(pid_t pid); #endif /* _LINUX_SCHED_SYSCTL_H */ kernel/compat.c +1 −1 Original line number Diff line number Diff line Loading @@ -334,7 +334,7 @@ COMPAT_SYSCALL_DEFINE3(sched_setaffinity, compat_pid_t, pid, if (retval) goto out; retval = msm_sched_setaffinity(pid, new_mask); retval = sched_setaffinity(pid, new_mask); out: free_cpumask_var(new_mask); return retval; Loading Loading
drivers/cpufreq/cpufreq.c +31 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <linux/syscore_ops.h> #include <linux/tick.h> #include <linux/sched/topology.h> #include <linux/sched/sysctl.h> #include <trace/events/power.h> Loading Loading @@ -657,11 +658,40 @@ static ssize_t show_##file_name \ } 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(scaling_min_freq, min); show_one(scaling_max_freq, max); unsigned int cpuinfo_max_freq_cached; static bool should_use_cached_freq(int cpu) { /* This is a safe check. may not be needed */ if (!cpuinfo_max_freq_cached) return false; /* * perfd already configure sched_lib_mask_force to * 0xf0 from user space. so re-using it. */ 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) { return 0; Loading
drivers/cpufreq/freq_table.c +3 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,9 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, policy->min = policy->cpuinfo.min_freq = min_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) return -EINVAL; else Loading
include/linux/cpufreq.h +2 −0 Original line number Diff line number Diff line Loading @@ -937,4 +937,6 @@ unsigned int cpufreq_generic_get(unsigned int cpu); int cpufreq_generic_init(struct cpufreq_policy *policy, struct cpufreq_frequency_table *table, unsigned int transition_latency); extern unsigned int cpuinfo_max_freq_cached; #endif /* _LINUX_CPUFREQ_H */
include/linux/sched/sysctl.h +1 −1 Original line number Diff line number Diff line Loading @@ -133,7 +133,7 @@ extern int sched_little_cluster_coloc_fmin_khz_handler(struct ctl_table *table, #define LIB_PATH_LENGTH 512 extern char sched_lib_name[LIB_PATH_LENGTH]; extern unsigned int sched_lib_mask_check; extern unsigned int sched_lib_mask_force; extern bool is_sched_lib_based_app(pid_t pid); #endif /* _LINUX_SCHED_SYSCTL_H */
kernel/compat.c +1 −1 Original line number Diff line number Diff line Loading @@ -334,7 +334,7 @@ COMPAT_SYSCALL_DEFINE3(sched_setaffinity, compat_pid_t, pid, if (retval) goto out; retval = msm_sched_setaffinity(pid, new_mask); retval = sched_setaffinity(pid, new_mask); out: free_cpumask_var(new_mask); return retval; Loading