Power management fixes for 5.9-rc7
- 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). -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAl9uHyQSHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRxnx8P/Arz1UzuJVPla7JMp/xCwxAHPcuI/0yP U1oM5CBtFN68kWaA+tIjhEfH6nw/7dOpnF1YpEkhoVZBLzM48AYbBDhtqVHYI8vq 6HRnntoTGYCxGSEsG1aTLdEMa1htfqLu6Q+gdrGZKhRygW4LMdiCnWBcGrzMdPil VVkAmf3bKp9gR1hibNhB475uQs2+ZD0LOBw2pKvn+v2XRzgj7lltpDfkjvZGuzwy jTvt5GMffcyoD7ghMU5I2xH8e7egGVdkxqNFukz7w/5zDRmbJ6T0C0IbSUkHzuvE 79owcQcsrMNvTXnSGAIMpv30gKOCcLRY/mQWNDeduqF34Rrv0I4GOUKaf6fOdm50 R2WHvxAFDw+T3ExP75anacQw/daladN6lkufxWjFvvYe4aqPaBt6YF6V11gKOGft xP2B6h1XHP7RwFr8IhVrcKuRN4xmXLqcipfja+rpO0h4Wcu8asOvhdxdmS/BNANc wjJtBIykB5vFnaRUMwmPFWINWzgsBZ7h5QzZTvytD8g4sFX63/XlezWwYvC7w489 Qg/l7r86fJD5C/TOpUipK320mj/5Ndypgpu5U01salE/XYgWwIRy2a6ETk4tzTBC VpXNRiWPolikpjEqm7arCjm0l7oNOQypauN6yI4joWjWt2KttNAvl7HrY/crzLqT FL1M9LNJmAlS =lea/ -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
15083aa025
|
@ -176,6 +176,7 @@ static void lapic_timer_propagate_broadcast(struct acpi_processor *pr) { }
|
||||||
static bool lapic_timer_needs_broadcast(struct acpi_processor *pr,
|
static bool lapic_timer_needs_broadcast(struct acpi_processor *pr,
|
||||||
struct acpi_processor_cx *cx)
|
struct acpi_processor_cx *cx)
|
||||||
{
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -66,7 +66,7 @@ static int psci_enter_domain_idle_state(struct cpuidle_device *dev,
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Do runtime PM to manage a hierarchical CPU toplogy. */
|
/* Do runtime PM to manage a hierarchical CPU toplogy. */
|
||||||
pm_runtime_put_sync_suspend(pd_dev);
|
RCU_NONIDLE(pm_runtime_put_sync_suspend(pd_dev));
|
||||||
|
|
||||||
state = psci_get_domain_state();
|
state = psci_get_domain_state();
|
||||||
if (!state)
|
if (!state)
|
||||||
|
@ -74,7 +74,7 @@ static int psci_enter_domain_idle_state(struct cpuidle_device *dev,
|
||||||
|
|
||||||
ret = psci_cpu_suspend_enter(state) ? -1 : idx;
|
ret = psci_cpu_suspend_enter(state) ? -1 : idx;
|
||||||
|
|
||||||
pm_runtime_get_sync(pd_dev);
|
RCU_NONIDLE(pm_runtime_get_sync(pd_dev));
|
||||||
|
|
||||||
cpu_pm_exit();
|
cpu_pm_exit();
|
||||||
|
|
||||||
|
|
|
@ -142,11 +142,6 @@ static void enter_s2idle_proper(struct cpuidle_driver *drv,
|
||||||
|
|
||||||
time_start = ns_to_ktime(local_clock());
|
time_start = ns_to_ktime(local_clock());
|
||||||
|
|
||||||
/*
|
|
||||||
* trace_suspend_resume() called by tick_freeze() for the last CPU
|
|
||||||
* executing it contains RCU usage regarded as invalid in the idle
|
|
||||||
* context, so tell RCU about that.
|
|
||||||
*/
|
|
||||||
tick_freeze();
|
tick_freeze();
|
||||||
/*
|
/*
|
||||||
* The state used here cannot be a "coupled" one, because the "coupled"
|
* The state used here cannot be a "coupled" one, because the "coupled"
|
||||||
|
@ -159,11 +154,6 @@ static void enter_s2idle_proper(struct cpuidle_driver *drv,
|
||||||
target_state->enter_s2idle(dev, drv, index);
|
target_state->enter_s2idle(dev, drv, index);
|
||||||
if (WARN_ON_ONCE(!irqs_disabled()))
|
if (WARN_ON_ONCE(!irqs_disabled()))
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
/*
|
|
||||||
* timekeeping_resume() that will be called by tick_unfreeze() for the
|
|
||||||
* first CPU executing it calls functions containing RCU read-side
|
|
||||||
* critical sections, so tell RCU about that.
|
|
||||||
*/
|
|
||||||
if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
|
if (!(target_state->flags & CPUIDLE_FLAG_RCU_IDLE))
|
||||||
rcu_idle_exit();
|
rcu_idle_exit();
|
||||||
tick_unfreeze();
|
tick_unfreeze();
|
||||||
|
|
|
@ -1766,20 +1766,23 @@ static int devfreq_summary_show(struct seq_file *s, void *data)
|
||||||
struct devfreq *p_devfreq = NULL;
|
struct devfreq *p_devfreq = NULL;
|
||||||
unsigned long cur_freq, min_freq, max_freq;
|
unsigned long cur_freq, min_freq, max_freq;
|
||||||
unsigned int polling_ms;
|
unsigned int polling_ms;
|
||||||
|
unsigned int timer;
|
||||||
|
|
||||||
seq_printf(s, "%-30s %-30s %-15s %10s %12s %12s %12s\n",
|
seq_printf(s, "%-30s %-30s %-15s %-10s %10s %12s %12s %12s\n",
|
||||||
"dev",
|
"dev",
|
||||||
"parent_dev",
|
"parent_dev",
|
||||||
"governor",
|
"governor",
|
||||||
|
"timer",
|
||||||
"polling_ms",
|
"polling_ms",
|
||||||
"cur_freq_Hz",
|
"cur_freq_Hz",
|
||||||
"min_freq_Hz",
|
"min_freq_Hz",
|
||||||
"max_freq_Hz");
|
"max_freq_Hz");
|
||||||
seq_printf(s, "%30s %30s %15s %10s %12s %12s %12s\n",
|
seq_printf(s, "%30s %30s %15s %10s %10s %12s %12s %12s\n",
|
||||||
"------------------------------",
|
"------------------------------",
|
||||||
"------------------------------",
|
"------------------------------",
|
||||||
"---------------",
|
"---------------",
|
||||||
"----------",
|
"----------",
|
||||||
|
"----------",
|
||||||
"------------",
|
"------------",
|
||||||
"------------",
|
"------------",
|
||||||
"------------");
|
"------------");
|
||||||
|
@ -1803,13 +1806,15 @@ static int devfreq_summary_show(struct seq_file *s, void *data)
|
||||||
cur_freq = devfreq->previous_freq;
|
cur_freq = devfreq->previous_freq;
|
||||||
get_freq_range(devfreq, &min_freq, &max_freq);
|
get_freq_range(devfreq, &min_freq, &max_freq);
|
||||||
polling_ms = devfreq->profile->polling_ms;
|
polling_ms = devfreq->profile->polling_ms;
|
||||||
|
timer = devfreq->profile->timer;
|
||||||
mutex_unlock(&devfreq->lock);
|
mutex_unlock(&devfreq->lock);
|
||||||
|
|
||||||
seq_printf(s,
|
seq_printf(s,
|
||||||
"%-30s %-30s %-15s %10d %12ld %12ld %12ld\n",
|
"%-30s %-30s %-15s %-10s %10d %12ld %12ld %12ld\n",
|
||||||
dev_name(&devfreq->dev),
|
dev_name(&devfreq->dev),
|
||||||
p_devfreq ? dev_name(&p_devfreq->dev) : "null",
|
p_devfreq ? dev_name(&p_devfreq->dev) : "null",
|
||||||
devfreq->governor_name,
|
devfreq->governor_name,
|
||||||
|
polling_ms ? timer_name[timer] : "null",
|
||||||
polling_ms,
|
polling_ms,
|
||||||
cur_freq,
|
cur_freq,
|
||||||
min_freq,
|
min_freq,
|
||||||
|
|
|
@ -836,7 +836,8 @@ static int tegra_devfreq_probe(struct platform_device *pdev)
|
||||||
rate = clk_round_rate(tegra->emc_clock, ULONG_MAX);
|
rate = clk_round_rate(tegra->emc_clock, ULONG_MAX);
|
||||||
if (rate < 0) {
|
if (rate < 0) {
|
||||||
dev_err(&pdev->dev, "Failed to round clock rate: %ld\n", rate);
|
dev_err(&pdev->dev, "Failed to round clock rate: %ld\n", rate);
|
||||||
return rate;
|
err = rate;
|
||||||
|
goto disable_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
tegra->max_freq = rate / KHZ;
|
tegra->max_freq = rate / KHZ;
|
||||||
|
@ -897,6 +898,7 @@ remove_opps:
|
||||||
dev_pm_opp_remove_all_dynamic(&pdev->dev);
|
dev_pm_opp_remove_all_dynamic(&pdev->dev);
|
||||||
|
|
||||||
reset_control_reset(tegra->reset);
|
reset_control_reset(tegra->reset);
|
||||||
|
disable_clk:
|
||||||
clk_disable_unprepare(tegra->clock);
|
clk_disable_unprepare(tegra->clock);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -673,6 +673,7 @@ void rcu_idle_enter(void)
|
||||||
lockdep_assert_irqs_disabled();
|
lockdep_assert_irqs_disabled();
|
||||||
rcu_eqs_enter(false);
|
rcu_eqs_enter(false);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(rcu_idle_enter);
|
||||||
|
|
||||||
#ifdef CONFIG_NO_HZ_FULL
|
#ifdef CONFIG_NO_HZ_FULL
|
||||||
/**
|
/**
|
||||||
|
@ -886,6 +887,7 @@ void rcu_idle_exit(void)
|
||||||
rcu_eqs_exit(false);
|
rcu_eqs_exit(false);
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(rcu_idle_exit);
|
||||||
|
|
||||||
#ifdef CONFIG_NO_HZ_FULL
|
#ifdef CONFIG_NO_HZ_FULL
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue