mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Merge branch 'pm-cpuidle'
* pm-cpuidle: cpuidle: Measure idle state durations with monotonic clock cpuidle: fix a suspicious RCU usage in menu governor cpuidle: support multiple drivers cpuidle: prepare the cpuidle core to handle multiple drivers cpuidle: move driver checking within the lock section cpuidle: move driver's refcount to cpuidle cpuidle: fixup device.h header in cpuidle.h cpuidle / sysfs: move structure declaration into the sysfs.c file cpuidle: Get typical recent sleep interval cpuidle: Set residency to 0 if target Cstate not enter cpuidle: Quickly notice prediction failure in general case cpuidle: Quickly notice prediction failure for repeat mode cpuidle / sysfs: move kobj initialization in the syfs file cpuidle / sysfs: change function parameter
This commit is contained in:
commit
9ee71f513c
12 changed files with 578 additions and 177 deletions
|
|
@ -735,31 +735,18 @@ static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
|
|||
static int acpi_idle_enter_c1(struct cpuidle_device *dev,
|
||||
struct cpuidle_driver *drv, int index)
|
||||
{
|
||||
ktime_t kt1, kt2;
|
||||
s64 idle_time;
|
||||
struct acpi_processor *pr;
|
||||
struct cpuidle_state_usage *state_usage = &dev->states_usage[index];
|
||||
struct acpi_processor_cx *cx = cpuidle_get_statedata(state_usage);
|
||||
|
||||
pr = __this_cpu_read(processors);
|
||||
dev->last_residency = 0;
|
||||
|
||||
if (unlikely(!pr))
|
||||
return -EINVAL;
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
|
||||
lapic_timer_state_broadcast(pr, cx, 1);
|
||||
kt1 = ktime_get_real();
|
||||
acpi_idle_do_entry(cx);
|
||||
kt2 = ktime_get_real();
|
||||
idle_time = ktime_to_us(ktime_sub(kt2, kt1));
|
||||
|
||||
/* Update device last_residency*/
|
||||
dev->last_residency = (int)idle_time;
|
||||
|
||||
local_irq_enable();
|
||||
lapic_timer_state_broadcast(pr, cx, 0);
|
||||
|
||||
return index;
|
||||
|
|
@ -806,19 +793,12 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
|||
struct acpi_processor *pr;
|
||||
struct cpuidle_state_usage *state_usage = &dev->states_usage[index];
|
||||
struct acpi_processor_cx *cx = cpuidle_get_statedata(state_usage);
|
||||
ktime_t kt1, kt2;
|
||||
s64 idle_time_ns;
|
||||
s64 idle_time;
|
||||
|
||||
pr = __this_cpu_read(processors);
|
||||
dev->last_residency = 0;
|
||||
|
||||
if (unlikely(!pr))
|
||||
return -EINVAL;
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
|
||||
if (cx->entry_method != ACPI_CSTATE_FFH) {
|
||||
current_thread_info()->status &= ~TS_POLLING;
|
||||
/*
|
||||
|
|
@ -829,7 +809,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
|||
|
||||
if (unlikely(need_resched())) {
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
local_irq_enable();
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
|
@ -843,22 +822,12 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
|||
if (cx->type == ACPI_STATE_C3)
|
||||
ACPI_FLUSH_CPU_CACHE();
|
||||
|
||||
kt1 = ktime_get_real();
|
||||
/* Tell the scheduler that we are going deep-idle: */
|
||||
sched_clock_idle_sleep_event();
|
||||
acpi_idle_do_entry(cx);
|
||||
kt2 = ktime_get_real();
|
||||
idle_time_ns = ktime_to_ns(ktime_sub(kt2, kt1));
|
||||
idle_time = idle_time_ns;
|
||||
do_div(idle_time, NSEC_PER_USEC);
|
||||
|
||||
/* Update device last_residency*/
|
||||
dev->last_residency = (int)idle_time;
|
||||
sched_clock_idle_wakeup_event(0);
|
||||
|
||||
/* Tell the scheduler how much we idled: */
|
||||
sched_clock_idle_wakeup_event(idle_time_ns);
|
||||
|
||||
local_irq_enable();
|
||||
if (cx->entry_method != ACPI_CSTATE_FFH)
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
|
||||
|
|
@ -883,13 +852,8 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
|
|||
struct acpi_processor *pr;
|
||||
struct cpuidle_state_usage *state_usage = &dev->states_usage[index];
|
||||
struct acpi_processor_cx *cx = cpuidle_get_statedata(state_usage);
|
||||
ktime_t kt1, kt2;
|
||||
s64 idle_time_ns;
|
||||
s64 idle_time;
|
||||
|
||||
|
||||
pr = __this_cpu_read(processors);
|
||||
dev->last_residency = 0;
|
||||
|
||||
if (unlikely(!pr))
|
||||
return -EINVAL;
|
||||
|
|
@ -899,16 +863,11 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
|
|||
return drv->states[drv->safe_state_index].enter(dev,
|
||||
drv, drv->safe_state_index);
|
||||
} else {
|
||||
local_irq_disable();
|
||||
acpi_safe_halt();
|
||||
local_irq_enable();
|
||||
return -EBUSY;
|
||||
}
|
||||
}
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
|
||||
if (cx->entry_method != ACPI_CSTATE_FFH) {
|
||||
current_thread_info()->status &= ~TS_POLLING;
|
||||
/*
|
||||
|
|
@ -919,7 +878,6 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
|
|||
|
||||
if (unlikely(need_resched())) {
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
local_irq_enable();
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
|
@ -934,7 +892,6 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
|
|||
*/
|
||||
lapic_timer_state_broadcast(pr, cx, 1);
|
||||
|
||||
kt1 = ktime_get_real();
|
||||
/*
|
||||
* disable bus master
|
||||
* bm_check implies we need ARB_DIS
|
||||
|
|
@ -965,18 +922,9 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
|
|||
c3_cpu_count--;
|
||||
raw_spin_unlock(&c3_lock);
|
||||
}
|
||||
kt2 = ktime_get_real();
|
||||
idle_time_ns = ktime_to_ns(ktime_sub(kt2, kt1));
|
||||
idle_time = idle_time_ns;
|
||||
do_div(idle_time, NSEC_PER_USEC);
|
||||
|
||||
/* Update device last_residency*/
|
||||
dev->last_residency = (int)idle_time;
|
||||
sched_clock_idle_wakeup_event(0);
|
||||
|
||||
/* Tell the scheduler how much we idled: */
|
||||
sched_clock_idle_wakeup_event(idle_time_ns);
|
||||
|
||||
local_irq_enable();
|
||||
if (cx->entry_method != ACPI_CSTATE_FFH)
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
|
||||
|
|
@ -987,6 +935,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
|
|||
struct cpuidle_driver acpi_idle_driver = {
|
||||
.name = "acpi_idle",
|
||||
.owner = THIS_MODULE,
|
||||
.en_core_tk_irqen = 1,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in a new issue