diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-10-09 21:39:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-10-09 21:39:04 -0400 |
commit | 149fadf2ce82e0f8632fc1fb10a7ba6e0c977ee2 (patch) | |
tree | caf1d074cd6c2be1ad9cfc7544686b1640272c00 | |
parent | 71419b7b8484531626251d56aa6d48d90e646df1 (diff) | |
parent | 670aee3fc7ac37ae947f8b582d87b51d5fa36524 (diff) |
Merge tag 'pm+acpi-4.3-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management and ACPI fixes from Rafael Wysocki:
"These are four fixes for bugs in the devfreq and cpufreq subsystems,
including two regression fixes (one for a recent regression and one
for a problem introduced in 4.2).
Specifics:
- Two fixes for cpufreq regressions, an acpi-cpufreq driver one
introduced during the 4.2 cycle when we started to preserve cpufreq
directories for offline CPUs and a general one introduced recently
(Srinivas Pandruvada).
- Two devfreq fixes, one for a double kfree() in an error code path
and one for a confusing sysfs-related failure (Geliang Tang, Tobias
Jakobi)"
* tag 'pm+acpi-4.3-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
cpufreq: prevent lockup on reading scaling_available_frequencies
cpufreq: acpi_cpufreq: prevent crash on reading freqdomain_cpus
PM / devfreq: fix double kfree
PM / devfreq: Fix governor_store()
-rw-r--r-- | drivers/cpufreq/acpi-cpufreq.c | 3 | ||||
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 4 | ||||
-rw-r--r-- | drivers/devfreq/devfreq.c | 7 |
3 files changed, 10 insertions, 4 deletions
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 798277227de7..cec1ee2d2f74 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c | |||
@@ -149,6 +149,9 @@ static ssize_t show_freqdomain_cpus(struct cpufreq_policy *policy, char *buf) | |||
149 | { | 149 | { |
150 | struct acpi_cpufreq_data *data = policy->driver_data; | 150 | struct acpi_cpufreq_data *data = policy->driver_data; |
151 | 151 | ||
152 | if (unlikely(!data)) | ||
153 | return -ENODEV; | ||
154 | |||
152 | return cpufreq_show_cpus(data->freqdomain_cpus, buf); | 155 | return cpufreq_show_cpus(data->freqdomain_cpus, buf); |
153 | } | 156 | } |
154 | 157 | ||
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index ef5ed9470de9..25c4c15103a0 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1436,8 +1436,10 @@ static void cpufreq_offline_finish(unsigned int cpu) | |||
1436 | * since this is a core component, and is essential for the | 1436 | * since this is a core component, and is essential for the |
1437 | * subsequent light-weight ->init() to succeed. | 1437 | * subsequent light-weight ->init() to succeed. |
1438 | */ | 1438 | */ |
1439 | if (cpufreq_driver->exit) | 1439 | if (cpufreq_driver->exit) { |
1440 | cpufreq_driver->exit(policy); | 1440 | cpufreq_driver->exit(policy); |
1441 | policy->freq_table = NULL; | ||
1442 | } | ||
1441 | } | 1443 | } |
1442 | 1444 | ||
1443 | /** | 1445 | /** |
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 3927ed9fdbd5..ca848cc6a8fd 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c | |||
@@ -492,7 +492,7 @@ struct devfreq *devfreq_add_device(struct device *dev, | |||
492 | if (err) { | 492 | if (err) { |
493 | put_device(&devfreq->dev); | 493 | put_device(&devfreq->dev); |
494 | mutex_unlock(&devfreq->lock); | 494 | mutex_unlock(&devfreq->lock); |
495 | goto err_dev; | 495 | goto err_out; |
496 | } | 496 | } |
497 | 497 | ||
498 | mutex_unlock(&devfreq->lock); | 498 | mutex_unlock(&devfreq->lock); |
@@ -518,7 +518,6 @@ struct devfreq *devfreq_add_device(struct device *dev, | |||
518 | err_init: | 518 | err_init: |
519 | list_del(&devfreq->node); | 519 | list_del(&devfreq->node); |
520 | device_unregister(&devfreq->dev); | 520 | device_unregister(&devfreq->dev); |
521 | err_dev: | ||
522 | kfree(devfreq); | 521 | kfree(devfreq); |
523 | err_out: | 522 | err_out: |
524 | return ERR_PTR(err); | 523 | return ERR_PTR(err); |
@@ -795,8 +794,10 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr, | |||
795 | ret = PTR_ERR(governor); | 794 | ret = PTR_ERR(governor); |
796 | goto out; | 795 | goto out; |
797 | } | 796 | } |
798 | if (df->governor == governor) | 797 | if (df->governor == governor) { |
798 | ret = 0; | ||
799 | goto out; | 799 | goto out; |
800 | } | ||
800 | 801 | ||
801 | if (df->governor) { | 802 | if (df->governor) { |
802 | ret = df->governor->event_handler(df, DEVFREQ_GOV_STOP, NULL); | 803 | ret = df->governor->event_handler(df, DEVFREQ_GOV_STOP, NULL); |