Skip to content

Commit 309b51e

Browse files
committed
Merge tag 'pm+acpi-for-3.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull ACPI and power management fixes from Rafael Wysocki: - cpuidle regression fix related to the initialization of state kobjects from Krzysztof Mazur. - cpuidle fix removing some not very useful code and making some user-visible problems go away at the same time. From Daniel Lezcano. - ACPI build fix from Yinghai Lu. * tag 'pm+acpi-for-3.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: cpuidle: remove the power_specified field in the driver ACPI / glue: Fix build with ACPI_GLUE_DEBUG set cpuidle: fix number of initialized/destroyed states
2 parents 3a55fb0 + 8aef33a commit 309b51e

File tree

6 files changed

+9
-47
lines changed

6 files changed

+9
-47
lines changed

drivers/acpi/glue.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ static int acpi_platform_notify(struct device *dev)
297297
if (!ret) {
298298
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
299299

300-
acpi_get_name(dev->acpi_handle, ACPI_FULL_PATHNAME, &buffer);
300+
acpi_get_name(ACPI_HANDLE(dev), ACPI_FULL_PATHNAME, &buffer);
301301
DBG("Device %s -> %s\n", dev_name(dev), (char *)buffer.pointer);
302302
kfree(buffer.pointer);
303303
} else

drivers/cpuidle/cpuidle.c

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,15 @@ int cpuidle_play_dead(void)
6969
{
7070
struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices);
7171
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
72-
int i, dead_state = -1;
73-
int power_usage = INT_MAX;
72+
int i;
7473

7574
if (!drv)
7675
return -ENODEV;
7776

7877
/* Find lowest-power state that supports long-term idle */
79-
for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) {
80-
struct cpuidle_state *s = &drv->states[i];
81-
82-
if (s->power_usage < power_usage && s->enter_dead) {
83-
power_usage = s->power_usage;
84-
dead_state = i;
85-
}
86-
}
87-
88-
if (dead_state != -1)
89-
return drv->states[dead_state].enter_dead(dev, dead_state);
78+
for (i = drv->state_count - 1; i >= CPUIDLE_DRIVER_STATE_START; i--)
79+
if (drv->states[i].enter_dead)
80+
return drv->states[i].enter_dead(dev, i);
9081

9182
return -ENODEV;
9283
}

drivers/cpuidle/driver.c

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,9 @@ DEFINE_SPINLOCK(cpuidle_driver_lock);
1919
static void __cpuidle_set_cpu_driver(struct cpuidle_driver *drv, int cpu);
2020
static struct cpuidle_driver * __cpuidle_get_cpu_driver(int cpu);
2121

22-
static void set_power_states(struct cpuidle_driver *drv)
23-
{
24-
int i;
25-
26-
/*
27-
* cpuidle driver should set the drv->power_specified bit
28-
* before registering if the driver provides
29-
* power_usage numbers.
30-
*
31-
* If power_specified is not set,
32-
* we fill in power_usage with decreasing values as the
33-
* cpuidle code has an implicit assumption that state Cn
34-
* uses less power than C(n-1).
35-
*
36-
* With CONFIG_ARCH_HAS_CPU_RELAX, C0 is already assigned
37-
* an power value of -1. So we use -2, -3, etc, for other
38-
* c-states.
39-
*/
40-
for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++)
41-
drv->states[i].power_usage = -1 - i;
42-
}
43-
4422
static void __cpuidle_driver_init(struct cpuidle_driver *drv)
4523
{
4624
drv->refcnt = 0;
47-
48-
if (!drv->power_specified)
49-
set_power_states(drv);
5025
}
5126

5227
static int __cpuidle_register_driver(struct cpuidle_driver *drv, int cpu)

drivers/cpuidle/governors/menu.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,6 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
312312
{
313313
struct menu_device *data = &__get_cpu_var(menu_devices);
314314
int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);
315-
int power_usage = INT_MAX;
316315
int i;
317316
int multiplier;
318317
struct timespec t;
@@ -383,11 +382,8 @@ static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)
383382
if (s->exit_latency * multiplier > data->predicted_us)
384383
continue;
385384

386-
if (s->power_usage < power_usage) {
387-
power_usage = s->power_usage;
388-
data->last_state_idx = i;
389-
data->exit_us = s->exit_latency;
390-
}
385+
data->last_state_idx = i;
386+
data->exit_us = s->exit_latency;
391387
}
392388

393389
/* not deepest C-state chosen for low predicted residency */

drivers/cpuidle/sysfs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
374374
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
375375

376376
/* state statistics */
377-
for (i = 0; i < drv->state_count; i++) {
377+
for (i = 0; i < device->state_count; i++) {
378378
kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL);
379379
if (!kobj)
380380
goto error_state;

include/linux/cpuidle.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ struct cpuidle_driver {
126126
struct module *owner;
127127
int refcnt;
128128

129-
unsigned int power_specified:1;
130129
/* set to 1 to use the core cpuidle time keeping (for all states). */
131130
unsigned int en_core_tk_irqen:1;
131+
/* states array must be ordered in decreasing power consumption */
132132
struct cpuidle_state states[CPUIDLE_STATE_MAX];
133133
int state_count;
134134
int safe_state_index;

0 commit comments

Comments
 (0)