OSDN Git Service

PM / tick: Add tracepoints for suspend-to-idle diagnostics
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 9 May 2015 23:23:35 +0000 (01:23 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 14 May 2015 22:26:06 +0000 (00:26 +0200)
Add suspend/resume tracepoints to tick_freeze() and tick_unfreeze()
to catch when timekeeping is suspended and resumed during suspend-to-idle
so as to be able to check whether or not we enter the "frozen" state
and to measure the time spent in it.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
kernel/time/tick-common.c

index 3ae6afa..80c0430 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/profile.h>
 #include <linux/sched.h>
 #include <linux/module.h>
+#include <trace/events/power.h>
 
 #include <asm/irq_regs.h>
 
@@ -457,10 +458,13 @@ void tick_freeze(void)
        raw_spin_lock(&tick_freeze_lock);
 
        tick_freeze_depth++;
-       if (tick_freeze_depth == num_online_cpus())
+       if (tick_freeze_depth == num_online_cpus()) {
+               trace_suspend_resume(TPS("timekeeping_freeze"),
+                                    smp_processor_id(), true);
                timekeeping_suspend();
-       else
+       } else {
                tick_suspend_local();
+       }
 
        raw_spin_unlock(&tick_freeze_lock);
 }
@@ -478,10 +482,13 @@ void tick_unfreeze(void)
 {
        raw_spin_lock(&tick_freeze_lock);
 
-       if (tick_freeze_depth == num_online_cpus())
+       if (tick_freeze_depth == num_online_cpus()) {
                timekeeping_resume();
-       else
+               trace_suspend_resume(TPS("timekeeping_freeze"),
+                                    smp_processor_id(), false);
+       } else {
                tick_resume_local();
+       }
 
        tick_freeze_depth--;