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 /drivers | |
| 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()
Diffstat (limited to 'drivers')
| -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); |
