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-6.19-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull power management fixes from Rafael Wysocki:
"These fix three issues in the power capping code including one recent
regression and a runtime PM framework regression introduced during the
6.17 development cycle:

- Fix CPU hotplug locking deadlock reported by lockdep after a recent
update of the Intel RAPL power capping driver (Srinivas Pandruvada)

- Fix sscanf() error return value handling in the power capping core
and a race condition in register_control_type() (Sumeet Pawnikar)

- Fix a concurrent bit field update issue in the runtime PM core code
by only updating the bit field in question when runtime PM is
disabled (Rafael Wysocki)"

* tag 'pm-6.19-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
powercap: intel_rapl: Fix possible recursive lock warning
PM: runtime: Do not clear needs_force_resume with enabled runtime PM
powercap: fix sscanf() error return value handling
powercap: fix race condition in register_control_type()

+50 -26
+12 -10
drivers/base/power/runtime.c
··· 1868 1868 */ 1869 1869 void pm_runtime_reinit(struct device *dev) 1870 1870 { 1871 - if (!pm_runtime_enabled(dev)) { 1872 - if (dev->power.runtime_status == RPM_ACTIVE) 1873 - pm_runtime_set_suspended(dev); 1874 - if (dev->power.irq_safe) { 1875 - spin_lock_irq(&dev->power.lock); 1876 - dev->power.irq_safe = 0; 1877 - spin_unlock_irq(&dev->power.lock); 1878 - if (dev->parent) 1879 - pm_runtime_put(dev->parent); 1880 - } 1871 + if (pm_runtime_enabled(dev)) 1872 + return; 1873 + 1874 + if (dev->power.runtime_status == RPM_ACTIVE) 1875 + pm_runtime_set_suspended(dev); 1876 + 1877 + if (dev->power.irq_safe) { 1878 + spin_lock_irq(&dev->power.lock); 1879 + dev->power.irq_safe = 0; 1880 + spin_unlock_irq(&dev->power.lock); 1881 + if (dev->parent) 1882 + pm_runtime_put(dev->parent); 1881 1883 } 1882 1884 /* 1883 1885 * Clear power.needs_force_resume in case it has been set by
+18 -6
drivers/powercap/intel_rapl_common.c
··· 2032 2032 return ret; 2033 2033 } 2034 2034 2035 - int rapl_package_add_pmu(struct rapl_package *rp) 2035 + int rapl_package_add_pmu_locked(struct rapl_package *rp) 2036 2036 { 2037 2037 struct rapl_package_pmu_data *data = &rp->pmu_data; 2038 2038 int idx; 2039 2039 2040 2040 if (rp->has_pmu) 2041 2041 return -EEXIST; 2042 - 2043 - guard(cpus_read_lock)(); 2044 2042 2045 2043 for (idx = 0; idx < rp->nr_domains; idx++) { 2046 2044 struct rapl_domain *rd = &rp->domains[idx]; ··· 2089 2091 2090 2092 return rapl_pmu_update(rp); 2091 2093 } 2094 + EXPORT_SYMBOL_GPL(rapl_package_add_pmu_locked); 2095 + 2096 + int rapl_package_add_pmu(struct rapl_package *rp) 2097 + { 2098 + guard(cpus_read_lock)(); 2099 + 2100 + return rapl_package_add_pmu_locked(rp); 2101 + } 2092 2102 EXPORT_SYMBOL_GPL(rapl_package_add_pmu); 2093 2103 2094 - void rapl_package_remove_pmu(struct rapl_package *rp) 2104 + void rapl_package_remove_pmu_locked(struct rapl_package *rp) 2095 2105 { 2096 2106 struct rapl_package *pos; 2097 2107 2098 2108 if (!rp->has_pmu) 2099 2109 return; 2100 - 2101 - guard(cpus_read_lock)(); 2102 2110 2103 2111 list_for_each_entry(pos, &rapl_packages, plist) { 2104 2112 /* PMU is still needed */ ··· 2114 2110 2115 2111 perf_pmu_unregister(&rapl_pmu.pmu); 2116 2112 memset(&rapl_pmu, 0, sizeof(struct rapl_pmu)); 2113 + } 2114 + EXPORT_SYMBOL_GPL(rapl_package_remove_pmu_locked); 2115 + 2116 + void rapl_package_remove_pmu(struct rapl_package *rp) 2117 + { 2118 + guard(cpus_read_lock)(); 2119 + 2120 + rapl_package_remove_pmu_locked(rp); 2117 2121 } 2118 2122 EXPORT_SYMBOL_GPL(rapl_package_remove_pmu); 2119 2123 #endif
+2 -2
drivers/powercap/intel_rapl_msr.c
··· 82 82 if (IS_ERR(rp)) 83 83 return PTR_ERR(rp); 84 84 if (rapl_msr_pmu) 85 - rapl_package_add_pmu(rp); 85 + rapl_package_add_pmu_locked(rp); 86 86 } 87 87 cpumask_set_cpu(cpu, &rp->cpumask); 88 88 return 0; ··· 101 101 lead_cpu = cpumask_first(&rp->cpumask); 102 102 if (lead_cpu >= nr_cpu_ids) { 103 103 if (rapl_msr_pmu) 104 - rapl_package_remove_pmu(rp); 104 + rapl_package_remove_pmu_locked(rp); 105 105 rapl_remove_package_cpuslocked(rp); 106 106 } else if (rp->lead_cpu == cpu) { 107 107 rp->lead_cpu = lead_cpu;
+14 -8
drivers/powercap/powercap_sys.c
··· 68 68 int id; \ 69 69 struct powercap_zone_constraint *pconst;\ 70 70 \ 71 - if (!sscanf(dev_attr->attr.name, "constraint_%d_", &id)) \ 71 + if (sscanf(dev_attr->attr.name, "constraint_%d_", &id) != 1) \ 72 72 return -EINVAL; \ 73 73 if (id >= power_zone->const_id_cnt) \ 74 74 return -EINVAL; \ ··· 93 93 int id; \ 94 94 struct powercap_zone_constraint *pconst;\ 95 95 \ 96 - if (!sscanf(dev_attr->attr.name, "constraint_%d_", &id)) \ 96 + if (sscanf(dev_attr->attr.name, "constraint_%d_", &id) != 1) \ 97 97 return -EINVAL; \ 98 98 if (id >= power_zone->const_id_cnt) \ 99 99 return -EINVAL; \ ··· 162 162 ssize_t len = -ENODATA; 163 163 struct powercap_zone_constraint *pconst; 164 164 165 - if (!sscanf(dev_attr->attr.name, "constraint_%d_", &id)) 165 + if (sscanf(dev_attr->attr.name, "constraint_%d_", &id) != 1) 166 166 return -EINVAL; 167 167 if (id >= power_zone->const_id_cnt) 168 168 return -EINVAL; ··· 625 625 INIT_LIST_HEAD(&control_type->node); 626 626 control_type->dev.class = &powercap_class; 627 627 dev_set_name(&control_type->dev, "%s", name); 628 - result = device_register(&control_type->dev); 629 - if (result) { 630 - put_device(&control_type->dev); 631 - return ERR_PTR(result); 632 - } 633 628 idr_init(&control_type->idr); 634 629 635 630 mutex_lock(&powercap_cntrl_list_lock); 636 631 list_add_tail(&control_type->node, &powercap_cntrl_list); 637 632 mutex_unlock(&powercap_cntrl_list_lock); 633 + 634 + result = device_register(&control_type->dev); 635 + if (result) { 636 + mutex_lock(&powercap_cntrl_list_lock); 637 + list_del(&control_type->node); 638 + mutex_unlock(&powercap_cntrl_list_lock); 639 + 640 + idr_destroy(&control_type->idr); 641 + put_device(&control_type->dev); 642 + return ERR_PTR(result); 643 + } 638 644 639 645 return control_type; 640 646 }
+4
include/linux/intel_rapl.h
··· 214 214 215 215 #ifdef CONFIG_PERF_EVENTS 216 216 int rapl_package_add_pmu(struct rapl_package *rp); 217 + int rapl_package_add_pmu_locked(struct rapl_package *rp); 217 218 void rapl_package_remove_pmu(struct rapl_package *rp); 219 + void rapl_package_remove_pmu_locked(struct rapl_package *rp); 218 220 #else 219 221 static inline int rapl_package_add_pmu(struct rapl_package *rp) { return 0; } 222 + static inline int rapl_package_add_pmu_locked(struct rapl_package *rp) { return 0; } 220 223 static inline void rapl_package_remove_pmu(struct rapl_package *rp) { } 224 + static inline void rapl_package_remove_pmu_locked(struct rapl_package *rp) { } 221 225 #endif 222 226 223 227 #endif /* __INTEL_RAPL_H__ */