From 34c2f65b718d44ea7d7b3cc10777f410677455ce Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Wed, 23 Aug 2017 23:21:07 +0200 Subject: cpuidle: Move polling state initialization code to separate file Move the polling state initialization code to a separate file built conditionally on CONFIG_ARCH_HAS_CPU_RELAX to get rid of the #ifdef in driver.c. Signed-off-by: Rafael J. Wysocki Tested-by: Sudeep Holla Acked-by: Daniel Lezcano --- drivers/cpuidle/poll_state.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 drivers/cpuidle/poll_state.c (limited to 'drivers/cpuidle/poll_state.c') diff --git a/drivers/cpuidle/poll_state.c b/drivers/cpuidle/poll_state.c new file mode 100644 index 000000000000..0db4f7273952 --- /dev/null +++ b/drivers/cpuidle/poll_state.c @@ -0,0 +1,36 @@ +/* + * poll_state.c - Polling idle state + * + * This file is released under the GPLv2. + */ + +#include +#include +#include + +static int __cpuidle poll_idle(struct cpuidle_device *dev, + struct cpuidle_driver *drv, int index) +{ + local_irq_enable(); + if (!current_set_polling_and_test()) { + while (!need_resched()) + cpu_relax(); + } + current_clr_polling(); + + return index; +} + +void poll_idle_init(struct cpuidle_driver *drv) +{ + struct cpuidle_state *state = &drv->states[0]; + + snprintf(state->name, CPUIDLE_NAME_LEN, "POLL"); + snprintf(state->desc, CPUIDLE_DESC_LEN, "CPUIDLE CORE POLL IDLE"); + state->exit_latency = 0; + state->target_residency = 0; + state->power_usage = -1; + state->enter = poll_idle; + state->disabled = false; + state->flags = CPUIDLE_FLAG_POLLING; +} -- cgit v1.2.3 From 1b39e3f813b4685c7a30ae964d5529a1b0e3a286 Mon Sep 17 00:00:00 2001 From: "Rafael J. Wysocki" Date: Tue, 29 Aug 2017 03:14:37 +0200 Subject: cpuidle: Make drivers initialize polling state Make the drivers that want to include the polling state into their states table initialize it explicitly and drop the initialization of it (which in fact is conditional, but that is not obvious from the code) from the core. Signed-off-by: Rafael J. Wysocki Tested-by: Sudeep Holla Acked-by: Daniel Lezcano --- drivers/acpi/processor_idle.c | 9 ++++++++- drivers/cpuidle/driver.c | 2 -- drivers/cpuidle/poll_state.c | 3 ++- drivers/idle/intel_idle.c | 1 + include/linux/cpuidle.h | 4 ++-- 5 files changed, 13 insertions(+), 6 deletions(-) (limited to 'drivers/cpuidle/poll_state.c') diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 39a01ea7a46d..df38e81cc672 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -842,7 +842,7 @@ static int acpi_processor_setup_cpuidle_cx(struct acpi_processor *pr, static int acpi_processor_setup_cstates(struct acpi_processor *pr) { - int i, count = ACPI_IDLE_STATE_START; + int i, count; struct acpi_processor_cx *cx; struct cpuidle_state *state; struct cpuidle_driver *drv = &acpi_idle_driver; @@ -850,6 +850,13 @@ static int acpi_processor_setup_cstates(struct acpi_processor *pr) if (max_cstate == 0) max_cstate = 1; + if (IS_ENABLED(CONFIG_ARCH_HAS_CPU_RELAX)) { + cpuidle_poll_state_init(drv); + count = 1; + } else { + count = 0; + } + for (i = 1; i < ACPI_PROCESSOR_MAX_POWER && i <= max_cstate; i++) { cx = &pr->power.states[i]; diff --git a/drivers/cpuidle/driver.c b/drivers/cpuidle/driver.c index 6f694c86f3fa..dc32f34e68d9 100644 --- a/drivers/cpuidle/driver.c +++ b/drivers/cpuidle/driver.c @@ -216,8 +216,6 @@ static int __cpuidle_register_driver(struct cpuidle_driver *drv) on_each_cpu_mask(drv->cpumask, cpuidle_setup_broadcast_timer, (void *)1, 1); - poll_idle_init(drv); - return 0; } diff --git a/drivers/cpuidle/poll_state.c b/drivers/cpuidle/poll_state.c index 0db4f7273952..7416b16287de 100644 --- a/drivers/cpuidle/poll_state.c +++ b/drivers/cpuidle/poll_state.c @@ -21,7 +21,7 @@ static int __cpuidle poll_idle(struct cpuidle_device *dev, return index; } -void poll_idle_init(struct cpuidle_driver *drv) +void cpuidle_poll_state_init(struct cpuidle_driver *drv) { struct cpuidle_state *state = &drv->states[0]; @@ -34,3 +34,4 @@ void poll_idle_init(struct cpuidle_driver *drv) state->disabled = false; state->flags = CPUIDLE_FLAG_POLLING; } +EXPORT_SYMBOL_GPL(cpuidle_poll_state_init); diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index c2ae819a871c..7bf8739e33bc 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c @@ -1331,6 +1331,7 @@ static void __init intel_idle_cpuidle_driver_init(void) intel_idle_state_table_update(); + cpuidle_poll_state_init(drv); drv->state_count = 1; for (cstate = 0; cstate < CPUIDLE_STATE_MAX; ++cstate) { diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 561bc5365067..5baacd3a0559 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h @@ -226,9 +226,9 @@ static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, #endif #ifdef CONFIG_ARCH_HAS_CPU_RELAX -void poll_idle_init(struct cpuidle_driver *drv); +void cpuidle_poll_state_init(struct cpuidle_driver *drv); #else -static void poll_idle_init(struct cpuidle_driver *drv) {} +static inline void cpuidle_poll_state_init(struct cpuidle_driver *drv) {} #endif /****************************** -- cgit v1.2.3