Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+9 -47
+1 -1
drivers/acpi/glue.c
··· 297 297 if (!ret) { 298 298 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 299 299 300 - acpi_get_name(dev->acpi_handle, ACPI_FULL_PATHNAME, &buffer); 300 + acpi_get_name(ACPI_HANDLE(dev), ACPI_FULL_PATHNAME, &buffer); 301 301 DBG("Device %s -> %s\n", dev_name(dev), (char *)buffer.pointer); 302 302 kfree(buffer.pointer); 303 303 } else
+4 -13
drivers/cpuidle/cpuidle.c
··· 69 69 { 70 70 struct cpuidle_device *dev = __this_cpu_read(cpuidle_devices); 71 71 struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev); 72 - int i, dead_state = -1; 73 - int power_usage = INT_MAX; 72 + int i; 74 73 75 74 if (!drv) 76 75 return -ENODEV; 77 76 78 77 /* 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); 90 81 91 82 return -ENODEV; 92 83 }
-25
drivers/cpuidle/driver.c
··· 19 19 static void __cpuidle_set_cpu_driver(struct cpuidle_driver *drv, int cpu); 20 20 static struct cpuidle_driver * __cpuidle_get_cpu_driver(int cpu); 21 21 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 - 44 22 static void __cpuidle_driver_init(struct cpuidle_driver *drv) 45 23 { 46 24 drv->refcnt = 0; 47 - 48 - if (!drv->power_specified) 49 - set_power_states(drv); 50 25 } 51 26 52 27 static int __cpuidle_register_driver(struct cpuidle_driver *drv, int cpu)
+2 -6
drivers/cpuidle/governors/menu.c
··· 312 312 { 313 313 struct menu_device *data = &__get_cpu_var(menu_devices); 314 314 int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY); 315 - int power_usage = INT_MAX; 316 315 int i; 317 316 int multiplier; 318 317 struct timespec t; ··· 382 383 if (s->exit_latency * multiplier > data->predicted_us) 383 384 continue; 384 385 385 - if (s->power_usage < power_usage) { 386 - power_usage = s->power_usage; 387 - data->last_state_idx = i; 388 - data->exit_us = s->exit_latency; 389 - } 386 + data->last_state_idx = i; 387 + data->exit_us = s->exit_latency; 390 388 } 391 389 392 390 /* not deepest C-state chosen for low predicted residency */
+1 -1
drivers/cpuidle/sysfs.c
··· 374 374 struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device); 375 375 376 376 /* state statistics */ 377 - for (i = 0; i < drv->state_count; i++) { 377 + for (i = 0; i < device->state_count; i++) { 378 378 kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL); 379 379 if (!kobj) 380 380 goto error_state;
+1 -1
include/linux/cpuidle.h
··· 126 126 struct module *owner; 127 127 int refcnt; 128 128 129 - unsigned int power_specified:1; 130 129 /* set to 1 to use the core cpuidle time keeping (for all states). */ 131 130 unsigned int en_core_tk_irqen:1; 131 + /* states array must be ordered in decreasing power consumption */ 132 132 struct cpuidle_state states[CPUIDLE_STATE_MAX]; 133 133 int state_count; 134 134 int safe_state_index;