On 21 October 2016 at 11:19, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote: > On 20/10/16 11:19, Ulf Hansson wrote: >> When polling for busy after sending a MMC_SWITCH command, both the optional >> ->card_busy() callback and CMD13 are being used in conjunction. >> >> This doesn't make sense. Instead it's more reasonable to rely solely on the >> ->card_busy() callback when it exists. Let's change that and instead use >> the CMD13 as a fall-back. In this way we avoid sending CMD13, unless it's >> really needed. >> >> Within this context, let's also take the opportunity to make some >> additional clean-ups and clarifications to the related code. >> >> Signed-off-by: Ulf Hansson <ulf.hansson@xxxxxxxxxx> >> --- >> drivers/mmc/core/mmc_ops.c | 30 ++++++++++++++---------------- >> 1 file changed, 14 insertions(+), 16 deletions(-) >> >> diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c >> index a84a880..481bbdb 100644 >> --- a/drivers/mmc/core/mmc_ops.c >> +++ b/drivers/mmc/core/mmc_ops.c >> @@ -495,34 +495,32 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, >> timeout = jiffies + msecs_to_jiffies(timeout_ms) + 1; >> do { >> /* >> - * Due to the possibility of being preempted after >> - * sending the status command, check the expiration >> - * time first. >> + * Due to the possibility of being preempted while polling, >> + * check the expiration time first. >> */ >> expired = time_after(jiffies, timeout); >> - if (send_status) { >> + >> + if (host->ops->card_busy) { >> + busy = host->ops->card_busy(host); > > I didn't really have time to look at these patches, sorry :-(. But this > loop looks like it could use a cond_resched() Yes, something like that is definitely needed! Although, I suggest we do that improvement on top of this change, if you are fine with that approach? The reason is that I am also pondering over, whether it could make sense to poll with a dynamically increased interval. At least when using ->card_busy(). Let's say by starting at 1 us interval, then at each poll attempt we double the interval time. We would then rather use a combination of udelay(), usleep_range() and msleep() to accomplish what you propose. Does that make sense to you? Kind regards Uffe -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html