diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-22 15:03:19 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-22 15:03:19 -0400 |
| commit | b44290a022dcffb5ca3b75300e571fad06214bc7 (patch) | |
| tree | 1d20a201c14f63f13605a6c13af5d641557bc189 | |
| parent | 599beede718182cd85d5e1dc2d4e523c05d5014c (diff) | |
| parent | 112a04f653ddf1d4246415e8e0d820002ebe8dca (diff) | |
Merge tag 'pm-5.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management fixes from Rafael Wysocki:
"These rearrange some code in the generic power domains (genpd)
framework to avoid a potential deadlock and make the turbostat utility
behave more as expected.
Specifics:
- Rearrange the generic power domains (genpd) code to avoid a
potential deadlock possible due to its interactions with the clock
framework (Jiada Wang)
- Make turbostat return the exit status of the command run under it
if that command fails (David Arcari)"
* tag 'pm-5.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
PM / Domains: Avoid a potential deadlock
tools/power turbostat: return the exit status of a command
| -rw-r--r-- | drivers/base/power/domain.c | 13 | ||||
| -rw-r--r-- | tools/power/x86/turbostat/turbostat.c | 3 |
2 files changed, 9 insertions, 7 deletions
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index 76c9969b7124..96a6dc9d305c 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
| @@ -1469,12 +1469,12 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, | |||
| 1469 | if (IS_ERR(gpd_data)) | 1469 | if (IS_ERR(gpd_data)) |
| 1470 | return PTR_ERR(gpd_data); | 1470 | return PTR_ERR(gpd_data); |
| 1471 | 1471 | ||
| 1472 | genpd_lock(genpd); | ||
| 1473 | |||
| 1474 | ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; | 1472 | ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0; |
| 1475 | if (ret) | 1473 | if (ret) |
| 1476 | goto out; | 1474 | goto out; |
| 1477 | 1475 | ||
| 1476 | genpd_lock(genpd); | ||
| 1477 | |||
| 1478 | dev_pm_domain_set(dev, &genpd->domain); | 1478 | dev_pm_domain_set(dev, &genpd->domain); |
| 1479 | 1479 | ||
| 1480 | genpd->device_count++; | 1480 | genpd->device_count++; |
| @@ -1482,9 +1482,8 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev, | |||
| 1482 | 1482 | ||
| 1483 | list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); | 1483 | list_add_tail(&gpd_data->base.list_node, &genpd->dev_list); |
| 1484 | 1484 | ||
| 1485 | out: | ||
| 1486 | genpd_unlock(genpd); | 1485 | genpd_unlock(genpd); |
| 1487 | 1486 | out: | |
| 1488 | if (ret) | 1487 | if (ret) |
| 1489 | genpd_free_dev_data(dev, gpd_data); | 1488 | genpd_free_dev_data(dev, gpd_data); |
| 1490 | else | 1489 | else |
| @@ -1533,15 +1532,15 @@ static int genpd_remove_device(struct generic_pm_domain *genpd, | |||
| 1533 | genpd->device_count--; | 1532 | genpd->device_count--; |
| 1534 | genpd->max_off_time_changed = true; | 1533 | genpd->max_off_time_changed = true; |
| 1535 | 1534 | ||
| 1536 | if (genpd->detach_dev) | ||
| 1537 | genpd->detach_dev(genpd, dev); | ||
| 1538 | |||
| 1539 | dev_pm_domain_set(dev, NULL); | 1535 | dev_pm_domain_set(dev, NULL); |
| 1540 | 1536 | ||
| 1541 | list_del_init(&pdd->list_node); | 1537 | list_del_init(&pdd->list_node); |
| 1542 | 1538 | ||
| 1543 | genpd_unlock(genpd); | 1539 | genpd_unlock(genpd); |
| 1544 | 1540 | ||
| 1541 | if (genpd->detach_dev) | ||
| 1542 | genpd->detach_dev(genpd, dev); | ||
| 1543 | |||
| 1545 | genpd_free_dev_data(dev, gpd_data); | 1544 | genpd_free_dev_data(dev, gpd_data); |
| 1546 | 1545 | ||
| 1547 | return 0; | 1546 | return 0; |
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 9327c0ddc3a5..c3fad065c89c 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c | |||
| @@ -5077,6 +5077,9 @@ int fork_it(char **argv) | |||
| 5077 | signal(SIGQUIT, SIG_IGN); | 5077 | signal(SIGQUIT, SIG_IGN); |
| 5078 | if (waitpid(child_pid, &status, 0) == -1) | 5078 | if (waitpid(child_pid, &status, 0) == -1) |
| 5079 | err(status, "waitpid"); | 5079 | err(status, "waitpid"); |
| 5080 | |||
| 5081 | if (WIFEXITED(status)) | ||
| 5082 | status = WEXITSTATUS(status); | ||
| 5080 | } | 5083 | } |
| 5081 | /* | 5084 | /* |
| 5082 | * n.b. fork_it() does not check for errors from for_all_cpus() | 5085 | * n.b. fork_it() does not check for errors from for_all_cpus() |
