Thread (29 messages) 29 messages, 4 authors, 2016-05-23

Crash after 'reboot' due to 9be4fd2c7723a

From: Rafael J. Wysocki <hidden>
Date: 2016-05-20 21:20:59
Also in: linux-pm

On Friday, May 20, 2016 03:32:43 PM Fabio Estevam wrote:
On Fri, May 20, 2016 at 3:05 PM, Fabio Estevam [off-list ref] wrote:
quoted
Rafael,

Running the 'reboot' command works fine on a 4.5 kernel running on a
mx6ul platform (ARM single core SoC), but it crashes on 4.6.

Running bisect I got 9be4fd2c7723a3057b0b39676 ("cpufreq: governor:
Replace timers with utilization update callbacks") as the first bad
commit.

Below is the output crash log.

Not sure if this issue is related to the problem reported by Guenter here:
http://lkml.iu.edu/hypermail/linux/kernel/1602.1/06075.html

Any ideas?
If I rebuilt a kernel with SMP=n then the reboot command works as expected.
Does it work if you boot with maxcpus=1 or nosmp in the kernel command line?

Also, please try if the appended patch makes any difference.

---
 drivers/base/core.c       |    3 +++
 drivers/cpufreq/cpufreq.c |   11 -----------
 2 files changed, 3 insertions(+), 11 deletions(-)

Index: linux-pm/drivers/cpufreq/cpufreq.c
===================================================================
--- linux-pm.orig/drivers/cpufreq/cpufreq.c
+++ linux-pm/drivers/cpufreq/cpufreq.c
@@ -27,7 +27,6 @@
 #include <linux/mutex.h>
 #include <linux/slab.h>
 #include <linux/suspend.h>
-#include <linux/syscore_ops.h>
 #include <linux/tick.h>
 #include <trace/events/power.h>
 
@@ -2556,14 +2555,6 @@ int cpufreq_unregister_driver(struct cpu
 }
 EXPORT_SYMBOL_GPL(cpufreq_unregister_driver);
 
-/*
- * Stop cpufreq at shutdown to make sure it isn't holding any locks
- * or mutexes when secondary CPUs are halted.
- */
-static struct syscore_ops cpufreq_syscore_ops = {
-	.shutdown = cpufreq_suspend,
-};
-
 struct kobject *cpufreq_global_kobject;
 EXPORT_SYMBOL(cpufreq_global_kobject);
 
@@ -2575,8 +2566,6 @@ static int __init cpufreq_core_init(void
 	cpufreq_global_kobject = kobject_create_and_add("cpufreq", &cpu_subsys.dev_root->kobj);
 	BUG_ON(!cpufreq_global_kobject);
 
-	register_syscore_ops(&cpufreq_syscore_ops);
-
 	return 0;
 }
 core_initcall(cpufreq_core_init);
Index: linux-pm/drivers/base/core.c
===================================================================
--- linux-pm.orig/drivers/base/core.c
+++ linux-pm/drivers/base/core.c
@@ -10,6 +10,7 @@
  *
  */
 
+#include <linux/cpufreq.h>
 #include <linux/device.h>
 #include <linux/err.h>
 #include <linux/fwnode.h>
@@ -2042,6 +2043,8 @@ void device_shutdown(void)
 {
 	struct device *dev, *parent;
 
+	cpufreq_suspend();
+
 	spin_lock(&devices_kset->list_lock);
 	/*
 	 * Walk the devices list backward, shutting down each in turn.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help