summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohamad Ayyash <mkayyash@google.com>2016-08-25 01:00:04 +0000
committerMohamad Ayyash <mkayyash@google.com>2016-08-25 01:00:04 +0000
commitd32cdec88f426cf8925c9e495ab082b3d97b5ba6 (patch)
tree6855fa7f9c9a46305a76bc28ed91bff32e4cdfd8
parent9c2c807ed6ccab2ded416909b8c135acab33483c (diff)
downloadimx-v4.1-d32cdec88f426cf8925c9e495ab082b3d97b5ba6.tar.gz
Revert "Android: MMC/UFS IO Latency Histograms."
This reverts commit 9c2c807ed6ccab2ded416909b8c135acab33483c. Change-Id: I917190cbf601c34ee03b714389351b4985733b80
-rw-r--r--block/blk-core.c80
-rw-r--r--drivers/mmc/core/core.c66
-rw-r--r--drivers/mmc/core/host.c6
-rw-r--r--drivers/mmc/core/host.h5
-rw-r--r--drivers/scsi/ufs/ufshcd.c81
-rw-r--r--drivers/scsi/ufs/ufshcd.h3
-rw-r--r--include/linux/blkdev.h76
-rw-r--r--include/linux/mmc/core.h2
-rw-r--r--include/linux/mmc/host.h4
9 files changed, 3 insertions, 320 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index a06394fcbdf5..03b5f8d77f37 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -3364,83 +3364,3 @@ int __init blk_dev_init(void)
return 0;
}
-
-/*
- * Blk IO latency support. We want this to be as cheap as possible, so doing
- * this lockless (and avoiding atomics), a few off by a few errors in this
- * code is not harmful, and we don't want to do anything that is
- * perf-impactful.
- * TODO : If necessary, we can make the histograms per-cpu and aggregate
- * them when printing them out.
- */
-void
-blk_zero_latency_hist(struct io_latency_state *s)
-{
- memset(s->latency_y_axis_read, 0,
- sizeof(s->latency_y_axis_read));
- memset(s->latency_y_axis_write, 0,
- sizeof(s->latency_y_axis_write));
- s->latency_reads_elems = 0;
- s->latency_writes_elems = 0;
-}
-
-ssize_t
-blk_latency_hist_show(struct io_latency_state *s, char *buf)
-{
- int i;
- int bytes_written = 0;
- int pct, num_elem;
- u_int64_t elem;
-
- num_elem = s->latency_reads_elems;
- if (num_elem > 0) {
- bytes_written += scnprintf(buf + bytes_written,
- PAGE_SIZE - bytes_written,
- "IO svc_time Read Latency Histogram (n = %d):\n",
- num_elem);
- for (i = 0;
- i < ARRAY_SIZE(latency_x_axis_us);
- i++) {
- elem = s->latency_y_axis_read[i];
- pct = (elem * 100) / num_elem;
- bytes_written += scnprintf(buf + bytes_written,
- PAGE_SIZE - bytes_written,
- "\t< %5lluus%15llu%15d%%\n",
- latency_x_axis_us[i],
- elem, pct);
- }
- /* Last element in y-axis table is overflow */
- elem = s->latency_y_axis_read[i];
- pct = (elem * 100) / num_elem;
- bytes_written += scnprintf(buf + bytes_written,
- PAGE_SIZE - bytes_written,
- "\t> %5dms%15llu%15d%%\n", 10,
- elem, pct);
- }
- num_elem = s->latency_writes_elems;
- if (num_elem > 0) {
- bytes_written += scnprintf(buf + bytes_written,
- PAGE_SIZE - bytes_written,
- "IO svc_time Write Latency Histogram (n = %d):\n",
- num_elem);
- for (i = 0;
- i < ARRAY_SIZE(latency_x_axis_us);
- i++) {
- elem = s->latency_y_axis_write[i];
- pct = (elem * 100) / num_elem;
- bytes_written += scnprintf(buf + bytes_written,
- PAGE_SIZE - bytes_written,
- "\t< %5lluus%15llu%15d%%\n",
- latency_x_axis_us[i],
- elem, pct);
- }
- /* Last element in y-axis table is overflow */
- elem = s->latency_y_axis_write[i];
- pct = (elem * 100) / num_elem;
- bytes_written += scnprintf(buf + bytes_written,
- PAGE_SIZE - bytes_written,
- "\t> %5dms%15llu%15d%%\n", 10,
- elem, pct);
- }
- return bytes_written;
-}
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index f0cb3ad3421f..ebfb3606f7a3 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -169,17 +169,6 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq)
pr_debug("%s: %d bytes transferred: %d\n",
mmc_hostname(host),
mrq->data->bytes_xfered, mrq->data->error);
- if (mrq->lat_hist_enabled) {
- ktime_t completion;
- u_int64_t delta_us;
-
- completion = ktime_get();
- delta_us = ktime_us_delta(completion,
- mrq->io_start);
- blk_update_latency_hist(&host->io_lat_s,
- (mrq->data->flags & MMC_DATA_READ),
- delta_us);
- }
trace_mmc_blk_rw_end(cmd->opcode, cmd->arg, mrq->data);
}
@@ -588,11 +577,6 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host,
}
if (!err && areq) {
- if (host->latency_hist_enabled) {
- areq->mrq->io_start = ktime_get();
- areq->mrq->lat_hist_enabled = 1;
- } else
- areq->mrq->lat_hist_enabled = 0;
trace_mmc_blk_rw_start(areq->mrq->cmd->opcode,
areq->mrq->cmd->arg,
areq->mrq->data);
@@ -1887,7 +1871,7 @@ void mmc_init_erase(struct mmc_card *card)
}
static unsigned int mmc_mmc_erase_timeout(struct mmc_card *card,
- unsigned int arg, unsigned int qty)
+ unsigned int arg, unsigned int qty)
{
unsigned int erase_timeout;
@@ -2793,54 +2777,6 @@ static void __exit mmc_exit(void)
destroy_workqueue(workqueue);
}
-static ssize_t
-latency_hist_show(struct device *dev, struct device_attribute *attr, char *buf)
-{
- struct mmc_host *host = cls_dev_to_mmc_host(dev);
-
- return blk_latency_hist_show(&host->io_lat_s, buf);
-}
-
-/*
- * Values permitted 0, 1, 2.
- * 0 -> Disable IO latency histograms (default)
- * 1 -> Enable IO latency histograms
- * 2 -> Zero out IO latency histograms
- */
-static ssize_t
-latency_hist_store(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct mmc_host *host = cls_dev_to_mmc_host(dev);
- long value;
-
- if (kstrtol(buf, 0, &value))
- return -EINVAL;
- if (value == BLK_IO_LAT_HIST_ZERO)
- blk_zero_latency_hist(&host->io_lat_s);
- else if (value == BLK_IO_LAT_HIST_ENABLE ||
- value == BLK_IO_LAT_HIST_DISABLE)
- host->latency_hist_enabled = value;
- return count;
-}
-
-static DEVICE_ATTR(latency_hist, S_IRUGO | S_IWUSR,
- latency_hist_show, latency_hist_store);
-
-void
-mmc_latency_hist_sysfs_init(struct mmc_host *host)
-{
- if (device_create_file(&host->class_dev, &dev_attr_latency_hist))
- dev_err(&host->class_dev,
- "Failed to create latency_hist sysfs entry\n");
-}
-
-void
-mmc_latency_hist_sysfs_exit(struct mmc_host *host)
-{
- device_remove_file(&host->class_dev, &dev_attr_latency_hist);
-}
-
subsys_initcall(mmc_init);
module_exit(mmc_exit);
diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
index b59b585dbd6c..a3d94d1675f5 100644
--- a/drivers/mmc/core/host.c
+++ b/drivers/mmc/core/host.c
@@ -32,6 +32,8 @@
#include "slot-gpio.h"
#include "pwrseq.h"
+#define cls_dev_to_mmc_host(d) container_of(d, struct mmc_host, class_dev)
+
static DEFINE_IDR(mmc_host_idr);
static DEFINE_SPINLOCK(mmc_host_lock);
@@ -545,8 +547,6 @@ int mmc_add_host(struct mmc_host *host)
#endif
mmc_host_clk_sysfs_init(host);
- mmc_latency_hist_sysfs_init(host);
-
mmc_start_host(host);
if (!(host->pm_flags & MMC_PM_IGNORE_PM_NOTIFY))
register_pm_notifier(&host->pm_notify);
@@ -575,8 +575,6 @@ void mmc_remove_host(struct mmc_host *host)
mmc_remove_host_debugfs(host);
#endif
- mmc_latency_hist_sysfs_exit(host);
-
device_del(&host->class_dev);
led_trigger_unregister_simple(host->led);
diff --git a/drivers/mmc/core/host.h b/drivers/mmc/core/host.h
index 4dcf49937ecd..f2ab9e578126 100644
--- a/drivers/mmc/core/host.h
+++ b/drivers/mmc/core/host.h
@@ -12,13 +12,8 @@
#define _MMC_CORE_HOST_H
#include <linux/mmc/host.h>
-#define cls_dev_to_mmc_host(d) container_of(d, struct mmc_host, class_dev)
-
int mmc_register_host_class(void);
void mmc_unregister_host_class(void);
-void mmc_latency_hist_sysfs_init(struct mmc_host *host);
-void mmc_latency_hist_sysfs_exit(struct mmc_host *host);
-
#endif
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 2188c0af45c1..648a44675880 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -39,7 +39,6 @@
#include <linux/async.h>
#include <linux/devfreq.h>
-#include <linux/blkdev.h>
#include "ufshcd.h"
#include "unipro.h"
@@ -1317,17 +1316,6 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
clear_bit_unlock(tag, &hba->lrb_in_use);
goto out;
}
-
- /* IO svc time latency histogram */
- if (hba != NULL && cmd->request != NULL) {
- if (hba->latency_hist_enabled &&
- (cmd->request->cmd_type == REQ_TYPE_FS)) {
- cmd->request->lat_hist_io_start = ktime_get();
- cmd->request->lat_hist_enabled = 1;
- } else
- cmd->request->lat_hist_enabled = 0;
- }
-
WARN_ON(hba->clk_gating.state != CLKS_ON);
lrbp = &hba->lrb[tag];
@@ -3077,7 +3065,6 @@ static void ufshcd_transfer_req_compl(struct ufs_hba *hba)
u32 tr_doorbell;
int result;
int index;
- struct request *req;
/* Resetting interrupt aggregation counters first and reading the
* DOOR_BELL afterward allows us to handle all the completed requests.
@@ -3101,22 +3088,6 @@ static void ufshcd_transfer_req_compl(struct ufs_hba *hba)
/* Mark completed command as NULL in LRB */
lrbp->cmd = NULL;
clear_bit_unlock(index, &hba->lrb_in_use);
- req = cmd->request;
- if (req) {
- /* Update IO svc time latency histogram */
- if (req->lat_hist_enabled) {
- ktime_t completion;
- u_int64_t delta_us;
-
- completion = ktime_get();
- delta_us = ktime_us_delta(completion,
- req->lat_hist_io_start);
- /* rq_data_dir() => true if WRITE */
- blk_update_latency_hist(&hba->io_lat_s,
- (rq_data_dir(req) == READ),
- delta_us);
- }
- }
/* Do not touch lrbp after scsi done */
cmd->scsi_done(cmd);
__ufshcd_release(hba);
@@ -5278,54 +5249,6 @@ out:
}
EXPORT_SYMBOL(ufshcd_shutdown);
-/*
- * Values permitted 0, 1, 2.
- * 0 -> Disable IO latency histograms (default)
- * 1 -> Enable IO latency histograms
- * 2 -> Zero out IO latency histograms
- */
-static ssize_t
-latency_hist_store(struct device *dev, struct device_attribute *attr,
- const char *buf, size_t count)
-{
- struct ufs_hba *hba = dev_get_drvdata(dev);
- long value;
-
- if (kstrtol(buf, 0, &value))
- return -EINVAL;
- if (value == BLK_IO_LAT_HIST_ZERO)
- blk_zero_latency_hist(&hba->io_lat_s);
- else if (value == BLK_IO_LAT_HIST_ENABLE ||
- value == BLK_IO_LAT_HIST_DISABLE)
- hba->latency_hist_enabled = value;
- return count;
-}
-
-ssize_t
-latency_hist_show(struct device *dev, struct device_attribute *attr,
- char *buf)
-{
- struct ufs_hba *hba = dev_get_drvdata(dev);
-
- return blk_latency_hist_show(&hba->io_lat_s, buf);
-}
-
-static DEVICE_ATTR(latency_hist, S_IRUGO | S_IWUSR,
- latency_hist_show, latency_hist_store);
-
-static void
-ufshcd_init_latency_hist(struct ufs_hba *hba)
-{
- if (device_create_file(hba->dev, &dev_attr_latency_hist))
- dev_err(hba->dev, "Failed to create latency_hist sysfs entry\n");
-}
-
-static void
-ufshcd_exit_latency_hist(struct ufs_hba *hba)
-{
- device_create_file(hba->dev, &dev_attr_latency_hist);
-}
-
/**
* ufshcd_remove - de-allocate SCSI host and host memory space
* data structure memory
@@ -5341,7 +5264,6 @@ void ufshcd_remove(struct ufs_hba *hba)
scsi_host_put(hba->host);
ufshcd_exit_clk_gating(hba);
- ufshcd_exit_latency_hist(hba);
if (ufshcd_is_clkscaling_enabled(hba))
devfreq_remove_device(hba->devfreq);
ufshcd_hba_exit(hba);
@@ -5631,8 +5553,6 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
/* Hold auto suspend until async scan completes */
pm_runtime_get_sync(dev);
- ufshcd_init_latency_hist(hba);
-
/*
* The device-initialize-sequence hasn't been invoked yet.
* Set the device to power-off state
@@ -5647,7 +5567,6 @@ out_remove_scsi_host:
scsi_remove_host(hba->host);
exit_gating:
ufshcd_exit_clk_gating(hba);
- ufshcd_exit_latency_hist(hba);
out_disable:
hba->is_irq_enabled = false;
scsi_host_put(host);
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index 85f64502c375..b47ff07698e8 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -482,9 +482,6 @@ struct ufs_hba {
struct devfreq *devfreq;
struct ufs_clk_scaling clk_scaling;
bool is_sys_suspended;
-
- int latency_hist_enabled;
- struct io_latency_state io_lat_s;
};
/* Returns true if clocks can be gated. Otherwise false */
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index efdf6a6d0b36..5d93a6645e88 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -209,9 +209,6 @@ struct request {
/* for bidi */
struct request *next_rq;
-
- ktime_t lat_hist_io_start;
- int lat_hist_enabled;
};
static inline unsigned short req_get_ioprio(struct request *req)
@@ -1626,79 +1623,6 @@ extern int bdev_write_page(struct block_device *, sector_t, struct page *,
struct writeback_control *);
extern long bdev_direct_access(struct block_device *, sector_t, void **addr,
unsigned long *pfn, long size);
-
-/*
- * X-axis for IO latency histogram support.
- */
-static const u_int64_t latency_x_axis_us[] = {
- 100,
- 200,
- 300,
- 400,
- 500,
- 600,
- 700,
- 800,
- 900,
- 1000,
- 1200,
- 1400,
- 1600,
- 1800,
- 2000,
- 2500,
- 3000,
- 4000,
- 5000,
- 6000,
- 7000,
- 9000,
- 10000
-};
-
-#define BLK_IO_LAT_HIST_DISABLE 0
-#define BLK_IO_LAT_HIST_ENABLE 1
-#define BLK_IO_LAT_HIST_ZERO 2
-
-struct io_latency_state {
- u_int64_t latency_y_axis_read[ARRAY_SIZE(latency_x_axis_us) + 1];
- u_int64_t latency_reads_elems;
- u_int64_t latency_y_axis_write[ARRAY_SIZE(latency_x_axis_us) + 1];
- u_int64_t latency_writes_elems;
-};
-
-static inline void
-blk_update_latency_hist(struct io_latency_state *s,
- int read,
- u_int64_t delta_us)
-{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(latency_x_axis_us); i++) {
- if (delta_us < (u_int64_t)latency_x_axis_us[i]) {
- if (read)
- s->latency_y_axis_read[i]++;
- else
- s->latency_y_axis_write[i]++;
- break;
- }
- }
- if (i == ARRAY_SIZE(latency_x_axis_us)) {
- /* Overflowed the histogram */
- if (read)
- s->latency_y_axis_read[i]++;
- else
- s->latency_y_axis_write[i]++;
- }
- if (read)
- s->latency_reads_elems++;
- else
- s->latency_writes_elems++;
-}
-
-void blk_zero_latency_hist(struct io_latency_state *s);
-ssize_t blk_latency_hist_show(struct io_latency_state *s, char *buf);
-
#else /* CONFIG_BLOCK */
struct block_device;
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h
index 1510a383653d..de722d4e9d61 100644
--- a/include/linux/mmc/core.h
+++ b/include/linux/mmc/core.h
@@ -135,8 +135,6 @@ struct mmc_request {
struct completion completion;
void (*done)(struct mmc_request *);/* completion function */
struct mmc_host *host;
- ktime_t io_start;
- int lat_hist_enabled;
};
struct mmc_card;
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 31f22edaa581..a233a53ed4e5 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -15,7 +15,6 @@
#include <linux/sched.h>
#include <linux/device.h>
#include <linux/fault-inject.h>
-#include <linux/blkdev.h>
#include <linux/mmc/core.h>
#include <linux/mmc/card.h>
@@ -380,9 +379,6 @@ struct mmc_host {
} embedded_sdio_data;
#endif
- int latency_hist_enabled;
- struct io_latency_state io_lat_s;
-
unsigned long private[0] ____cacheline_aligned;
};