linux-spi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC 0/2] drivers: spi/i2c: account completions as iowait
@ 2014-11-02 13:58 Wolfram Sang
  2014-11-02 13:58 ` [RFC 1/2] i2c: " Wolfram Sang
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Wolfram Sang @ 2014-11-02 13:58 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA, Mark Brown, Peter Zijlstra,
	Ingo Molnar, Balbir Singh, Wolfram Sang

So, I recently learned that there is wait_for_completion_io_* because one I2C
driver uses it instead of wait_for_completion_*. I want consistency, so
technically the io-versions seem to be the correct ones to me, because, well,
we are waiting for IO.

However, researching the net, users currently interpret iowait entirely as
blkio wait. Furthermore, io_schedule() calls delayacct_blkio_{start|end}() which
worked fine for my tests with I2C but might show that iowait was really meant as
blkiowait? So, should other subsystems use it?

To make it more confusing, some people (like Peter Zijlstra [1]) seem to like
iowait gone, so maybe it is all not worth it?

I'd be grateful for a rule-of-thumb here. And because people like to discuss
code, I created patches to convert I2C and SPI to be accounted as iowait ;)

Thanks,

   Wolfram


[1] http://www.spinics.net/lists/kernel/msg1778892.html

Wolfram Sang (2):
  i2c: account completions as iowait
  spi: account completions as iowait

 drivers/i2c/busses/i2c-axxia.c           |  4 ++--
 drivers/i2c/busses/i2c-bcm-kona.c        |  8 ++++----
 drivers/i2c/busses/i2c-bcm2835.c         |  2 +-
 drivers/i2c/busses/i2c-bfin-twi.c        |  4 ++--
 drivers/i2c/busses/i2c-cadence.c         |  2 +-
 drivers/i2c/busses/i2c-davinci.c         |  2 +-
 drivers/i2c/busses/i2c-designware-core.c |  2 +-
 drivers/i2c/busses/i2c-efm32.c           |  2 +-
 drivers/i2c/busses/i2c-exynos5.c         |  2 +-
 drivers/i2c/busses/i2c-highlander.c      |  2 +-
 drivers/i2c/busses/i2c-hix5hd2.c         |  2 +-
 drivers/i2c/busses/i2c-ismt.c            |  2 +-
 drivers/i2c/busses/i2c-mxs.c             |  2 +-
 drivers/i2c/busses/i2c-nomadik.c         |  4 ++--
 drivers/i2c/busses/i2c-omap.c            |  2 +-
 drivers/i2c/busses/i2c-pmcmsp.c          |  2 +-
 drivers/i2c/busses/i2c-pnx.c             |  2 +-
 drivers/i2c/busses/i2c-qup.c             |  4 ++--
 drivers/i2c/busses/i2c-riic.c            |  2 +-
 drivers/i2c/busses/i2c-sh7760.c          |  2 +-
 drivers/i2c/busses/i2c-sirf.c            |  2 +-
 drivers/i2c/busses/i2c-st.c              |  2 +-
 drivers/i2c/busses/i2c-sun6i-p2wi.c      |  2 +-
 drivers/i2c/busses/i2c-tegra.c           |  2 +-
 drivers/i2c/busses/i2c-wmt.c             |  4 ++--
 drivers/spi/spi-altera.c                 |  2 +-
 drivers/spi/spi-atmel.c                  |  2 +-
 drivers/spi/spi-au1550.c                 |  4 ++--
 drivers/spi/spi-bcm2835.c                |  2 +-
 drivers/spi/spi-bcm63xx-hsspi.c          |  2 +-
 drivers/spi/spi-bcm63xx.c                |  2 +-
 drivers/spi/spi-efm32.c                  |  2 +-
 drivers/spi/spi-ep93xx.c                 |  4 ++--
 drivers/spi/spi-fsl-espi.c               |  2 +-
 drivers/spi/spi-fsl-spi.c                |  2 +-
 drivers/spi/spi-imx.c                    |  6 +++---
 drivers/spi/spi-mpc512x-psc.c            |  2 +-
 drivers/spi/spi-mpc52xx-psc.c            |  2 +-
 drivers/spi/spi-mxs.c                    |  2 +-
 drivers/spi/spi-nuc900.c                 |  2 +-
 drivers/spi/spi-oc-tiny.c                |  2 +-
 drivers/spi/spi-omap2-mcspi.c            |  4 ++--
 drivers/spi/spi-ppc4xx.c                 |  2 +-
 drivers/spi/spi-qup.c                    |  2 +-
 drivers/spi/spi-s3c24xx.c                |  2 +-
 drivers/spi/spi-s3c64xx.c                |  2 +-
 drivers/spi/spi-sh-msiof.c               |  4 ++--
 drivers/spi/spi-sirf.c                   | 10 +++++-----
 drivers/spi/spi-sun4i.c                  |  2 +-
 drivers/spi/spi-sun6i.c                  |  2 +-
 drivers/spi/spi-tegra114.c               |  2 +-
 drivers/spi/spi-tegra20-sflash.c         |  2 +-
 drivers/spi/spi-tegra20-slink.c          |  2 +-
 drivers/spi/spi-ti-qspi.c                |  4 ++--
 drivers/spi/spi-xilinx.c                 |  2 +-
 drivers/spi/spi.c                        |  4 ++--
 drivers/spi/spidev.c                     |  2 +-
 57 files changed, 77 insertions(+), 77 deletions(-)

-- 
2.1.1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [RFC 1/2] i2c: account completions as iowait
  2014-11-02 13:58 [RFC 0/2] drivers: spi/i2c: account completions as iowait Wolfram Sang
@ 2014-11-02 13:58 ` Wolfram Sang
       [not found] ` <1414936689-2707-1-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
  2014-11-03 13:02 ` One Thousand Gnomes
  2 siblings, 0 replies; 7+ messages in thread
From: Wolfram Sang @ 2014-11-02 13:58 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-i2c, linux-spi, Mark Brown, Peter Zijlstra, Ingo Molnar,
	Balbir Singh, Wolfram Sang

We are waiting for IO, so it should be accounted as such.

Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
---
 drivers/i2c/busses/i2c-axxia.c           | 4 ++--
 drivers/i2c/busses/i2c-bcm-kona.c        | 8 ++++----
 drivers/i2c/busses/i2c-bcm2835.c         | 2 +-
 drivers/i2c/busses/i2c-bfin-twi.c        | 4 ++--
 drivers/i2c/busses/i2c-cadence.c         | 2 +-
 drivers/i2c/busses/i2c-davinci.c         | 2 +-
 drivers/i2c/busses/i2c-designware-core.c | 2 +-
 drivers/i2c/busses/i2c-efm32.c           | 2 +-
 drivers/i2c/busses/i2c-exynos5.c         | 2 +-
 drivers/i2c/busses/i2c-highlander.c      | 2 +-
 drivers/i2c/busses/i2c-hix5hd2.c         | 2 +-
 drivers/i2c/busses/i2c-ismt.c            | 2 +-
 drivers/i2c/busses/i2c-mxs.c             | 2 +-
 drivers/i2c/busses/i2c-nomadik.c         | 4 ++--
 drivers/i2c/busses/i2c-omap.c            | 2 +-
 drivers/i2c/busses/i2c-pmcmsp.c          | 2 +-
 drivers/i2c/busses/i2c-pnx.c             | 2 +-
 drivers/i2c/busses/i2c-qup.c             | 4 ++--
 drivers/i2c/busses/i2c-riic.c            | 2 +-
 drivers/i2c/busses/i2c-sh7760.c          | 2 +-
 drivers/i2c/busses/i2c-sirf.c            | 2 +-
 drivers/i2c/busses/i2c-st.c              | 2 +-
 drivers/i2c/busses/i2c-sun6i-p2wi.c      | 2 +-
 drivers/i2c/busses/i2c-tegra.c           | 2 +-
 drivers/i2c/busses/i2c-wmt.c             | 4 ++--
 25 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/drivers/i2c/busses/i2c-axxia.c b/drivers/i2c/busses/i2c-axxia.c
