cpuidle: Split cpuidle_state structure and move per-cpu statistics fields
This is the first step towards global registration of cpuidle states. The statistics used primarily by the governor are per-cpu and have to be split from rest of the fields inside cpuidle_state, which would be made global i.e. single copy. The driver_data field is also per-cpu and moved. Signed-off-by: Deepthi Dharwar <deepthi@linux.vnet.ibm.com> Signed-off-by: Trinabh Gupta <g.trinabh@gmail.com> Tested-by: Jean Pihet <j-pihet@ti.com> Reviewed-by: Kevin Hilman <khilman@ti.com> Acked-by: Arjan van de Ven <arjan@linux.intel.com> Acked-by: Kevin Hilman <khilman@ti.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:

committed by
Len Brown

parent
b25edc42bf
commit
4202735e8a
@@ -745,14 +745,13 @@ static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx)
|
||||
*
|
||||
* This is equivalent to the HALT instruction.
|
||||
*/
|
||||
static int acpi_idle_enter_c1(struct cpuidle_device *dev,
|
||||
int index)
|
||||
static int acpi_idle_enter_c1(struct cpuidle_device *dev, int index)
|
||||
{
|
||||
ktime_t kt1, kt2;
|
||||
s64 idle_time;
|
||||
struct acpi_processor *pr;
|
||||
struct cpuidle_state *state = &dev->states[index];
|
||||
struct acpi_processor_cx *cx = cpuidle_get_statedata(state);
|
||||
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;
|
||||
@@ -790,12 +789,11 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,
|
||||
* @dev: the target CPU
|
||||
* @index: the index of suggested state
|
||||
*/
|
||||
static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
||||
int index)
|
||||
static int acpi_idle_enter_simple(struct cpuidle_device *dev, int index)
|
||||
{
|
||||
struct acpi_processor *pr;
|
||||
struct cpuidle_state *state = &dev->states[index];
|
||||
struct acpi_processor_cx *cx = cpuidle_get_statedata(state);
|
||||
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;
|
||||
@@ -875,12 +873,11 @@ static DEFINE_SPINLOCK(c3_lock);
|
||||
*
|
||||
* If BM is detected, the deepest non-C3 idle state is entered instead.
|
||||
*/
|
||||
static int acpi_idle_enter_bm(struct cpuidle_device *dev,
|
||||
int index)
|
||||
static int acpi_idle_enter_bm(struct cpuidle_device *dev, int index)
|
||||
{
|
||||
struct acpi_processor *pr;
|
||||
struct cpuidle_state *state = &dev->states[index];
|
||||
struct acpi_processor_cx *cx = cpuidle_get_statedata(state);
|
||||
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;
|
||||
@@ -1004,6 +1001,7 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr)
|
||||
int i, count = CPUIDLE_DRIVER_STATE_START;
|
||||
struct acpi_processor_cx *cx;
|
||||
struct cpuidle_state *state;
|
||||
struct cpuidle_state_usage *state_usage;
|
||||
struct cpuidle_device *dev = &pr->power.dev;
|
||||
|
||||
if (!pr->flags.power_setup_done)
|
||||
@@ -1026,6 +1024,7 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr)
|
||||
for (i = 1; i < ACPI_PROCESSOR_MAX_POWER && i <= max_cstate; i++) {
|
||||
cx = &pr->power.states[i];
|
||||
state = &dev->states[count];
|
||||
state_usage = &dev->states_usage[count];
|
||||
|
||||
if (!cx->valid)
|
||||
continue;
|
||||
@@ -1036,7 +1035,7 @@ static int acpi_processor_setup_cpuidle(struct acpi_processor *pr)
|
||||
!(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED))
|
||||
continue;
|
||||
#endif
|
||||
cpuidle_set_statedata(state, cx);
|
||||
cpuidle_set_statedata(state_usage, cx);
|
||||
|
||||
snprintf(state->name, CPUIDLE_NAME_LEN, "C%d", i);
|
||||
strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN);
|
||||
|
Reference in New Issue
Block a user