Message ID | 20180226143413.44134-2-Evgeniy.Didin@synopsys.com |
---|---|
State | New |
Headers | show |
Series | [1/2,v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems | expand |
On Mon, Feb 26, 2018 at 4:34 PM, Evgeniy Didin <Evgeniy.Didin@synopsys.com> wrote: > In commit 9d9491a7da2a ("mmc: dw_mmc: Fix the DTO timeout calculation") have been made > changes which cause multiply overflow for 32-bit systems. > The broken timeout calculations caused false interrupt latency warnings > and stacktrace splat (such as below) when accessing the SD Card. > + drto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * drto_clks * drto_div, > host->bus_hz); Same as per patch 2.
> Tested-by: Vineet Gupta <Vineet.Gupta1@synopsys.com> > Fixes: ARC STAR 9001306872 HSDK, sdio: board crashes when copying big files > > Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com> > > CC: Alexey Brodkin <abrodkin@synopsys.com> > CC: Eugeniy Paltsev <paltsev@synopsys.com> > CC: Douglas Anderson <dianders@chromium.org> > CC: Ulf Hansson <ulf.hansson@linaro.org> > CC: linux-kernel@vger.kernel.org > CC: linux-snps-arc@lists.infradead.org > Cc: <stable@vger.kernel.org> # 9d9491a7da2a mmc: dw_mmc: Fix the DTO timeout calculation As I said, the correct tag may be: Reported-by: Vineet Gupta <Vineet.Gupta1@synopsys.com> # ARC STAR 9001306872 HSDK, sdio: board crashes when copying big files Tested-by: Vineet Gupta <Vineet.Gupta1@synopsys.com> Fixes: 9d9491a7da2a ("mmc: dw_mmc: Fix the DTO timeout calculation") Cc: <stable@vger.kernel.org> Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com> ... ... > --- > Nothing changed since v2. > drivers/mmc/host/dw_mmc.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > - drto_ms = DIV_ROUND_UP(MSEC_PER_SEC * drto_clks * drto_div, > + > + drto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * drto_clks * drto_div, > host->bus_hz); > Hmm? #define DIV_ROUND_DOWN_ULL(ll, d) \ ({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; }) #define DIV_ROUND_UP_ULL(ll, d) DIV_ROUND_DOWN_ULL((ll) + (d) - 1, (d)) It uses intermediate unsigned long long _tmp for your "multiply", namely MSEC_PER_SEC * drto_clks * drto_div, which could solves the problem. So I don't see why DIV_ROUND_UP_ULL can't work for you? > /* add a bit spare time */ >
> > #define DIV_ROUND_DOWN_ULL(ll, d) \ > ({ unsigned long long _tmp = (ll); do_div(_tmp, d); _tmp; }) > > #define DIV_ROUND_UP_ULL(ll, d) DIV_ROUND_DOWN_ULL((ll) + (d) - > 1, (d)) > > > It uses intermediate unsigned long long _tmp for your "multiply", namely > MSEC_PER_SEC * drto_clks * drto_div, which could solves the problem. > So I don't see why DIV_ROUND_UP_ULL can't work for you? Take back. I misunderstood your "multiply", sorry. > > >> /* add a bit spare time */ >> > > >
Hi Evgeniy,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on linus/master]
[also build test ERROR on v4.16-rc3 next-20180228]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Evgeniy-Didin/mmc-dw_mmc-Fix-the-DTO-timeout-overflow-calculation-for-32-bit-systems/20180228-141447
config: arm-exynos_defconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=arm
All errors (new ones prefixed by >>):
drivers/mmc/host/dw_mmc.o: In function `dw_mci_set_drto':
>> dw_mmc.c:(.text+0x1644): undefined reference to `__aeabi_uldivmod'
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 0aa39975f33b..194159219b32 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -1944,7 +1944,8 @@ static void dw_mci_set_drto(struct dw_mci *host) drto_div = (mci_readl(host, CLKDIV) & 0xff) * 2; if (drto_div == 0) drto_div = 1; - drto_ms = DIV_ROUND_UP(MSEC_PER_SEC * drto_clks * drto_div, + + drto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * drto_clks * drto_div, host->bus_hz); /* add a bit spare time */