index 768a598d8d03..5e4f85b052be 100644
--- a/drivers/i2c/busses/i2c-axxia.c
+++ b/drivers/i2c/busses/i2c-axxia.c
@@ -388,7 +388,7 @@ static int axxia_i2c_xfer_msg(struct axxia_i2c_dev *idev, struct i2c_msg *msg)
 
 	i2c_int_enable(idev, int_mask);
 
-	ret = wait_for_completion_timeout(&idev->msg_complete,
+	ret = wait_for_completion_io_timeout(&idev->msg_complete,
 					  I2C_XFER_TIMEOUT);
 
 	i2c_int_disable(idev, int_mask);
@@ -415,7 +415,7 @@ static int axxia_i2c_stop(struct axxia_i2c_dev *idev)
 	/* Issue stop */
 	writel(0xb, idev->base + MST_COMMAND);
 	i2c_int_enable(idev, int_mask);
-	ret = wait_for_completion_timeout(&idev->msg_complete,
+	ret = wait_for_completion_io_timeout(&idev->msg_complete,
 					  I2C_STOP_TIMEOUT);
 	i2c_int_disable(idev, int_mask);
 	if (ret == 0)
diff --git a/drivers/i2c/busses/i2c-bcm-kona.c b/drivers/i2c/busses/i2c-bcm-kona.c
index 18a74a6751a9..ae0b630be9ac 100644
--- a/drivers/i2c/busses/i2c-bcm-kona.c
+++ b/drivers/i2c/busses/i2c-bcm-kona.c
@@ -270,7 +270,7 @@ static int bcm_kona_send_i2c_cmd(struct bcm_kona_i2c_dev *dev,
 	bcm_kona_i2c_send_cmd_to_ctrl(dev, cmd);
 
 	/* Wait for transaction to finish or timeout */
-	time_left = wait_for_completion_timeout(&dev->done, time_left);
+	time_left = wait_for_completion_io_timeout(&dev->done, time_left);
 
 	/* Mask all interrupts */
 	writel(0, dev->base + IER_OFFSET);
@@ -305,7 +305,7 @@ static int bcm_kona_i2c_read_fifo_single(struct bcm_kona_i2c_dev *dev,
 		dev->base + RXFCR_OFFSET);
 
 	/* Wait for FIFO read to complete */
-	time_left = wait_for_completion_timeout(&dev->done, time_left);
+	time_left = wait_for_completion_io_timeout(&dev->done, time_left);
 
 	/* Mask all interrupts */
 	writel(0, dev->base + IER_OFFSET);
@@ -377,7 +377,7 @@ static int bcm_kona_i2c_write_byte(struct bcm_kona_i2c_dev *dev, uint8_t data,
 	writel(data, dev->base + DAT_OFFSET);
 
 	/* Wait for byte to be written */
-	time_left = wait_for_completion_timeout(&dev->done, time_left);
+	time_left = wait_for_completion_io_timeout(&dev->done, time_left);
 
 	/* Mask all interrupts */
 	writel(0, dev->base + IER_OFFSET);
@@ -424,7 +424,7 @@ static int bcm_kona_i2c_write_fifo_single(struct bcm_kona_i2c_dev *dev,
 
 	/* Wait for FIFO to empty */
 	do {
-		time_left = wait_for_completion_timeout(&dev->done, time_left);
+		time_left = wait_for_completion_io_timeout(&dev->done, time_left);
 		fifo_status = readl(dev->base + FIFO_STATUS_OFFSET);
 	} while (time_left && !(fifo_status & FIFO_STATUS_TXFIFO_EMPTY_MASK));
 
diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c
index 4b8ecd0b3661..3f9516e323aa 100644
--- a/drivers/i2c/busses/i2c-bcm2835.c
+++ b/drivers/i2c/busses/i2c-bcm2835.c
@@ -167,7 +167,7 @@ static int bcm2835_i2c_xfer_msg(struct bcm2835_i2c_dev *i2c_dev,
 	bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len);
 	bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c);
 
-	time_left = wait_for_completion_timeout(&i2c_dev->completion,
+	time_left = wait_for_completion_io_timeout(&i2c_dev->completion,
 						BCM2835_I2C_TIMEOUT);
 	bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, BCM2835_I2C_C_CLEAR);
 	if (!time_left) {
diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c
index 067c1615e968..638b9fa24d53 100644
--- a/drivers/i2c/busses/i2c-bfin-twi.c
+++ b/drivers/i2c/busses/i2c-bfin-twi.c
@@ -325,7 +325,7 @@ static int bfin_twi_do_master_xfer(struct i2c_adapter *adap,
 		((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0));
 
 	while (!iface->result) {
-		if (!wait_for_completion_timeout(&iface->complete,
+		if (!wait_for_completion_io_timeout(&iface->complete,
 			adap->timeout)) {
 			iface->result = -1;
 			dev_err(&adap->dev, "master transfer timeout\n");
@@ -529,7 +529,7 @@ int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr,
 	}
 
 	while (!iface->result) {
-		if (!wait_for_completion_timeout(&iface->complete,
+		if (!wait_for_completion_io_timeout(&iface->complete,
 			adap->timeout)) {
 			iface->result = -1;
 			dev_err(&adap->dev, "smbus transfer timeout\n");
diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c
index 63f3f03ecc9b..156ac641e45f 100644
--- a/drivers/i2c/busses/i2c-cadence.c
+++ b/drivers/i2c/busses/i2c-cadence.c
@@ -470,7 +470,7 @@ static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg,
 		cdns_i2c_msend(id);
 
 	/* Wait for the signal of completion */
-	ret = wait_for_completion_timeout(&id->xfer_done, adap->timeout);
+	ret = wait_for_completion_io_timeout(&id->xfer_done, adap->timeout);
 	if (!ret) {
 		cdns_i2c_master_reset(adap);
 		dev_err(id->adap.dev.parent,
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c
index 4d9614719128..4874f4b585e9 100644
--- a/drivers/i2c/busses/i2c-davinci.c
+++ b/drivers/i2c/busses/i2c-davinci.c
@@ -591,7 +591,7 @@ static int i2c_davinci_cpufreq_transition(struct notifier_block *nb,
 
 	dev = container_of(nb, struct davinci_i2c_dev, freq_transition);
 	if (val == CPUFREQ_PRECHANGE) {
-		wait_for_completion(&dev->xfr_complete);
+		wait_for_completion_io(&dev->xfr_complete);
 		davinci_i2c_reset_ctrl(dev, 0);
 	} else if (val == CPUFREQ_POSTCHANGE) {
 		i2c_davinci_calc_clk_dividers(dev);
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c
index 3c20e4bd6dd1..42096f1ed8fc 100644
--- a/drivers/i2c/busses/i2c-designware-core.c
+++ b/drivers/i2c/busses/i2c-designware-core.c
@@ -639,7 +639,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
 	i2c_dw_xfer_init(dev);
 
 	/* wait for tx to complete */
-	ret = wait_for_completion_timeout(&dev->cmd_complete, HZ);
+	ret = wait_for_completion_io_timeout(&dev->cmd_complete, HZ);
 	if (ret == 0) {
 		dev_err(dev->dev, "controller timed out\n");
 		/* i2c_dw_init implicitly disables the adapter */
diff --git a/drivers/i2c/busses/i2c-efm32.c b/drivers/i2c/busses/i2c-efm32.c
index 10b8323b08d4..a2472b192457 100644
--- a/drivers/i2c/busses/i2c-efm32.c
+++ b/drivers/i2c/busses/i2c-efm32.c
@@ -278,7 +278,7 @@ static int efm32_i2c_master_xfer(struct i2c_adapter *adap,
 
 	efm32_i2c_send_next_msg(ddata);
 
-	wait_for_completion(&ddata->done);
+	wait_for_completion_io(&ddata->done);
 
 	if (ddata->current_msg >= ddata->num_msgs)
 		ret = ddata->num_msgs;
diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c
index 81e6263cd7da..28d81697bbd3 100644
--- a/drivers/i2c/busses/i2c-exynos5.c
+++ b/drivers/i2c/busses/i2c-exynos5.c
@@ -635,7 +635,7 @@ static int exynos5_i2c_xfer_msg(struct exynos5_i2c *i2c,
 
 	exynos5_i2c_message_start(i2c, stop);
 
-	timeout = wait_for_completion_timeout(&i2c->msg_complete,
+	timeout = wait_for_completion_io_timeout(&i2c->msg_complete,
 					      EXYNOS5_I2C_TIMEOUT);
 	if (timeout == 0)
 		ret = -ETIMEDOUT;
diff --git a/drivers/i2c/busses/i2c-highlander.c b/drivers/i2c/busses/i2c-highlander.c
index 512fcfabc18e..188cbdc11726 100644
--- a/drivers/i2c/busses/i2c-highlander.c
+++ b/drivers/i2c/busses/i2c-highlander.c
@@ -200,7 +200,7 @@ static void highlander_i2c_poll(struct highlander_i2c_dev *dev)
 static inline int highlander_i2c_wait_xfer_done(struct highlander_i2c_dev *dev)
 {
 	if (dev->irq)
-		wait_for_completion_timeout(&dev->cmd_complete,
+		wait_for_completion_io_timeout(&dev->cmd_complete,
 					  msecs_to_jiffies(iic_timeout));
 	else
 		/* busy looping, the IRQ of champions */
diff --git a/drivers/i2c/busses/i2c-hix5hd2.c b/drivers/i2c/busses/i2c-hix5hd2.c
index 9490d0f4255c..621c4f211a27 100644
--- a/drivers/i2c/busses/i2c-hix5hd2.c
+++ b/drivers/i2c/busses/i2c-hix5hd2.c
@@ -338,7 +338,7 @@ static int hix5hd2_i2c_xfer_msg(struct hix5hd2_i2c_priv *priv,
 	reinit_completion(&priv->msg_complete);
 	hix5hd2_i2c_message_start(priv, stop);
 
-	timeout = wait_for_completion_timeout(&priv->msg_complete,
+	timeout = wait_for_completion_io_timeout(&priv->msg_complete,
 					      priv->adap.timeout);
 	if (timeout == 0) {
 		priv->state = HIX5I2C_STAT_RW_ERR;
diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c
index 3f6ecbfb9a56..64354d0d9513 100644
--- a/drivers/i2c/busses/i2c-ismt.c
+++ b/drivers/i2c/busses/i2c-ismt.c
@@ -582,7 +582,7 @@ static int ismt_access(struct i2c_adapter *adap, u16 addr,
 	ismt_submit_desc(priv);
 
 	/* Now we wait for interrupt completion, 1s */
-	ret = wait_for_completion_timeout(&priv->cmp, HZ*1);
+	ret = wait_for_completion_io_timeout(&priv->cmp, HZ*1);
 
 	/* unmap the data buffer */
 	if (dma_size != 0)
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c
index 07e1be6f8992..528ddab7d1d6 100644
--- a/drivers/i2c/busses/i2c-mxs.c
+++ b/drivers/i2c/busses/i2c-mxs.c
@@ -599,7 +599,7 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg,
 		if (ret)
 			return ret;
 
-		ret = wait_for_completion_timeout(&i2c->cmd_complete,
+		ret = wait_for_completion_io_timeout(&i2c->cmd_complete,
 						msecs_to_jiffies(1000));
 		if (ret == 0)
 			goto timeout;
diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c
index 9ad038d223c4..daf34297a9f3 100644
--- a/drivers/i2c/busses/i2c-nomadik.c
+++ b/drivers/i2c/busses/i2c-nomadik.c
@@ -476,7 +476,7 @@ static int read_i2c(struct nmk_i2c_dev *dev, u16 flags)
 	writel(readl(dev->virtbase + I2C_IMSCR) | irq_mask,
 			dev->virtbase + I2C_IMSCR);
 
-	timeout = wait_for_completion_timeout(
+	timeout = wait_for_completion_io_timeout(
 		&dev->xfer_complete, dev->adap.timeout);
 
 	if (timeout == 0) {
@@ -556,7 +556,7 @@ static int write_i2c(struct nmk_i2c_dev *dev, u16 flags)
 	writel(readl(dev->virtbase + I2C_IMSCR) | irq_mask,
 			dev->virtbase + I2C_IMSCR);
 
-	timeout = wait_for_completion_timeout(
+	timeout = wait_for_completion_io_timeout(
 		&dev->xfer_complete, dev->adap.timeout);
 
 	if (timeout == 0) {
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index 0dffb0e62c3b..6f133c6c8390 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -591,7 +591,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,
 	 * REVISIT: We should abort the transfer on signals, but the bus goes
 	 * into arbitration and we're currently unable to recover from it.
 	 */
-	timeout = wait_for_completion_timeout(&dev->cmd_complete,
+	timeout = wait_for_completion_io_timeout(&dev->cmd_complete,
 						OMAP_I2C_TIMEOUT);
 	if (timeout == 0) {
 		dev_err(dev->dev, "controller timed out\n");
diff --git a/drivers/i2c/busses/i2c-pmcmsp.c b/drivers/i2c/busses/i2c-pmcmsp.c
index 8564768fee32..a8f61a4677b8 100644
--- a/drivers/i2c/busses/i2c-pmcmsp.c
+++ b/drivers/i2c/busses/i2c-pmcmsp.c
@@ -424,7 +424,7 @@ static enum pmcmsptwi_xfer_result pmcmsptwi_do_xfer(
 	dev_dbg(&pmcmsptwi_adapter.dev, "Writing cmd reg 0x%08x\n", reg);
 	pmcmsptwi_writel(reg, data->iobase + MSP_TWI_CMD_REG_OFFSET);
 	if (data->irq) {
-		unsigned long timeleft = wait_for_completion_timeout(
+		unsigned long timeleft = wait_for_completion_io_timeout(
 						&data->wait, MSP_IRQ_TIMEOUT);
 		if (timeleft == 0) {
 			dev_dbg(&pmcmsptwi_adapter.dev,
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c
index dc7ff829ad78..636080865fe6 100644
--- a/drivers/i2c/busses/i2c-pnx.c
+++ b/drivers/i2c/busses/i2c-pnx.c
@@ -546,7 +546,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
 			break;
 
 		/* Wait for completion */
-		wait_for_completion(&alg_data->mif.complete);
+		wait_for_completion_io(&alg_data->mif.complete);
 
 		if (!(rc = alg_data->mif.ret))
 			completed++;
diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c
index 092d89bd3224..9977e9be3229 100644
--- a/drivers/i2c/busses/i2c-qup.c
+++ b/drivers/i2c/busses/i2c-qup.c
@@ -331,7 +331,7 @@ static int qup_i2c_write_one(struct qup_i2c_dev *qup, struct i2c_msg *msg)
 		if (ret)
 			goto err;
 
-		left = wait_for_completion_timeout(&qup->xfer, HZ);
+		left = wait_for_completion_io_timeout(&qup->xfer, HZ);
 		if (!left) {
 			writel(1, qup->base + QUP_SW_RESET);
 			ret = -ETIMEDOUT;
@@ -447,7 +447,7 @@ static int qup_i2c_read_one(struct qup_i2c_dev *qup, struct i2c_msg *msg)
 		goto err;
 
 	do {
-		left = wait_for_completion_timeout(&qup->xfer, HZ);
+		left = wait_for_completion_io_timeout(&qup->xfer, HZ);
 		if (!left) {
 			writel(1, qup->base + QUP_SW_RESET);
 			ret = -ETIMEDOUT;
diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index af3b3d032a9f..d5bfc2b4806f 100644
--- a/drivers/i2c/busses/i2c-riic.c
+++ b/drivers/i2c/busses/i2c-riic.c
@@ -146,7 +146,7 @@ static int riic_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
 
 		writeb(start_bit, riic->base + RIIC_ICCR2);
 
-		time_left = wait_for_completion_timeout(&riic->msg_done, riic->adapter.timeout);
+		time_left = wait_for_completion_io_timeout(&riic->msg_done, riic->adapter.timeout);
 		if (time_left == 0)
 			riic->err = -ETIMEDOUT;
 
diff --git a/drivers/i2c/busses/i2c-sh7760.c b/drivers/i2c/busses/i2c-sh7760.c
index d76f3d9737ec..1b9bab551e4d 100644
--- a/drivers/i2c/busses/i2c-sh7760.c
+++ b/drivers/i2c/busses/i2c-sh7760.c
@@ -326,7 +326,7 @@ retry:
 		else
 			sh7760_i2c_msend(id);
 
-		wait_for_completion(&id->xfer_done);
+		wait_for_completion_io(&id->xfer_done);
 
 		if (id->status == 0) {
 			num = -EIO;
diff --git a/drivers/i2c/busses/i2c-sirf.c b/drivers/i2c/busses/i2c-sirf.c
index b1336d5f0531..9afe2d1cfd85 100644
--- a/drivers/i2c/busses/i2c-sirf.c
+++ b/drivers/i2c/busses/i2c-sirf.c
@@ -213,7 +213,7 @@ static int i2c_sirfsoc_xfer_msg(struct sirfsoc_i2c *siic, struct i2c_msg *msg)
 		siic->base + SIRFSOC_I2C_CTRL);
 	i2c_sirfsoc_queue_cmd(siic);
 
-	if (wait_for_completion_timeout(&siic->done, timeout) == 0) {
+	if (wait_for_completion_io_timeout(&siic->done, timeout) == 0) {
 		siic->err_status = SIRFSOC_I2C_ERR_TIMEOUT;
 		dev_err(&siic->adapter.dev, "Transfer timeout\n");
 	}
diff --git a/drivers/i2c/busses/i2c-st.c b/drivers/i2c/busses/i2c-st.c
index 2e4eccd6599a..9b0583a2c6b9 100644
--- a/drivers/i2c/busses/i2c-st.c
+++ b/drivers/i2c/busses/i2c-st.c
@@ -649,7 +649,7 @@ static int st_i2c_xfer_msg(struct st_i2c_dev *i2c_dev, struct i2c_msg *msg,
 		st_i2c_set_bits(i2c_dev->base + SSC_I2C, SSC_I2C_STRTG);
 	}
 
-	timeout = wait_for_completion_timeout(&i2c_dev->complete,
+	timeout = wait_for_completion_io_timeout(&i2c_dev->complete,
 			i2c_dev->adap.timeout);
 	ret = c->result;
 
diff --git a/drivers/i2c/busses/i2c-sun6i-p2wi.c b/drivers/i2c/busses/i2c-sun6i-p2wi.c
index 4d75d4759709..565b2ed732be 100644
--- a/drivers/i2c/busses/i2c-sun6i-p2wi.c
+++ b/drivers/i2c/busses/i2c-sun6i-p2wi.c
@@ -151,7 +151,7 @@ static int p2wi_smbus_xfer(struct i2c_adapter *adap, u16 addr,
 	writel(P2WI_CTRL_START_TRANS | P2WI_CTRL_GLOBAL_INT_ENB,
 	       p2wi->regs + P2WI_CTRL);
 
-	wait_for_completion(&p2wi->complete);
+	wait_for_completion_io(&p2wi->complete);
 
 	if (p2wi->status & P2WI_INTS_LOAD_BSY) {
 		dev_err(&adap->dev, "P2WI bus busy\n");
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index efba1ebe16ba..e109542776d6 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -583,7 +583,7 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
 	dev_dbg(i2c_dev->dev, "unmasked irq: %02x\n",
 		i2c_readl(i2c_dev, I2C_INT_MASK));
 
-	ret = wait_for_completion_timeout(&i2c_dev->msg_complete, TEGRA_I2C_TIMEOUT);
+	ret = wait_for_completion_io_timeout(&i2c_dev->msg_complete, TEGRA_I2C_TIMEOUT);
 	tegra_i2c_mask_irq(i2c_dev, int_mask);
 
 	if (ret == 0) {
diff --git a/drivers/i2c/busses/i2c-wmt.c b/drivers/i2c/busses/i2c-wmt.c
index f80a38c2072c..f370bac8b9de 100644
--- a/drivers/i2c/busses/i2c-wmt.c
+++ b/drivers/i2c/busses/i2c-wmt.c
@@ -176,7 +176,7 @@ static int wmt_i2c_write(struct i2c_adapter *adap, struct i2c_msg *pmsg,
 	}
 
 	while (xfer_len < pmsg->len) {
-		wait_result = wait_for_completion_timeout(&i2c_dev->complete,
+		wait_result = wait_for_completion_io_timeout(&i2c_dev->complete,
 							  500 * HZ / 1000);
 
 		if (wait_result == 0)
@@ -265,7 +265,7 @@ static int wmt_i2c_read(struct i2c_adapter *adap, struct i2c_msg *pmsg,
 	}
 
 	while (xfer_len < pmsg->len) {
-		wait_result = wait_for_completion_timeout(&i2c_dev->complete,
+		wait_result = wait_for_completion_io_timeout(&i2c_dev->complete,
 							  500 * HZ / 1000);
 
 		if (!wait_result)
-- 
2.1.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [RFC 2/2] spi: account completions as iowait
       [not found] ` <1414936689-2707-1-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
@ 2014-11-02 13:58   ` Wolfram Sang
  2014-11-02 16:59   ` [RFC 0/2] drivers: spi/i2c: " Peter Zijlstra
  1 sibling, 0 replies; 7+ messages in thread
From: Wolfram Sang @ 2014-11-02 13:58 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA, Mark Brown, Peter Zijlstra,
	Ingo Molnar, Balbir Singh, Wolfram Sang

We are waiting for IO, so it should be accounted as such.

Signed-off-by: Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
---
 drivers/spi/spi-altera.c         |  2 +-
 drivers/spi/spi-atmel.c          |  2 +-
 drivers/spi/spi-au1550.c         |  4 ++--
 drivers/spi/spi-bcm2835.c        |  2 +-
 drivers/spi/spi-bcm63xx-hsspi.c  |  2 +-
 drivers/spi/spi-bcm63xx.c        |  2 +-
 drivers/spi/spi-efm32.c          |  2 +-
 drivers/spi/spi-ep93xx.c         |  4 ++--
 drivers/spi/spi-fsl-espi.c       |  2 +-
 drivers/spi/spi-fsl-spi.c        |  2 +-
 drivers/spi/spi-imx.c            |  6 +++---
 drivers/spi/spi-mpc512x-psc.c    |  2 +-
 drivers/spi/spi-mpc52xx-psc.c    |  2 +-
 drivers/spi/spi-mxs.c            |  2 +-
 drivers/spi/spi-nuc900.c         |  2 +-
 drivers/spi/spi-oc-tiny.c        |  2 +-
 drivers/spi/spi-omap2-mcspi.c    |  4 ++--
 drivers/spi/spi-ppc4xx.c         |  2 +-
 drivers/spi/spi-qup.c            |  2 +-
 drivers/spi/spi-s3c24xx.c        |  2 +-
 drivers/spi/spi-s3c64xx.c        |  2 +-
 drivers/spi/spi-sh-msiof.c       |  4 ++--
 drivers/spi/spi-sirf.c           | 10 +++++-----
 drivers/spi/spi-sun4i.c          |  2 +-
 drivers/spi/spi-sun6i.c          |  2 +-
 drivers/spi/spi-tegra114.c       |  2 +-
 drivers/spi/spi-tegra20-sflash.c |  2 +-
 drivers/spi/spi-tegra20-slink.c  |  2 +-
 drivers/spi/spi-ti-qspi.c        |  4 ++--
 drivers/spi/spi-xilinx.c         |  2 +-
 drivers/spi/spi.c                |  4 ++--
 drivers/spi/spidev.c             |  2 +-
 32 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/drivers/spi/spi-altera.c b/drivers/spi/spi-altera.c
index 5b5709a5c957..b2d4440ced5f 100644
--- a/drivers/spi/spi-altera.c
+++ b/drivers/spi/spi-altera.c
@@ -134,7 +134,7 @@ static int altera_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
 		/* send the first byte */
 		writel(hw_txbyte(hw, 0), hw->base + ALTERA_SPI_TXDATA);
 
-		wait_for_completion(&hw->done);
+		wait_for_completion_io(&hw->done);
 		/* disable receive interrupt */
 		hw->imr &= ~ALTERA_SPI_CONTROL_IRRDY_MSK;
 		writel(hw->imr, hw->base + ALTERA_SPI_CONTROL);
diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
index 113c83f44b5c..427d356070ed 100644
--- a/drivers/spi/spi-atmel.c
+++ b/drivers/spi/spi-atmel.c
@@ -1114,7 +1114,7 @@ static int atmel_spi_one_transfer(struct spi_master *master,
 
 		/* interrupts are disabled, so free the lock for schedule */
 		atmel_spi_unlock(as);
-		ret = wait_for_completion_timeout(&as->xfer_completion,
+		ret = wait_for_completion_io_timeout(&as->xfer_completion,
 							SPI_DMA_TIMEOUT);
 		atmel_spi_lock(as);
 		if (WARN_ON(ret == 0)) {
diff --git a/drivers/spi/spi-au1550.c b/drivers/spi/spi-au1550.c
index f40b34cdf2fc..d0666a6c0829 100644
--- a/drivers/spi/spi-au1550.c
+++ b/drivers/spi/spi-au1550.c
@@ -402,7 +402,7 @@ static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t)
 	hw->regs->psc_spipcr = PSC_SPIPCR_MS;
 	wmb(); /* drain writebuffer */
 
-	wait_for_completion(&hw->master_done);
+	wait_for_completion_io(&hw->master_done);
 
 	au1xxx_dbdma_stop(hw->dma_tx_ch);
 	au1xxx_dbdma_stop(hw->dma_rx_ch);
@@ -552,7 +552,7 @@ static int au1550_spi_pio_txrxb(struct spi_device *spi, struct spi_transfer *t)
 	hw->regs->psc_spipcr = PSC_SPIPCR_MS;
 	wmb(); /* drain writebuffer */
 
-	wait_for_completion(&hw->master_done);
+	wait_for_completion_io(&hw->master_done);
 
 	return hw->rx_count < hw->tx_count ? hw->rx_count : hw->tx_count;
 }
diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c
index 69167456ec1e..4ba4d159619b 100644
--- a/drivers/spi/spi-bcm2835.c
+++ b/drivers/spi/spi-bcm2835.c
@@ -271,7 +271,7 @@ static int bcm2835_spi_transfer_one(struct spi_master *master,
 		if (err)
 			goto out;
 
-		timeout = wait_for_completion_timeout(&bs->done,
+		timeout = wait_for_completion_io_timeout(&bs->done,
 				msecs_to_jiffies(BCM2835_SPI_TIMEOUT_MS));
 		if (!timeout) {
 			err = -ETIMEDOUT;
diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c
index 86f5a98aa7a2..75520895cdf5 100644
--- a/drivers/spi/spi-bcm63xx-hsspi.c
+++ b/drivers/spi/spi-bcm63xx-hsspi.c
@@ -197,7 +197,7 @@ static int bcm63xx_hsspi_do_txrx(struct spi_device *spi, struct spi_transfer *t)
 			     PINGPONG_COMMAND_START_NOW,
 			     bs->regs + HSSPI_PINGPONG_COMMAND_REG(0));
 
-		if (wait_for_completion_timeout(&bs->done, HZ) == 0) {
+		if (wait_for_completion_io_timeout(&bs->done, HZ) == 0) {
 			dev_err(&bs->pdev->dev, "transfer timed out!\n");
 			return -ETIMEDOUT;
 		}
diff --git a/drivers/spi/spi-bcm63xx.c b/drivers/spi/spi-bcm63xx.c
index 8510400e7867..04ba88d9fe0a 100644
--- a/drivers/spi/spi-bcm63xx.c
+++ b/drivers/spi/spi-bcm63xx.c
@@ -195,7 +195,7 @@ static int bcm63xx_txrx_bufs(struct spi_device *spi, struct spi_transfer *first,
 	/* Enable the CMD_DONE interrupt */
 	bcm_spi_writeb(bs, SPI_INTR_CMD_DONE, SPI_INT_MASK);
 
-	timeout = wait_for_completion_timeout(&bs->done, HZ);
+	timeout = wait_for_completion_io_timeout(&bs->done, HZ);
 	if (!timeout)
 		return -ETIMEDOUT;
 
diff --git a/drivers/spi/spi-efm32.c b/drivers/spi/spi-efm32.c
index 6caeb1cac0f3..e847c986c9a2 100644
--- a/drivers/spi/spi-efm32.c
+++ b/drivers/spi/spi-efm32.c
@@ -204,7 +204,7 @@ static int efm32_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
 
 	spin_unlock_irq(&ddata->lock);
 
-	wait_for_completion(&ddata->done);
+	wait_for_completion_io(&ddata->done);
 
 	spin_lock_irq(&ddata->lock);
 
diff --git a/drivers/spi/spi-ep93xx.c b/drivers/spi/spi-ep93xx.c
index bf9728773247..30f240b86071 100644
--- a/drivers/spi/spi-ep93xx.c
+++ b/drivers/spi/spi-ep93xx.c
@@ -415,7 +415,7 @@ static void ep93xx_spi_pio_transfer(struct ep93xx_spi *espi)
 	 */
 	if (ep93xx_spi_read_write(espi)) {
 		ep93xx_spi_enable_interrupts(espi);
-		wait_for_completion(&espi->wait);
+		wait_for_completion_io(&espi->wait);
 	}
 }
 
@@ -583,7 +583,7 @@ static void ep93xx_spi_dma_transfer(struct ep93xx_spi *espi)
 	dma_async_issue_pending(espi->dma_rx);
 	dma_async_issue_pending(espi->dma_tx);
 
-	wait_for_completion(&espi->wait);
+	wait_for_completion_io(&espi->wait);
 
 	ep93xx_spi_dma_finish(espi, DMA_MEM_TO_DEV);
 	ep93xx_spi_dma_finish(espi, DMA_DEV_TO_MEM);
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index a7f94b6a9e70..d1640aa60230 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -242,7 +242,7 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
 	if (ret)
 		return ret;
 
-	wait_for_completion(&mpc8xxx_spi->done);
+	wait_for_completion_io(&mpc8xxx_spi->done);
 
 	/* disable rx ints */
 	mpc8xxx_spi_write_reg(&reg_base->mask, 0);
diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c
index ed792880c9d6..2ded296d53c2 100644
--- a/drivers/spi/spi-fsl-spi.c
+++ b/drivers/spi/spi-fsl-spi.c
@@ -342,7 +342,7 @@ static int fsl_spi_bufs(struct spi_device *spi, struct spi_transfer *t,
 	if (ret)
 		return ret;
 
-	wait_for_completion(&mpc8xxx_spi->done);
+	wait_for_completion_io(&mpc8xxx_spi->done);
 
 	/* disable rx ints */
 	mpc8xxx_spi_write_reg(&reg_base->mask, 0);
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 3637847b5370..eb1d8391e80e 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -939,7 +939,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
 	dma_async_issue_pending(master->dma_tx);
 	dma_async_issue_pending(master->dma_rx);
 	/* Wait SDMA to finish the data transfer.*/
-	ret = wait_for_completion_timeout(&spi_imx->dma_tx_completion,
+	ret = wait_for_completion_io_timeout(&spi_imx->dma_tx_completion,
 						IMX_DMA_TIMEOUT);
 	if (!ret) {
 		pr_warn("%s %s: I/O Error in DMA TX\n",
@@ -947,7 +947,7 @@ static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx,
 			dev_name(&master->dev));
 		dmaengine_terminate_all(master->dma_tx);
 	} else {
-		ret = wait_for_completion_timeout(&spi_imx->dma_rx_completion,
+		ret = wait_for_completion_io_timeout(&spi_imx->dma_rx_completion,
 				IMX_DMA_TIMEOUT);
 		if (!ret) {
 			pr_warn("%s %s: I/O Error in DMA RX\n",
@@ -994,7 +994,7 @@ static int spi_imx_pio_transfer(struct spi_device *spi,
 
 	spi_imx->devtype_data->intctrl(spi_imx, MXC_INT_TE);
 
-	wait_for_completion(&spi_imx->xfer_done);
+	wait_for_completion_io(&spi_imx->xfer_done);
 
 	return transfer->len;
 }
diff --git a/drivers/spi/spi-mpc512x-psc.c b/drivers/spi/spi-mpc512x-psc.c
index 577d23a12763..0d9cea915a84 100644
--- a/drivers/spi/spi-mpc512x-psc.c
+++ b/drivers/spi/spi-mpc512x-psc.c
@@ -170,7 +170,7 @@ static int mpc512x_psc_spi_transfer_rxtx(struct spi_device *spi,
 			reinit_completion(&mps->txisrdone);
 			out_be32(&fifo->txisr, MPC512x_PSC_FIFO_EMPTY);
 			out_be32(&fifo->tximr, MPC512x_PSC_FIFO_EMPTY);
-			wait_for_completion(&mps->txisrdone);
+			wait_for_completion_io(&mps->txisrdone);
 		}
 
 		/*
diff --git a/drivers/spi/spi-mpc52xx-psc.c b/drivers/spi/spi-mpc52xx-psc.c
index de532aa11d34..d48e388dc84a 100644
--- a/drivers/spi/spi-mpc52xx-psc.c
+++ b/drivers/spi/spi-mpc52xx-psc.c
@@ -183,7 +183,7 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
 			out_be16(&fifo->rfalarm, rfalarm);
 		}
 		out_be16(&psc->mpc52xx_psc_imr, MPC52xx_PSC_IMR_RXRDY);
-		wait_for_completion(&mps->done);
+		wait_for_completion_io(&mps->done);
 		recv_at_once = in_be16(&fifo->rfnum);
 		dev_dbg(&spi->dev, "%d bytes received\n", recv_at_once);
 
diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c
index 51460878af04..32080e879d1f 100644
--- a/drivers/spi/spi-mxs.c
+++ b/drivers/spi/spi-mxs.c
@@ -282,7 +282,7 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi,
 	dmaengine_submit(desc);
 	dma_async_issue_pending(ssp->dmach);
 
-	ret = wait_for_completion_timeout(&spi->c,
+	ret = wait_for_completion_io_timeout(&spi->c,
 				msecs_to_jiffies(SSP_TIMEOUT));
 	if (!ret) {
 		dev_err(ssp->dev, "DMA transfer timeout\n");
diff --git a/drivers/spi/spi-nuc900.c b/drivers/spi/spi-nuc900.c
index 73e91d5a43df..16bfcc654a97 100644
--- a/drivers/spi/spi-nuc900.c
+++ b/drivers/spi/spi-nuc900.c
@@ -185,7 +185,7 @@ static int nuc900_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
 
 	nuc900_spi_gobusy(hw);
 
-	wait_for_completion(&hw->done);
+	wait_for_completion_io(&hw->done);
 
 	return hw->count;
 }
diff --git a/drivers/spi/spi-oc-tiny.c b/drivers/spi/spi-oc-tiny.c
index 8998d11c7238..3dc1b7526fa3 100644
--- a/drivers/spi/spi-oc-tiny.c
+++ b/drivers/spi/spi-oc-tiny.c
@@ -151,7 +151,7 @@ static int tiny_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
 			writeb(TINY_SPI_STATUS_TXE, hw->base + TINY_SPI_STATUS);
 		}
 
-		wait_for_completion(&hw->done);
+		wait_for_completion_io(&hw->done);
 	} else {
 		/* we need to tighten the transfer loop */
 		writeb(txp ? *txp++ : 0, hw->base + TINY_SPI_TXDATA);
diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 352eed7463ac..49fcea30588e 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -487,7 +487,7 @@ omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
 	dma_async_issue_pending(mcspi_dma->dma_rx);
 	omap2_mcspi_set_dma_req(spi, 1, 1);
 
-	wait_for_completion(&mcspi_dma->dma_rx_completion);
+	wait_for_completion_io(&mcspi_dma->dma_rx_completion);
 	dma_unmap_single(mcspi->dev, xfer->rx_dma, count,
 			 DMA_FROM_DEVICE);
 
@@ -601,7 +601,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
 		count = omap2_mcspi_rx_dma(spi, xfer, cfg, es);
 
 	if (tx != NULL) {
-		wait_for_completion(&mcspi_dma->dma_tx_completion);
+		wait_for_completion_io(&mcspi_dma->dma_tx_completion);
 		dma_unmap_single(mcspi->dev, xfer->tx_dma, xfer->len,
 				 DMA_TO_DEVICE);
 
diff --git a/drivers/spi/spi-ppc4xx.c b/drivers/spi/spi-ppc4xx.c
index 80b8408ac3e3..955ea726e5c6 100644
--- a/drivers/spi/spi-ppc4xx.c
+++ b/drivers/spi/spi-ppc4xx.c
@@ -161,7 +161,7 @@ static int spi_ppc4xx_txrx(struct spi_device *spi, struct spi_transfer *t)
 	data = hw->tx ? hw->tx[0] : 0;
 	out_8(&hw->regs->txd, data);
 	out_8(&hw->regs->cr, SPI_PPC4XX_CR_STR);
-	wait_for_completion(&hw->done);
+	wait_for_completion_io(&hw->done);
 
 	return hw->count;
 }
diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c
index 9f83d2950748..109917fa70d7 100644
--- a/drivers/spi/spi-qup.c
+++ b/drivers/spi/spi-qup.c
@@ -469,7 +469,7 @@ static int spi_qup_transfer_one(struct spi_master *master,
 		goto exit;
 	}
 
-	if (!wait_for_completion_timeout(&controller->done, timeout))
+	if (!wait_for_completion_io_timeout(&controller->done, timeout))
 		ret = -ETIMEDOUT;
 exit:
 	spi_qup_set_state(controller, QUP_STATE_RESET);
diff --git a/drivers/spi/spi-s3c24xx.c b/drivers/spi/spi-s3c24xx.c
index e713737d784f..6af9d7f84e7b 100644
--- a/drivers/spi/spi-s3c24xx.c
+++ b/drivers/spi/spi-s3c24xx.c
@@ -417,7 +417,7 @@ static int s3c24xx_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
 	/* send the first byte */
 	writeb(hw_txbyte(hw, 0), hw->regs + S3C2410_SPTDAT);
 
-	wait_for_completion(&hw->done);
+	wait_for_completion_io(&hw->done);
 	return hw->count;
 }
 
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
index 480133ee1eb3..653490cf408a 100644
--- a/drivers/spi/spi-s3c64xx.c
+++ b/drivers/spi/spi-s3c64xx.c
@@ -488,7 +488,7 @@ static int wait_for_dma(struct s3c64xx_spi_driver_data *sdd,
 	ms += 10; /* some tolerance */
 
 	val = msecs_to_jiffies(ms) + 10;
-	val = wait_for_completion_timeout(&sdd->xfer_completion, val);
+	val = wait_for_completion_io_timeout(&sdd->xfer_completion, val);
 
 	/*
 	 * If the previous xfer was completed within timeout, then
diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c
index 3f365402fcc0..71b1df4d159b 100644
--- a/drivers/spi/spi-sh-msiof.c
+++ b/drivers/spi/spi-sh-msiof.c
@@ -590,7 +590,7 @@ static int sh_msiof_spi_txrx_once(struct sh_msiof_spi_priv *p,
 	}
 
 	/* wait for tx fifo to be emptied / rx fifo to be filled */
-	ret = wait_for_completion_timeout(&p->done, HZ);
+	ret = wait_for_completion_io_timeout(&p->done, HZ);
 	if (!ret) {
 		dev_err(&p->pdev->dev, "PIO timeout\n");
 		ret = -ETIMEDOUT;
@@ -701,7 +701,7 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
 	}
 
 	/* wait for tx fifo to be emptied / rx fifo to be filled */
-	ret = wait_for_completion_timeout(&p->done, HZ);
+	ret = wait_for_completion_io_timeout(&p->done, HZ);
 	if (!ret) {
 		dev_err(&p->pdev->dev, "DMA timeout\n");
 		ret = -ETIMEDOUT;
diff --git a/drivers/spi/spi-sirf.c b/drivers/spi/spi-sirf.c
index 39e2c0a55a28..7a5571873581 100644
--- a/drivers/spi/spi-sirf.c
+++ b/drivers/spi/spi-sirf.c
@@ -325,7 +325,7 @@ static void spi_sirfsoc_cmd_transfer(struct spi_device *spi,
 		sspi->base + SIRFSOC_SPI_INT_EN);
 	writel(SIRFSOC_SPI_CMD_TX_EN,
 		sspi->base + SIRFSOC_SPI_TX_RX_EN);
-	if (wait_for_completion_timeout(&sspi->tx_done, timeout) == 0) {
+	if (wait_for_completion_io_timeout(&sspi->tx_done, timeout) == 0) {
 		dev_err(&spi->dev, "cmd transfer timeout\n");
 		return;
 	}
@@ -384,7 +384,7 @@ static void spi_sirfsoc_dma_transfer(struct spi_device *spi,
 	dma_async_issue_pending(sspi->rx_chan);
 	writel(SIRFSOC_SPI_RX_EN | SIRFSOC_SPI_TX_EN,
 			sspi->base + SIRFSOC_SPI_TX_RX_EN);
-	if (wait_for_completion_timeout(&sspi->rx_done, timeout) == 0) {
+	if (wait_for_completion_io_timeout(&sspi->rx_done, timeout) == 0) {
 		dev_err(&spi->dev, "transfer timeout\n");
 		dmaengine_terminate_all(sspi->rx_chan);
 	} else
@@ -394,7 +394,7 @@ static void spi_sirfsoc_dma_transfer(struct spi_device *spi,
 	 * we get rx data by writing tx data, so if rx is done, tx has
 	 * done earlier
 	 */
-	if (wait_for_completion_timeout(&sspi->tx_done, timeout) == 0) {
+	if (wait_for_completion_io_timeout(&sspi->tx_done, timeout) == 0) {
 		dev_err(&spi->dev, "transfer timeout\n");
 		dmaengine_terminate_all(sspi->tx_chan);
 	}
@@ -443,8 +443,8 @@ static void spi_sirfsoc_pio_transfer(struct spi_device *spi,
 			sspi->base + SIRFSOC_SPI_INT_EN);
 		writel(SIRFSOC_SPI_RX_EN | SIRFSOC_SPI_TX_EN,
 			sspi->base + SIRFSOC_SPI_TX_RX_EN);
-		if (!wait_for_completion_timeout(&sspi->tx_done, timeout) ||
-			!wait_for_completion_timeout(&sspi->rx_done, timeout)) {
+		if (!wait_for_completion_io_timeout(&sspi->tx_done, timeout) ||
+			!wait_for_completion_io_timeout(&sspi->rx_done, timeout)) {
 			dev_err(&spi->dev, "transfer timeout\n");
 			break;
 		}
diff --git a/drivers/spi/spi-sun4i.c b/drivers/spi/spi-sun4i.c
index 85204c93f3d3..f2d3d03891e9 100644
--- a/drivers/spi/spi-sun4i.c
+++ b/drivers/spi/spi-sun4i.c
@@ -279,7 +279,7 @@ static int sun4i_spi_transfer_one(struct spi_master *master,
 	reg = sun4i_spi_read(sspi, SUN4I_CTL_REG);
 	sun4i_spi_write(sspi, SUN4I_CTL_REG, reg | SUN4I_CTL_XCH);
 
-	timeout = wait_for_completion_timeout(&sspi->done,
+	timeout = wait_for_completion_io_timeout(&sspi->done,
 					      msecs_to_jiffies(1000));
 	if (!timeout) {
 		ret = -ETIMEDOUT;
diff --git a/drivers/spi/spi-sun6i.c b/drivers/spi/spi-sun6i.c
index bd24093f4038..6c8b73f74690 100644
--- a/drivers/spi/spi-sun6i.c
+++ b/drivers/spi/spi-sun6i.c
@@ -269,7 +269,7 @@ static int sun6i_spi_transfer_one(struct spi_master *master,
 	reg = sun6i_spi_read(sspi, SUN6I_TFR_CTL_REG);
 	sun6i_spi_write(sspi, SUN6I_TFR_CTL_REG, reg | SUN6I_TFR_CTL_XCH);
 
-	timeout = wait_for_completion_timeout(&sspi->done,
+	timeout = wait_for_completion_io_timeout(&sspi->done,
 					      msecs_to_jiffies(1000));
 	if (!timeout) {
 		ret = -ETIMEDOUT;
diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c
index 795bcbc0131b..2b6c4de63c23 100644
--- a/drivers/spi/spi-tegra114.c
+++ b/drivers/spi/spi-tegra114.c
@@ -833,7 +833,7 @@ static int tegra_spi_transfer_one_message(struct spi_master *master,
 		}
 
 		is_first_msg = false;
-		ret = wait_for_completion_timeout(&tspi->xfer_completion,
+		ret = wait_for_completion_io_timeout(&tspi->xfer_completion,
 						SPI_DMA_TIMEOUT);
 		if (WARN_ON(ret == 0)) {
 			dev_err(tspi->dev,
diff --git a/drivers/spi/spi-tegra20-sflash.c b/drivers/spi/spi-tegra20-sflash.c
index cd66fe7b78a9..70b858b44fc7 100644
--- a/drivers/spi/spi-tegra20-sflash.c
+++ b/drivers/spi/spi-tegra20-sflash.c
@@ -337,7 +337,7 @@ static int tegra_sflash_transfer_one_message(struct spi_master *master,
 			goto exit;
 		}
 		is_first_msg = false;
-		ret = wait_for_completion_timeout(&tsd->xfer_completion,
+		ret = wait_for_completion_io_timeout(&tsd->xfer_completion,
 						SPI_DMA_TIMEOUT);
 		if (WARN_ON(ret == 0)) {
 			dev_err(tsd->dev,
diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c
index 0b9e32e9f493..9b16fac3d069 100644
--- a/drivers/spi/spi-tegra20-slink.c
+++ b/drivers/spi/spi-tegra20-slink.c
@@ -820,7 +820,7 @@ static int tegra_slink_transfer_one(struct spi_master *master,
 		return ret;
 	}
 
-	ret = wait_for_completion_timeout(&tspi->xfer_completion,
+	ret = wait_for_completion_io_timeout(&tspi->xfer_completion,
 					  SLINK_DMA_TIMEOUT);
 	if (WARN_ON(ret == 0)) {
 		dev_err(tspi->dev,
diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c
index 6c211d1910b0..e1d7d813b80d 100644
--- a/drivers/spi/spi-ti-qspi.c
+++ b/drivers/spi/spi-ti-qspi.c
@@ -230,7 +230,7 @@ static int qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t)
 		}
 
 		ti_qspi_write(qspi, cmd, QSPI_SPI_CMD_REG);
-		ret = wait_for_completion_timeout(&qspi->transfer_complete,
+		ret = wait_for_completion_io_timeout(&qspi->transfer_complete,
 						  QSPI_COMPLETION_TIMEOUT);
 		if (ret == 0) {
 			dev_err(qspi->dev, "write timed out\n");
@@ -268,7 +268,7 @@ static int qspi_read_msg(struct ti_qspi *qspi, struct spi_transfer *t)
 	while (count) {
 		dev_dbg(qspi->dev, "rx cmd %08x dc %08x\n", cmd, qspi->dc);
 		ti_qspi_write(qspi, cmd, QSPI_SPI_CMD_REG);
-		ret = wait_for_completion_timeout(&qspi->transfer_complete,
+		ret = wait_for_completion_io_timeout(&qspi->transfer_complete,
 				QSPI_COMPLETION_TIMEOUT);
 		if (ret == 0) {
 			dev_err(qspi->dev, "read timed out\n");
diff --git a/drivers/spi/spi-xilinx.c b/drivers/spi/spi-xilinx.c
index 79bd84f43430..eb11e12b6ddc 100644
--- a/drivers/spi/spi-xilinx.c
+++ b/drivers/spi/spi-xilinx.c
@@ -265,7 +265,7 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
 							~XSPI_CR_TRANS_INHIBIT;
 		xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET);
 
-		wait_for_completion(&xspi->done);
+		wait_for_completion_io(&xspi->done);
 
 		/* A transmit has just completed. Process received data and
 		 * check for more data to transmit. Always inhibit the
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index ebcb33df2eb2..f8f76978b9b2 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -810,7 +810,7 @@ static int spi_transfer_one_message(struct spi_master *master,
 				ms = xfer->len * 8 * 1000 / xfer->speed_hz;
 				ms += ms + 100; /* some tolerance */
 
-				ms = wait_for_completion_timeout(&master->xfer_completion,
+				ms = wait_for_completion_io_timeout(&master->xfer_completion,
 								 msecs_to_jiffies(ms));
 			}
 
@@ -2113,7 +2113,7 @@ static int __spi_sync(struct spi_device *spi, struct spi_message *message,
 		mutex_unlock(&master->bus_lock_mutex);
 
 	if (status == 0) {
-		wait_for_completion(&done);
+		wait_for_completion_io(&done);
 		status = message->status;
 	}
 	message->context = NULL;
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
index e3bc23bb5883..a2171010b46d 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -123,7 +123,7 @@ spidev_sync(struct spidev_data *spidev, struct spi_message *message)
 	spin_unlock_irq(&spidev->spi_lock);
 
 	if (status == 0) {
-		wait_for_completion(&done);
+		wait_for_completion_io(&done);
 		status = message->status;
 		if (status == 0)
 			status = message->actual_length;
-- 
2.1.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [RFC 0/2] drivers: spi/i2c: account completions as iowait
       [not found] ` <1414936689-2707-1-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
  2014-11-02 13:58   ` [RFC 2/2] spi: " Wolfram Sang
@ 2014-11-02 16:59   ` Peter Zijlstra
       [not found]     ` <20141102165943.GT10501-IIpfhp3q70z/8w/KjCw3T+5/BudmfyzbbVWyRVo5IupeoWH0uzbU5w@public.gmane.org>
  1 sibling, 1 reply; 7+ messages in thread
From: Peter Zijlstra @ 2014-11-02 16:59 UTC (permalink / raw)
  To: Wolfram Sang
  Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA, Mark Brown, Ingo Molnar,
	Balbir Singh

On Sun, Nov 02, 2014 at 02:58:07PM +0100, Wolfram Sang wrote:

> However, researching the net, users currently interpret iowait entirely as
> blkio wait. Furthermore, io_schedule() calls delayacct_blkio_{start|end}() which
> worked fine for my tests with I2C but might show that iowait was really meant as
> blkiowait? So, should other subsystems use it?

I would tend to agree with that; historically this has always been about
blkio, not device io.

> To make it more confusing, some people (like Peter Zijlstra [1]) seem to like
> iowait gone, so maybe it is all not worth it?

Yeah, iowait accounting is terminally broken :-) Mostly because the
iowait is accounted per-cpu but that is a very tenuous relation because
the IO devices are not per IO and blocking tasks are not associated with
any particular CPU -- after all they're not consuming CPU time.

If people really think its worth; we could invent new IO-wait measure
that do make sense -- maybe, but the current thing is complete bollocks.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC 0/2] drivers: spi/i2c: account completions as iowait
  2014-11-02 13:58 [RFC 0/2] drivers: spi/i2c: account completions as iowait Wolfram Sang
  2014-11-02 13:58 ` [RFC 1/2] i2c: " Wolfram Sang
       [not found] ` <1414936689-2707-1-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
@ 2014-11-03 13:02 ` One Thousand Gnomes
       [not found]   ` <20141103130222.1c53fa39-mUKnrFFms3BCCTY1wZZT65JpZx93mCW/@public.gmane.org>
  2 siblings, 1 reply; 7+ messages in thread
From: One Thousand Gnomes @ 2014-11-03 13:02 UTC (permalink / raw)
  To: Wolfram Sang
  Cc: linux-kernel, linux-i2c, linux-spi, Mark Brown, Peter Zijlstra,
	Ingo Molnar, Balbir Singh

On Sun,  2 Nov 2014 14:58:07 +0100
Wolfram Sang <wsa@the-dreams.de> wrote:

> So, I recently learned that there is wait_for_completion_io_* because one I2C
> driver uses it instead of wait_for_completion_*. I want consistency, so
> technically the io-versions seem to be the correct ones to me, because, well,
> we are waiting for IO.
> 
> However, researching the net, users currently interpret iowait entirely as
> blkio wait. Furthermore, io_schedule() calls delayacct_blkio_{start|end}() which
> worked fine for my tests with I2C but might show that iowait was really meant as
> blkiowait? So, should other subsystems use it?

I don't think so. The traditional Unix use of I/O wait is block I/O wait,
in order to account for paging/swapping in "uptime".

The other problem is that if you change the way it behaves you'll get
lots of hate mail from people running server farms as all their load
balancing and cluster management changes behaviour, plus baffled users
wondering why their system is now busy and it wasn't in the last release.

I'm not really sure how it should be accounted - arguably an SPI
transaction to an SD card is I/O wait but one to a display controller on
the same i2c bus is not.

The other question you have to solve is that people are adding i2c and
SPI slave support both in Android space and now perhaps upstream. How do
you I/O account those transactions ?

Alan

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC 0/2] drivers: spi/i2c: account completions as iowait
       [not found]     ` <20141102165943.GT10501-IIpfhp3q70z/8w/KjCw3T+5/BudmfyzbbVWyRVo5IupeoWH0uzbU5w@public.gmane.org>
@ 2014-11-03 19:31       ` Wolfram Sang
  0 siblings, 0 replies; 7+ messages in thread
From: Wolfram Sang @ 2014-11-03 19:31 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA, Mark Brown, Ingo Molnar,
	Balbir Singh

[-- Attachment #1: Type: text/plain, Size: 277 bytes --]

> If people really think its worth; we could invent new IO-wait measure
> that do make sense -- maybe, but the current thing is complete bollocks.

One more reason to simply convert this one I2C user back to plain
wait_for_completion() for now.

Thanks for these explanations!

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC 0/2] drivers: spi/i2c: account completions as iowait
       [not found]   ` <20141103130222.1c53fa39-mUKnrFFms3BCCTY1wZZT65JpZx93mCW/@public.gmane.org>
@ 2014-11-03 19:45     ` Wolfram Sang
  0 siblings, 0 replies; 7+ messages in thread
From: Wolfram Sang @ 2014-11-03 19:45 UTC (permalink / raw)
  To: One Thousand Gnomes
  Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA, Mark Brown, Peter Zijlstra,
	Ingo Molnar, Balbir Singh

[-- Attachment #1: Type: text/plain, Size: 1480 bytes --]


> > However, researching the net, users currently interpret iowait entirely as
> > blkio wait. Furthermore, io_schedule() calls delayacct_blkio_{start|end}() which
> > worked fine for my tests with I2C but might show that iowait was really meant as
> > blkiowait? So, should other subsystems use it?
> 
> I don't think so. The traditional Unix use of I/O wait is block I/O wait,
> in order to account for paging/swapping in "uptime".

I see.

> The other problem is that if you change the way it behaves you'll get
> lots of hate mail from people running server farms as all their load
> balancing and cluster management changes behaviour, plus baffled users
> wondering why their system is now busy and it wasn't in the last release.

I was fearing something like that. On the other hand, it might have been
more correct. That's why I asked.

> The other question you have to solve is that people are adding i2c and
> SPI slave support both in Android space and now perhaps upstream. How do
> you I/O account those transactions ?

I implemented I2C slave support for upstream [1] and I don't think it
needs to be acocunted. While a master transaction gets kicked off and
then waits for success using a completion, slave support is more like
serving an interrupt and then getting or putting a byte immediately.

Thanks for your answers, I'll simply keep I2C away from iowait.

   Wolfram

[1] http://thread.gmane.org/gmane.linux.kernel/1783295


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-11-03 19:45 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-11-02 13:58 [RFC 0/2] drivers: spi/i2c: account completions as iowait Wolfram Sang
2014-11-02 13:58 ` [RFC 1/2] i2c: " Wolfram Sang
     [not found] ` <1414936689-2707-1-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
2014-11-02 13:58   ` [RFC 2/2] spi: " Wolfram Sang
2014-11-02 16:59   ` [RFC 0/2] drivers: spi/i2c: " Peter Zijlstra
     [not found]     ` <20141102165943.GT10501-IIpfhp3q70z/8w/KjCw3T+5/BudmfyzbbVWyRVo5IupeoWH0uzbU5w@public.gmane.org>
2014-11-03 19:31       ` Wolfram Sang
2014-11-03 13:02 ` One Thousand Gnomes
     [not found]   ` <20141103130222.1c53fa39-mUKnrFFms3BCCTY1wZZT65JpZx93mCW/@public.gmane.org>
2014-11-03 19:45     ` Wolfram Sang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).