PM / sleep: trace events for suspend/resume
Adds trace events that give finer resolution into suspend/resume. These events are graphed in the timelines generated by the analyze_suspend.py script. They represent large areas of time consumed that are typical to suspend and resume. The event is triggered by calling the function "trace_suspend_resume" with three arguments: a string (the name of the event to be displayed in the timeline), an integer (case specific number, such as the power state or cpu number), and a boolean (where true is used to denote the start of the timeline event, and false to denote the end). The suspend_resume trace event reproduces the data that the machine_suspend trace event did, so the latter has been removed. Signed-off-by: Todd Brandt <todd.e.brandt@intel.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
@@ -545,6 +545,7 @@ static void dpm_resume_noirq(pm_message_t state)
|
||||
struct device *dev;
|
||||
ktime_t starttime = ktime_get();
|
||||
|
||||
trace_suspend_resume(TPS("dpm_resume_noirq"), state.event, true);
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
pm_transition = state;
|
||||
|
||||
@@ -587,6 +588,7 @@ static void dpm_resume_noirq(pm_message_t state)
|
||||
dpm_show_time(starttime, state, "noirq");
|
||||
resume_device_irqs();
|
||||
cpuidle_resume();
|
||||
trace_suspend_resume(TPS("dpm_resume_noirq"), state.event, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -664,6 +666,7 @@ static void dpm_resume_early(pm_message_t state)
|
||||
struct device *dev;
|
||||
ktime_t starttime = ktime_get();
|
||||
|
||||
trace_suspend_resume(TPS("dpm_resume_early"), state.event, true);
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
pm_transition = state;
|
||||
|
||||
@@ -703,6 +706,7 @@ static void dpm_resume_early(pm_message_t state)
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
async_synchronize_full();
|
||||
dpm_show_time(starttime, state, "early");
|
||||
trace_suspend_resume(TPS("dpm_resume_early"), state.event, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -834,6 +838,7 @@ void dpm_resume(pm_message_t state)
|
||||
struct device *dev;
|
||||
ktime_t starttime = ktime_get();
|
||||
|
||||
trace_suspend_resume(TPS("dpm_resume"), state.event, true);
|
||||
might_sleep();
|
||||
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
@@ -875,6 +880,7 @@ void dpm_resume(pm_message_t state)
|
||||
dpm_show_time(starttime, state, NULL);
|
||||
|
||||
cpufreq_resume();
|
||||
trace_suspend_resume(TPS("dpm_resume"), state.event, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -932,6 +938,7 @@ void dpm_complete(pm_message_t state)
|
||||
{
|
||||
struct list_head list;
|
||||
|
||||
trace_suspend_resume(TPS("dpm_complete"), state.event, true);
|
||||
might_sleep();
|
||||
|
||||
INIT_LIST_HEAD(&list);
|
||||
@@ -951,6 +958,7 @@ void dpm_complete(pm_message_t state)
|
||||
}
|
||||
list_splice(&list, &dpm_list);
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
trace_suspend_resume(TPS("dpm_complete"), state.event, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1086,6 +1094,7 @@ static int dpm_suspend_noirq(pm_message_t state)
|
||||
ktime_t starttime = ktime_get();
|
||||
int error = 0;
|
||||
|
||||
trace_suspend_resume(TPS("dpm_suspend_noirq"), state.event, true);
|
||||
cpuidle_pause();
|
||||
suspend_device_irqs();
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
@@ -1126,6 +1135,7 @@ static int dpm_suspend_noirq(pm_message_t state)
|
||||
} else {
|
||||
dpm_show_time(starttime, state, "noirq");
|
||||
}
|
||||
trace_suspend_resume(TPS("dpm_suspend_noirq"), state.event, false);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -1222,6 +1232,7 @@ static int dpm_suspend_late(pm_message_t state)
|
||||
ktime_t starttime = ktime_get();
|
||||
int error = 0;
|
||||
|
||||
trace_suspend_resume(TPS("dpm_suspend_late"), state.event, true);
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
pm_transition = state;
|
||||
async_error = 0;
|
||||
@@ -1257,6 +1268,7 @@ static int dpm_suspend_late(pm_message_t state)
|
||||
} else {
|
||||
dpm_show_time(starttime, state, "late");
|
||||
}
|
||||
trace_suspend_resume(TPS("dpm_suspend_late"), state.event, false);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -1461,6 +1473,7 @@ int dpm_suspend(pm_message_t state)
|
||||
ktime_t starttime = ktime_get();
|
||||
int error = 0;
|
||||
|
||||
trace_suspend_resume(TPS("dpm_suspend"), state.event, true);
|
||||
might_sleep();
|
||||
|
||||
cpufreq_suspend();
|
||||
@@ -1498,6 +1511,7 @@ int dpm_suspend(pm_message_t state)
|
||||
dpm_save_failed_step(SUSPEND_SUSPEND);
|
||||
} else
|
||||
dpm_show_time(starttime, state, NULL);
|
||||
trace_suspend_resume(TPS("dpm_suspend"), state.event, false);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -1582,6 +1596,7 @@ int dpm_prepare(pm_message_t state)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
trace_suspend_resume(TPS("dpm_prepare"), state.event, true);
|
||||
might_sleep();
|
||||
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
@@ -1612,6 +1627,7 @@ int dpm_prepare(pm_message_t state)
|
||||
put_device(dev);
|
||||
}
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
trace_suspend_resume(TPS("dpm_prepare"), state.event, false);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user