]> git.baikalelectronics.ru Git - kernel.git/commit
mmc: core: Throttle polling rate for CMD6
authorUlf Hansson <ulf.hansson@linaro.org>
Tue, 4 Feb 2020 08:54:38 +0000 (09:54 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 24 Mar 2020 13:35:39 +0000 (14:35 +0100)
commit42f0634c33b7ce52e2c9998552598196cb2150eb
treec4decd980e4b7a42419de0b98970e88b91ede9cf
parent504e04aac9aa89e5f1ff166c25c612e0d42d5eea
mmc: core: Throttle polling rate for CMD6

In mmc_poll_for_busy() we loop continuously, either by sending a CMD13 or
by invoking the ->card_busy() host ops, as to detect when the card stops
signaling busy. This behaviour is problematic as it may cause CPU hogging,
especially when the busy signal time reaches beyond a few ms.

Let's fix the issue by adding a throttling mechanism, that inserts a
usleep_range() in between the polling attempts. The sleep range starts at
32-64us, but increases for each loop by a factor of 2, up until the range
reaches ~32-64ms. In this way, we are able to keep the loop fine-grained
enough for short busy signaling times, while also not hogging the CPU for
longer times.

Note that, this change is inspired by the similar throttling mechanism that
we already use for mmc_do_erase().

Reported-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Baolin Wang <baolin.wang7@gmail.com>
Tested-by: Ludovic Barre <ludovic.barre@st.com>
Reviewed-by: Ludovic Barre <ludovic.barre@st.com>
Link: https://lore.kernel.org/r/20200204085449.32585-2-ulf.hansson@linaro.org
drivers/mmc/core/mmc_ops.c