Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a00df951 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ANDROID: sched, cpuidle: Track cpuidle state index in the scheduler"

parents 2f2d8729 478df4d9
Loading
Loading
Loading
Loading
+26 −1
Original line number Original line Diff line number Diff line
@@ -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);
@@ -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;
+3 −0
Original line number Original line Diff line number Diff line
@@ -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
+2 −2
Original line number Original line Diff line number Diff line
@@ -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());
@@ -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()))
+2 −0
Original line number Original line Diff line number Diff line
@@ -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 */
+1 −1
Original line number Original line Diff line number Diff line
@@ -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