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

Pull power management fixes from Rafael Wysocki:
"These fix more fallout of recent RCU-lockdep changes in CPU idle code
and two devfreq issues.

Specifics:

- Export rcu_idle_{enter,exit} to modules to fix build issues
introduced by recent RCU-lockdep fixes (Borislav Petkov)

- Add missing return statement to a stub function in the ACPI
processor driver to fix a build issue introduced by recent
RCU-lockdep fixes (Rafael Wysocki)

- Fix recently introduced suspicious RCU usage warnings in the PSCI
cpuidle driver and drop stale comments regarding RCU_NONIDLE()
usage from enter_s2idle_proper() (Ulf Hansson)

- Fix error code path in the tegra30 devfreq driver (Dan Carpenter)

- Add missing information to devfreq_summary debugfs (Chanwoo Choi)"

* tag 'pm-5.9-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
ACPI: processor: Fix build for ARCH_APICTIMER_STOPS_ON_C3 unset
PM / devfreq: tegra30: Disable clock on error in probe
PM / devfreq: Add timer type to devfreq_summary debugfs
cpuidle: Drop misleading comments about RCU usage
cpuidle: psci: Fix suspicious RCU usage
rcu/tree: Export rcu_idle_{enter,exit} to modules

+16 -16
+1
drivers/acpi/processor_idle.c
··· 176 176 static bool lapic_timer_needs_broadcast(struct acpi_processor *pr, 177 177 struct acpi_processor_cx *cx) 178 178 { 179 + return false; 179 180 } 180 181 181 182 #endif
+2 -2
drivers/cpuidle/cpuidle-psci.c
··· 66 66 return -1; 67 67 68 68 /* Do runtime PM to manage a hierarchical CPU toplogy. */ 69 - pm_runtime_put_sync_suspend(pd_dev); 69 + RCU_NONIDLE(pm_runtime_put_sync_suspend(pd_dev)); 70 70 71 71 state = psci_get_domain_state(); 72 72 if (!state) ··· 74 74 75 75 ret = psci_cpu_suspend_enter(state) ? -1 : idx; 76 76 77 - pm_runtime_get_sync(pd_dev); 77 + RCU_NONIDLE(pm_runtime_get_sync(pd_dev)); 78 78 79 79 cpu_pm_exit(); 80 80
-10
drivers/cpuidle/cpuidle.c
··· 142 142 143 143 time_start = ns_to_ktime(local_clock()); 144 144 145 - /* 146 - * trace_suspend_resume() called by tick_freeze() for the last CPU 147 - * executing it contains RCU usage regarded as invalid in the idle 148 - * context, so tell RCU about that. 149 - */ 150 145 tick_freeze(); 151 146 /* 152 147 * The state used here cannot be a "coupled" one, because the "coupled" ··· 154 159 target_state->enter_s2idle(dev, drv, index); 155 160 if (WARN_ON_ONCE(!irqs_disabled())) 156 161 local_irq_disable(); 157 - /* 158 - * timekeeping_resume() that will be called by tick_unfreeze() for the 159 - * first CPU executing it calls functions containing RCU read-side 160 - * critical sections, so tell RCU about that. 161 - */ 162 162 if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE)) 163 163 rcu_idle_exit(); 164 164 tick_unfreeze();
+8 -3
drivers/devfreq/devfreq.c
··· 1766 1766 struct devfreq *p_devfreq = NULL; 1767 1767 unsigned long cur_freq, min_freq, max_freq; 1768 1768 unsigned int polling_ms; 1769 + unsigned int timer; 1769 1770 1770 - seq_printf(s, "%-30s %-30s %-15s %10s %12s %12s %12s\n", 1771 + seq_printf(s, "%-30s %-30s %-15s %-10s %10s %12s %12s %12s\n", 1771 1772 "dev", 1772 1773 "parent_dev", 1773 1774 "governor", 1775 + "timer", 1774 1776 "polling_ms", 1775 1777 "cur_freq_Hz", 1776 1778 "min_freq_Hz", 1777 1779 "max_freq_Hz"); 1778 - seq_printf(s, "%30s %30s %15s %10s %12s %12s %12s\n", 1780 + seq_printf(s, "%30s %30s %15s %10s %10s %12s %12s %12s\n", 1779 1781 "------------------------------", 1780 1782 "------------------------------", 1781 1783 "---------------", 1784 + "----------", 1782 1785 "----------", 1783 1786 "------------", 1784 1787 "------------", ··· 1806 1803 cur_freq = devfreq->previous_freq; 1807 1804 get_freq_range(devfreq, &min_freq, &max_freq); 1808 1805 polling_ms = devfreq->profile->polling_ms; 1806 + timer = devfreq->profile->timer; 1809 1807 mutex_unlock(&devfreq->lock); 1810 1808 1811 1809 seq_printf(s, 1812 - "%-30s %-30s %-15s %10d %12ld %12ld %12ld\n", 1810 + "%-30s %-30s %-15s %-10s %10d %12ld %12ld %12ld\n", 1813 1811 dev_name(&devfreq->dev), 1814 1812 p_devfreq ? dev_name(&p_devfreq->dev) : "null", 1815 1813 devfreq->governor_name, 1814 + polling_ms ? timer_name[timer] : "null", 1816 1815 polling_ms, 1817 1816 cur_freq, 1818 1817 min_freq,
+3 -1
drivers/devfreq/tegra30-devfreq.c
··· 836 836 rate = clk_round_rate(tegra->emc_clock, ULONG_MAX); 837 837 if (rate < 0) { 838 838 dev_err(&pdev->dev, "Failed to round clock rate: %ld\n", rate); 839 - return rate; 839 + err = rate; 840 + goto disable_clk; 840 841 } 841 842 842 843 tegra->max_freq = rate / KHZ; ··· 898 897 dev_pm_opp_remove_all_dynamic(&pdev->dev); 899 898 900 899 reset_control_reset(tegra->reset); 900 + disable_clk: 901 901 clk_disable_unprepare(tegra->clock); 902 902 903 903 return err;
+2
kernel/rcu/tree.c
··· 673 673 lockdep_assert_irqs_disabled(); 674 674 rcu_eqs_enter(false); 675 675 } 676 + EXPORT_SYMBOL_GPL(rcu_idle_enter); 676 677 677 678 #ifdef CONFIG_NO_HZ_FULL 678 679 /** ··· 887 886 rcu_eqs_exit(false); 888 887 local_irq_restore(flags); 889 888 } 889 + EXPORT_SYMBOL_GPL(rcu_idle_exit); 890 890 891 891 #ifdef CONFIG_NO_HZ_FULL 892 892 /**