From: Matthieu CASTET <matthieu.castet@parrot.com>
To: Kyungmin Park <kmpark@infradead.org>
Cc: "linux-mmc@vger.kernel.org" <linux-mmc@vger.kernel.org>
Subject: Re: sdhci : reduce irq off latency
Date: Fri, 18 Jun 2010 09:57:01 +0200 [thread overview]
Message-ID: <4C1B26CD.5070405@parrot.com> (raw)
In-Reply-To: <AANLkTinZ8If_JswEhoOShRZbQSjlh1uKgFYasnsfFeRx@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1355 bytes --]
Hi,
Thanks you for the test.
here a new version of the patch. It doesn't replace mdelay with jiffies
anymore. It changes mdelay to udelay (the granularity of 1 ms becomes 10
us).
I didn't mesure irq off latency with this patch.
Matthieu
Kyungmin Park a écrit :
> Hi,
>
> Not good news. This patch make a hang at probe time.
> it's tested against commit 7e27d6e778cd87b6f2415515d7127eba53fe5d02
> Author: Linus Torvalds <torvalds@linux-foundation.org>
> Date: Fri Jun 11 19:14:04 2010 -0700
>
> Linux 2.6.35-rc3
>
> Thank you,
> Kyungmin Park
>
> On Thu, Jun 17, 2010 at 6:07 PM, Matthieu CASTET
> <matthieu.castet@parrot.com> wrote:
>> sdhci code got tasklets (sdhci_tasklet_card and sdhci_tasklet_finish),
>> that does :
>> {
>> spin_lock_irqsave
>>
>> if (cond) {
>> sdhci_reset
>> sdhci_reset
>> }
>>
>> spin_unlock_irqrestore
>> }
>>
>> sdhci_reset {
>> ...
>> while (read_reg) {
>> if (timeout == 0)
>> break;
>> timeout--;
>> mdelay(1);
>> }
>> ...
>> }
>>
>>
>> The problem is that sdhci_reset [1] does busy pooling (with a granularity of
>> 1 ms) on a register up to a timeout of 100 ms.
>>
>> With the current code, we got irq off during 2*1ms. With the attached patch
>> we reduce irq off to 30 us.
>>
>> Note that worst case 100 ms irq off still exist.
>>
>> Signed-off-by: Matthieu CASTET <matthieu.castet@parrot.com>
>>
>>
[-- Attachment #2: sdhci.diff --]
[-- Type: text/x-diff, Size: 1617 bytes --]
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index c6d1bd8..fa06c70 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -157,7 +157,7 @@ static void sdhci_reset(struct sdhci_host *host, u8 mask)
host->clock = 0;
/* Wait max 100 ms */
- timeout = 100;
+ timeout = 100*100;
/* hw clears the bit when it's done */
while (sdhci_readb(host, SDHCI_SOFTWARE_RESET) & mask) {
@@ -168,7 +168,7 @@ static void sdhci_reset(struct sdhci_host *host, u8 mask)
return;
}
timeout--;
- mdelay(1);
+ udelay(10);
}
if (host->quirks & SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET)
@@ -882,7 +882,7 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
WARN_ON(host->cmd);
/* Wait max 10 ms */
- timeout = 10;
+ timeout = 10*100;
mask = SDHCI_CMD_INHIBIT;
if ((cmd->data != NULL) || (cmd->flags & MMC_RSP_BUSY))
@@ -903,7 +903,7 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
return;
}
timeout--;
- mdelay(1);
+ udelay(10);
}
mod_timer(&host->timer, jiffies + 10 * HZ);
@@ -1007,7 +1007,7 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
/* Wait max 20 ms */
- timeout = 20;
+ timeout = 20*100;
while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
& SDHCI_CLOCK_INT_STABLE)) {
if (timeout == 0) {
@@ -1017,7 +1017,7 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
return;
}
timeout--;
- mdelay(1);
+ udelay(10);
}
clk |= SDHCI_CLOCK_CARD_EN;
next prev parent reply other threads:[~2010-06-18 7:57 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-17 9:07 sdhci : reduce irq off latency Matthieu CASTET
2010-06-18 0:16 ` Kyungmin Park
2010-06-18 7:57 ` Matthieu CASTET [this message]
2010-06-18 8:26 ` Kyungmin Park
2010-08-28 2:23 ` Chris Ball
2010-08-30 9:40 ` Matthieu CASTET
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=4C1B26CD.5070405@parrot.com \
--to=matthieu.castet@parrot.com \
--cc=kmpark@infradead.org \
--cc=linux-mmc@vger.kernel.org \
/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.