diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 362bdbe7c77..7d34bfd3567 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -122,17 +122,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", @@ -210,7 +214,8 @@ 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 19857457335..a1625869fea 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -399,18 +399,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 46f71a107d9..e19225eac0e 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -352,6 +352,7 @@ struct mmc_host { ktime_t wtime_drv; /* Wr time MMC Host */ ktime_t start; } perf; + bool perf_enable; #endif struct mmc_async_req *areq; /* active async req */