From: Pierre Ossman <drzeus-list@drzeus.cx>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Russell King <rmk+lkml@arm.linux.org.uk>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: MMC performance
Date: Mon, 11 Oct 2004 17:27:44 +0200 [thread overview]
Message-ID: <416AA670.6040109@drzeus.cx> (raw)
In-Reply-To: <1097500722.31259.17.camel@localhost.localdomain>
[-- Attachment #1: Type: text/plain, Size: 199 bytes --]
Alan Cox wrote:
>Only on retries. You can try and blast the lot out the first time then
>on retries you write sector by sector.
>
>
>
Something like this? Gives more than double throughput here.
[-- Attachment #2: mmc-bulk.patch --]
[-- Type: text/x-patch, Size: 2761 bytes --]
Index: linux-wbsd/drivers/mmc/mmc_block.c
===================================================================
--- linux-wbsd/drivers/mmc/mmc_block.c (revision 71)
+++ linux-wbsd/drivers/mmc/mmc_block.c (working copy)
@@ -166,9 +166,20 @@
struct mmc_blk_data *md = mq->data;
struct mmc_card *card = md->queue.card;
int ret;
+ int failsafe;
if (mmc_card_claim_host(card))
goto cmd_err;
+
+ /*
+ * We first try transfering multiple blocks. If this fails
+ * we fall back to single block transfers.
+ *
+ * This gives us good performance when all is well and the
+ * possibility to determine which sector fails when all
+ * is not well.
+ */
+ failsafe = 0;
do {
struct mmc_blk_request brq;
@@ -188,15 +199,24 @@
brq.stop.opcode = MMC_STOP_TRANSMISSION;
brq.stop.arg = 0;
brq.stop.flags = MMC_RSP_R1B;
+
+ /*
+ * A multi-block transfer failed. Falling back to single
+ * blocks.
+ */
+ if (failsafe)
+ brq.data.blocks = 1;
+
+ ret = 1;
if (rq_data_dir(req) == READ) {
brq.cmd.opcode = brq.data.blocks > 1 ? MMC_READ_MULTIPLE_BLOCK : MMC_READ_SINGLE_BLOCK;
brq.data.flags |= MMC_DATA_READ;
} else {
- brq.cmd.opcode = MMC_WRITE_BLOCK;
+ brq.cmd.opcode = brq.data.blocks > 1 ? MMC_WRITE_MULTIPLE_BLOCK :
+ MMC_WRITE_BLOCK;
brq.cmd.flags = MMC_RSP_R1B;
brq.data.flags |= MMC_DATA_WRITE;
- brq.data.blocks = 1;
}
brq.mrq.stop = brq.data.blocks > 1 ? &brq.stop : NULL;
@@ -204,19 +224,34 @@
if (brq.cmd.error) {
printk(KERN_ERR "%s: error %d sending read/write command\n",
req->rq_disk->disk_name, brq.cmd.error);
- goto cmd_err;
+ if (failsafe)
+ goto cmd_err;
+ else {
+ failsafe = 1;
+ continue;
+ }
}
if (brq.data.error) {
printk(KERN_ERR "%s: error %d transferring data\n",
req->rq_disk->disk_name, brq.data.error);
- goto cmd_err;
+ if (failsafe)
+ goto cmd_err;
+ else {
+ failsafe = 1;
+ continue;
+ }
}
if (brq.stop.error) {
printk(KERN_ERR "%s: error %d sending stop command\n",
req->rq_disk->disk_name, brq.stop.error);
- goto cmd_err;
+ if (failsafe)
+ goto cmd_err;
+ else {
+ failsafe = 1;
+ continue;
+ }
}
do {
@@ -229,7 +264,12 @@
if (err) {
printk(KERN_ERR "%s: error %d requesting status\n",
req->rq_disk->disk_name, err);
- goto cmd_err;
+ if (failsafe)
+ goto cmd_err;
+ else {
+ failsafe = 1;
+ continue;
+ }
}
} while (!(cmd.resp[0] & R1_READY_FOR_DATA));
@@ -255,6 +295,11 @@
end_that_request_last(req);
}
spin_unlock_irq(&md->lock);
+
+ /*
+ * Go back to bulk mode if in failsafe mode.
+ */
+ failsafe = 0;
} while (ret);
mmc_card_release_host(card);
next prev parent reply other threads:[~2004-10-11 15:32 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-10-11 11:05 MMC performance Pierre Ossman
2004-10-11 12:19 ` Russell King
2004-10-11 13:18 ` Alan Cox
2004-10-11 15:27 ` Pierre Ossman [this message]
2004-10-11 18:01 ` Pierre Ossman
2004-10-18 19:26 ` Pierre Ossman
2004-10-11 13:49 ` Pierre Ossman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=416AA670.6040109@drzeus.cx \
--to=drzeus-list@drzeus.cx \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=rmk+lkml@arm.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.