cpuidle: remove state_count field from struct cpuidle_device
Thomas Schlichter reports the following issue on his Samsung NC20:
"The C-states C1 and C2 to the OS when connected to AC, and additionally
provides the C3 C-state when disconnected from AC. However, the number
of C-states shown in sysfs is fixed to the number of C-states present
at boot.
If I boot with AC connected, I always only see the C-states up to C2
even if I disconnect AC.
The reason is commit 130a5f6924
(ACPI / cpuidle: remove dev->state_count
setting). It removes the update of dev->state_count, but sysfs uses
exactly this variable to show the C-states.
The fix is to use drv->state_count in sysfs. As this is currently the
last user of dev->state_count, this variable can be completely removed."
Remove dev->state_count as per the above.
Reported-by: Thomas Schlichter <thomas.schlichter@web.de>
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: 3.14+ <stable@vger.kernel.org> # 3.14+
[ rjw: Changelog ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
Родитель
e42391cd04
Коммит
d75e4af14e
|
@ -330,9 +330,6 @@ int cpuidle_enable_device(struct cpuidle_device *dev)
|
||||||
if (!dev->registered)
|
if (!dev->registered)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!dev->state_count)
|
|
||||||
dev->state_count = drv->state_count;
|
|
||||||
|
|
||||||
ret = cpuidle_add_device_sysfs(dev);
|
ret = cpuidle_add_device_sysfs(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -401,7 +401,7 @@ static int cpuidle_add_state_sysfs(struct cpuidle_device *device)
|
||||||
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
|
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
|
||||||
|
|
||||||
/* state statistics */
|
/* state statistics */
|
||||||
for (i = 0; i < device->state_count; i++) {
|
for (i = 0; i < drv->state_count; i++) {
|
||||||
kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL);
|
kobj = kzalloc(sizeof(struct cpuidle_state_kobj), GFP_KERNEL);
|
||||||
if (!kobj)
|
if (!kobj)
|
||||||
goto error_state;
|
goto error_state;
|
||||||
|
@ -433,9 +433,10 @@ error_state:
|
||||||
*/
|
*/
|
||||||
static void cpuidle_remove_state_sysfs(struct cpuidle_device *device)
|
static void cpuidle_remove_state_sysfs(struct cpuidle_device *device)
|
||||||
{
|
{
|
||||||
|
struct cpuidle_driver *drv = cpuidle_get_cpu_driver(device);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < device->state_count; i++)
|
for (i = 0; i < drv->state_count; i++)
|
||||||
cpuidle_free_state_kobj(device, i);
|
cpuidle_free_state_kobj(device, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,6 @@ struct cpuidle_device {
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
|
|
||||||
int last_residency;
|
int last_residency;
|
||||||
int state_count;
|
|
||||||
struct cpuidle_state_usage states_usage[CPUIDLE_STATE_MAX];
|
struct cpuidle_state_usage states_usage[CPUIDLE_STATE_MAX];
|
||||||
struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
|
struct cpuidle_state_kobj *kobjs[CPUIDLE_STATE_MAX];
|
||||||
struct cpuidle_driver_kobj *kobj_driver;
|
struct cpuidle_driver_kobj *kobj_driver;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче