From 9a092183816a05f802ce3d4d7815b214413d6ad8 Mon Sep 17 00:00:00 2001 From: Subhash Jadavani Date: Sun, 25 Mar 2012 11:15:41 +0530 Subject: [PATCH] mmc: core: capture performance numbers only when asked Currently performance numbers are captured for each SDCC transfers unconditionally which may add the overhead and could reduce the SDCC read/write throughput numbers. This change adds additional control for enabling/disabling the capturing of performance numbers at runtime. We already have sysfs entry named "perf" for msm sdcc devices. Currently setting this entry to 0 clears the performance statistics. But now we are changing the definition of this entry as mentioned below: Disable performance capturing and clear the performance statistics: "echo 0 > /sys/devices/platform/msm_sdcc./perf" Enable performance capturing: "echo 1 > /sys/devices/platform/msm_sdcc./perf" CRs-fixed: 345170 Change-Id: I3ab9288fd87cc8a8ada6c0c3d066cac4f68d79b7 Signed-off-by: Subhash Jadavani --- drivers/mmc/core/core.c | 27 ++++++++++++++++----------- drivers/mmc/core/host.c | 9 +++++++-- include/linux/mmc/host.h | 1 + 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 48ad5f168b49..f08d160b7954 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -179,17 +179,21 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq) if (mrq->data) { #ifdef CONFIG_MMC_PERF_PROFILING - diff = ktime_sub(ktime_get(), host->perf.start); - if (mrq->data->flags == MMC_DATA_READ) { - host->perf.rbytes_drv += + if (host->perf_enable) { + diff = ktime_sub(ktime_get(), host->perf.start); + if (mrq->data->flags == MMC_DATA_READ) { + host->perf.rbytes_drv += + mrq->data->bytes_xfered; + host->perf.rtime_drv = + ktime_add(host->perf.rtime_drv, + diff); + } else { + host->perf.wbytes_drv += mrq->data->bytes_xfered; - host->perf.rtime_drv = - ktime_add(host->perf.rtime_drv, diff); - } else { - host->perf.wbytes_drv += - mrq->data->bytes_xfered; - host->perf.wtime_drv = - ktime_add(host->perf.wtime_drv, diff); + host->perf.wtime_drv = + ktime_add(host->perf.wtime_drv, + diff); + } } #endif pr_debug("%s: %d bytes transferred: %d\n", @@ -313,7 +317,8 @@ static int mmc_start_request(struct mmc_host *host, struct mmc_request *mrq) mrq->stop->mrq = mrq; } #ifdef CONFIG_MMC_PERF_PROFILING - host->perf.start = ktime_get(); + if (host->perf_enable) + host->perf.start = ktime_get(); #endif } mmc_host_clk_hold(host); diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index c940ad0bd3fe..38fe00671649 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -651,18 +651,23 @@ set_perf(struct device *dev, struct device_attribute *attr, { int64_t value; struct mmc_host *host = dev_get_drvdata(dev); + sscanf(buf, "%lld", &value); + spin_lock(&host->lock); if (!value) { - spin_lock(&host->lock); memset(&host->perf, 0, sizeof(host->perf)); - spin_unlock(&host->lock); + host->perf_enable = false; + } else { + host->perf_enable = true; } + spin_unlock(&host->lock); return count; } static DEVICE_ATTR(perf, S_IRUGO | S_IWUSR, show_perf, set_perf); + #endif static struct attribute *dev_attrs[] = { diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 30d33363079b..0600ae0d3cb5 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -442,6 +442,7 @@ struct mmc_host { ktime_t wtime_drv; /* Wr time MMC Host */ ktime_t start; } perf; + bool perf_enable; #endif unsigned long private[0] ____cacheline_aligned;