mmc: core: Add trace events to profile mmc suspend-resume

Add trace events to capture mmc suspend-resume latencies.
This would be useful to capture latencies for variety
of MMC/SD cards and decide on best possible runtime PM timeout.

Usage -
cd /sys/kernel/debug
echo 1 > tracing/events/mmc/mmc_resume_host/enable
echo 1 > tracing/events/mmc/mmc_suspend_host/enable
cat tracing/trace_pipe

Change-Id: Ic3a73753d55985c1c663cf2972cbed320e0fcfc3
Signed-off-by: Sujit Reddy Thumma <sthumma@codeaurora.org>
This commit is contained in:
Sujit Reddy Thumma 2013-12-06 13:06:18 +05:30
parent 9e79afb8ee
commit 23a6e13dd1
2 changed files with 39 additions and 0 deletions

View File

@ -3593,6 +3593,7 @@ EXPORT_SYMBOL(mmc_cache_ctrl);
int mmc_suspend_host(struct mmc_host *host)
{
int err = 0;
ktime_t start = ktime_get();
if (mmc_bus_needs_resume(host))
return 0;
@ -3653,6 +3654,8 @@ int mmc_suspend_host(struct mmc_host *host)
if (!err && !mmc_card_keep_power(host))
mmc_power_off(host);
trace_mmc_suspend_host(mmc_hostname(host), err,
ktime_to_us(ktime_sub(ktime_get(), start)));
return err;
out:
if (!(host->card && mmc_card_sdio(host->card)))
@ -3670,6 +3673,7 @@ EXPORT_SYMBOL(mmc_suspend_host);
int mmc_resume_host(struct mmc_host *host)
{
int err = 0;
ktime_t start = ktime_get();
mmc_bus_get(host);
if (mmc_bus_manual_resume(host)) {
@ -3707,6 +3711,8 @@ int mmc_resume_host(struct mmc_host *host)
host->pm_flags &= ~MMC_PM_KEEP_POWER;
mmc_bus_put(host);
trace_mmc_resume_host(mmc_hostname(host), err,
ktime_to_us(ktime_sub(ktime_get(), start)));
return err;
}
EXPORT_SYMBOL(mmc_resume_host);

View File

@ -105,6 +105,39 @@ TRACE_EVENT(mmc_clk,
)
);
DECLARE_EVENT_CLASS(mmc_pm_template,
TP_PROTO(const char *dev_name, int err, s64 usecs),
TP_ARGS(dev_name, err, usecs),
TP_STRUCT__entry(
__field(s64, usecs)
__field(int, err)
__string(dev_name, dev_name)
),
TP_fast_assign(
__entry->usecs = usecs;
__entry->err = err;
__assign_str(dev_name, dev_name);
),
TP_printk(
"took %lld usecs, %s err %d",
__entry->usecs,
__get_str(dev_name),
__entry->err
)
);
DEFINE_EVENT(mmc_pm_template, mmc_suspend_host,
TP_PROTO(const char *dev_name, int err, s64 usecs),
TP_ARGS(dev_name, err, usecs));
DEFINE_EVENT(mmc_pm_template, mmc_resume_host,
TP_PROTO(const char *dev_name, int err, s64 usecs),
TP_ARGS(dev_name, err, usecs));
#endif /* if !defined(_TRACE_MMC_H) || defined(TRACE_HEADER_MULTI_READ) */
/* This part must be outside protection */