Re: [PATCH] mmc: sdio: optimization for process_sdio_pending_irq

From: Nicolas Pitre
Date: Fri Dec 09 2011 - 09:17:08 EST


On Fri, 9 Dec 2011, Sangwook Lee wrote:

> Skip fillng in mmc_command struct for CCCR_INTx
> everytime sdio_irq_thread (process_sdio_pending_irqs)
> calls mmc_io_rw_direct.
>
> Signed-off-by: Sangwook Lee <sangwook.lee@xxxxxxxxxx>

Is there a real advantage doing this?

While you might be saving on a few stores, you are increasing code size
and therefore i-cache miss probabilities. So this is not clear to me
this is actually a gain.

> ---
> drivers/mmc/core/sdio_irq.c | 2 +-
> drivers/mmc/core/sdio_ops.c | 40 ++++++++++++++++++++++++++++++++++++++++
> drivers/mmc/core/sdio_ops.h | 1 +
> 3 files changed, 42 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c
> index 68f81b9..67f782a 100644
> --- a/drivers/mmc/core/sdio_irq.c
> +++ b/drivers/mmc/core/sdio_irq.c
> @@ -44,7 +44,7 @@ static int process_sdio_pending_irqs(struct mmc_card *card)
> return 1;
> }
>
> - ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_INTx, 0, &pending);
> + ret = mmc_io_rw_direct_irq(card, &pending);
> if (ret) {
> pr_debug("%s: error %d reading SDIO_CCCR_INTx\n",
> mmc_card_id(card), ret);
> diff --git a/drivers/mmc/core/sdio_ops.c b/drivers/mmc/core/sdio_ops.c
> index b0517cc..c80fc32 100644
> --- a/drivers/mmc/core/sdio_ops.c
> +++ b/drivers/mmc/core/sdio_ops.c
> @@ -111,6 +111,46 @@ static int mmc_io_rw_direct_host(struct mmc_host *host, int write, unsigned fn,
> return 0;
> }
>
> +static struct mmc_command sdio_intx_cmd = {
> + .opcode = SD_IO_RW_DIRECT,
> + .arg = SDIO_CCCR_INTx << 9,
> + .flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_AC,
> +};
> +
> +int mmc_io_rw_direct_irq(struct mmc_card *card, u8 *out)
> +{
> + int err;
> + struct mmc_host *host ;
> +
> + BUG_ON(!card);
> + host = card->host;
> + BUG_ON(!host);
> +
> + err = mmc_wait_for_cmd(host, &sdio_intx_cmd, 0);
> + if (err)
> + return err;
> +
> + if (mmc_host_is_spi(host)) {
> + /* host driver already reported errors */
> + } else {
> + if (sdio_intx_cmd.resp[0] & R5_ERROR)
> + return -EIO;
> + if (sdio_intx_cmd.resp[0] & R5_FUNCTION_NUMBER)
> + return -EINVAL;
> + if (sdio_intx_cmd.resp[0] & R5_OUT_OF_RANGE)
> + return -ERANGE;
> + }
> +
> + if (out) {
> + if (mmc_host_is_spi(host))
> + *out = (sdio_intx_cmd.resp[0] >> 8) & 0xFF;
> + else
> + *out = sdio_intx_cmd.resp[0] & 0xFF;
> + }
> +
> + return 0;
> +}
> +
> int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn,
> unsigned addr, u8 in, u8 *out)
> {
> diff --git a/drivers/mmc/core/sdio_ops.h b/drivers/mmc/core/sdio_ops.h
> index 12a4d3a..5fe8ad6 100644
> --- a/drivers/mmc/core/sdio_ops.h
> +++ b/drivers/mmc/core/sdio_ops.h
> @@ -15,6 +15,7 @@
> int mmc_send_io_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr);
> int mmc_io_rw_direct(struct mmc_card *card, int write, unsigned fn,
> unsigned addr, u8 in, u8* out);
> +int mmc_io_rw_direct_irq(struct mmc_card *card, u8 *out);
> int mmc_io_rw_extended(struct mmc_card *card, int write, unsigned fn,
> unsigned addr, int incr_addr, u8 *buf, unsigned blocks, unsigned blksz);
> int sdio_reset(struct mmc_host *host);
> --
> 1.7.4.1
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/