* [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation @ 2018-02-26 14:34 Evgeniy Didin 2018-02-26 14:34 ` [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems Evgeniy Didin ` (2 more replies) 0 siblings, 3 replies; 15+ messages in thread From: Evgeniy Didin @ 2018-02-26 14:34 UTC (permalink / raw) To: linux-mmc Cc: Alexey Brodkin, Eugeniy Paltsev, Douglas Anderson, Ulf Hansson, linux-kernel, linux-snps-arc, stable, Vineet Gupta For some 32-bit architectures calculation of DTO and STO timeout can be incorrect due to multiply overflow. Lets prevent this by casting multiply and result to u64. Suggested by Jisheng Zhang. Switch DIV_ROUND_UP macro to DIV_ROUND_UP_ULL is not reasonable because overflow happens on multiply and DIV_ROUND_UP_ULL helps with sum overflow. --- Changes since v2: -add fix for cto_ms Evgeniy Didin (2): mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems drivers/mmc/host/dw_mmc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) -- 2.11.0 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems 2018-02-26 14:34 [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation Evgeniy Didin @ 2018-02-26 14:34 ` Evgeniy Didin 2018-02-26 14:40 ` Andy Shevchenko ` (2 more replies) 2018-02-26 14:34 ` [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO " Evgeniy Didin 2018-02-27 3:02 ` [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation Jisheng Zhang 2 siblings, 3 replies; 15+ messages in thread From: Evgeniy Didin @ 2018-02-26 14:34 UTC (permalink / raw) To: linux-mmc Cc: Alexey Brodkin, Eugeniy Paltsev, Douglas Anderson, Ulf Hansson, linux-kernel, linux-snps-arc, stable, Vineet Gupta 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. | Running : 4M-check-reassembly-tcp-cmykw2-rotatew2.out -v0 -w1 | - Info: Finished target initialization. | mmcblk0: error -110 transferring data, sector 320544, nr 2048, cmd response | 0x900, card status 0x0 | mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, actual | 396825HZ div = 63) | mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 25000000Hz, actual | 25000000HZ div = 1) | ------------[ cut here ]------------ | softirq: huh, entered softirq 6 TASKLET 6f6a9412 with preempt_count 00000101, | exited with 00000100? | WARNING: CPU: 2 PID: 0 at ../lib/scatterlist.c:652 sg_miter_next+0x28/0x20c | Modules linked in: | CPU: 2 PID: 0 Comm: swapper/2 Not tainted 4.15.0 #57 | | Stack Trace: | arc_unwind_core.constprop.1+0xd0/0xf4 | dump_stack+0x68/0x80 | warn_slowpath_null+0x4e/0xec | sg_miter_next+0x28/0x20c | dw_mci_read_data_pio+0x44/0x190 | dw_mmc f000a000.mmc: Unexpected interrupt latency | dw_mci_interrupt+0x3ee/0x530 | __handle_irq_event_percpu+0x56/0x150 | handle_irq_event+0x34/0x78 | handle_level_irq+0x8e/0x120 | generic_handle_irq+0x1c/0x2c | idu_cascade_isr+0x30/0x6c | __handle_domain_irq+0x72/0xc8 | ret_from_exception+0x0/0x8 |---[ end trace 2a58c9af6c25fe51 ]--- Lets cast this multiply to u64 type which prevents overflow. 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 --- Nothing changed since v2. drivers/mmc/host/dw_mmc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 */ -- 2.11.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems 2018-02-26 14:34 ` [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems Evgeniy Didin @ 2018-02-26 14:40 ` Andy Shevchenko 2018-02-27 1:14 ` Shawn Lin 2018-03-01 1:22 ` kbuild test robot 2 siblings, 0 replies; 15+ messages in thread From: Andy Shevchenko @ 2018-02-26 14:40 UTC (permalink / raw) To: Evgeniy Didin Cc: linux-mmc, Alexey Brodkin, Eugeniy Paltsev, Douglas Anderson, Ulf Hansson, Linux Kernel Mailing List, linux-snps-arc, Stable, Vineet Gupta 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. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems 2018-02-26 14:34 ` [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems Evgeniy Didin 2018-02-26 14:40 ` Andy Shevchenko @ 2018-02-27 1:14 ` Shawn Lin 2018-03-01 1:22 ` kbuild test robot 2 siblings, 0 replies; 15+ messages in thread From: Shawn Lin @ 2018-02-27 1:14 UTC (permalink / raw) To: Evgeniy Didin, linux-mmc Cc: shawn.lin, Alexey Brodkin, Eugeniy Paltsev, Douglas Anderson, Ulf Hansson, linux-kernel, linux-snps-arc, stable, Vineet Gupta > 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 */ > ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems 2018-02-26 14:34 ` [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems Evgeniy Didin 2018-02-26 14:40 ` Andy Shevchenko 2018-02-27 1:14 ` Shawn Lin @ 2018-03-01 1:22 ` kbuild test robot 2 siblings, 0 replies; 15+ messages in thread From: kbuild test robot @ 2018-03-01 1:22 UTC (permalink / raw) To: Evgeniy Didin Cc: kbuild-all, linux-mmc, Alexey Brodkin, Eugeniy Paltsev, Douglas Anderson, Ulf Hansson, linux-kernel, linux-snps-arc, stable, Vineet Gupta [-- Attachment #1: Type: text/plain, Size: 1081 bytes --] 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 [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 28590 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-26 14:34 [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation Evgeniy Didin 2018-02-26 14:34 ` [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems Evgeniy Didin @ 2018-02-26 14:34 ` Evgeniy Didin 2018-02-26 14:39 ` Andy Shevchenko 2018-02-27 3:02 ` [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation Jisheng Zhang 2 siblings, 1 reply; 15+ messages in thread From: Evgeniy Didin @ 2018-02-26 14:34 UTC (permalink / raw) To: linux-mmc Cc: Alexey Brodkin, Eugeniy Paltsev, Douglas Anderson, Ulf Hansson, linux-kernel, linux-snps-arc, stable, Vineet Gupta In commit 4c2357f57dd5 ("mmc: dw_mmc: Fix the CTO timeout calculation") have been made changes which can cause multiply overflow for 32-bit systems. The value of cto_ms is lower the drto_ms, but nevertheless overflow can occur. Lets cast this multiply to u64 type which prevents overflow. 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> # 4c2357f57dd5 mmc: dw_mmc: Fix the CTO timeout calculation --- drivers/mmc/host/dw_mmc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 194159219b32..775fb3ae1443 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -409,7 +409,8 @@ static inline void dw_mci_set_cto(struct dw_mci *host) cto_div = (mci_readl(host, CLKDIV) & 0xff) * 2; if (cto_div == 0) cto_div = 1; - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); + + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); /* add a bit spare time */ cto_ms += 10; -- 2.11.0 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-26 14:34 ` [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO " Evgeniy Didin @ 2018-02-26 14:39 ` Andy Shevchenko 2018-02-26 15:14 ` Evgeniy Didin 0 siblings, 1 reply; 15+ messages in thread From: Andy Shevchenko @ 2018-02-26 14:39 UTC (permalink / raw) To: Evgeniy Didin Cc: linux-mmc, Alexey Brodkin, Eugeniy Paltsev, Douglas Anderson, Ulf Hansson, Linux Kernel Mailing List, linux-snps-arc, Stable, Vineet Gupta On Mon, Feb 26, 2018 at 4:34 PM, Evgeniy Didin <Evgeniy.Didin@synopsys.com> wrote: > In commit 4c2357f57dd5 ("mmc: dw_mmc: Fix the CTO timeout calculation") > have been made changes which can cause multiply overflow for 32-bit systems. > The value of cto_ms is lower the drto_ms, but nevertheless overflow can occur. > Lets cast this multiply to u64 type which prevents overflow. > - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > + > + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); IIRC, someone commented on this or similar, i.e. DIV_ROUND_UP_ULL() ? -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-26 14:39 ` Andy Shevchenko @ 2018-02-26 15:14 ` Evgeniy Didin 2018-02-26 16:53 ` Andy Shevchenko 0 siblings, 1 reply; 15+ messages in thread From: Evgeniy Didin @ 2018-02-26 15:14 UTC (permalink / raw) To: andy.shevchenko, Evgeniy.Didin Cc: linux-kernel, Alexey.Brodkin, linux-mmc, dianders, Vineet.Gupta1, Eugeniy.Paltsev, linux-snps-arc, stable, ulf.hansson On Mon, 2018-02-26 at 16:39 +0200, Andy Shevchenko wrote: > On Mon, Feb 26, 2018 at 4:34 PM, Evgeniy Didin > <Evgeniy.Didin@synopsys.com> wrote: > > In commit 4c2357f57dd5 ("mmc: dw_mmc: Fix the CTO timeout calculation") > > have been made changes which can cause multiply overflow for 32-bit systems. > > The value of cto_ms is lower the drto_ms, but nevertheless overflow can occur. > > Lets cast this multiply to u64 type which prevents overflow. > > - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > > + > > + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > > IIRC, someone commented on this or similar, i.e. > > DIV_ROUND_UP_ULL() ? Switch DIV_ROUND_UP macro to DIV_ROUND_UP_ULL is not reasonable because overflow happens on multiply and DIV_ROUND_UP_ULL helps with sum overflow. -- Best regards, Evgeniy Didin ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-26 15:14 ` Evgeniy Didin @ 2018-02-26 16:53 ` Andy Shevchenko 2018-02-26 17:14 ` Evgeniy Didin 0 siblings, 1 reply; 15+ messages in thread From: Andy Shevchenko @ 2018-02-26 16:53 UTC (permalink / raw) To: Evgeniy Didin Cc: linux-kernel, Alexey.Brodkin, linux-mmc, dianders, Vineet.Gupta1, Eugeniy.Paltsev, linux-snps-arc, stable, ulf.hansson On Mon, Feb 26, 2018 at 5:14 PM, Evgeniy Didin <Evgeniy.Didin@synopsys.com> wrote: > On Mon, 2018-02-26 at 16:39 +0200, Andy Shevchenko wrote: >> On Mon, Feb 26, 2018 at 4:34 PM, Evgeniy Didin >> <Evgeniy.Didin@synopsys.com> wrote: >> > In commit 4c2357f57dd5 ("mmc: dw_mmc: Fix the CTO timeout calculation") >> > have been made changes which can cause multiply overflow for 32-bit systems. >> > The value of cto_ms is lower the drto_ms, but nevertheless overflow can occur. >> > Lets cast this multiply to u64 type which prevents overflow. >> > - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); >> > + >> > + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); >> >> IIRC, someone commented on this or similar, i.e. >> >> DIV_ROUND_UP_ULL() ? > Switch DIV_ROUND_UP macro to DIV_ROUND_UP_ULL is not reasonable > because overflow happens on multiply and DIV_ROUND_UP_ULL helps > with sum overflow. Did you try to compile your code for 32-bit target? -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-26 16:53 ` Andy Shevchenko @ 2018-02-26 17:14 ` Evgeniy Didin 2018-02-26 18:30 ` Andy Shevchenko 0 siblings, 1 reply; 15+ messages in thread From: Evgeniy Didin @ 2018-02-26 17:14 UTC (permalink / raw) To: andy.shevchenko, Evgeniy.Didin Cc: linux-kernel, Alexey.Brodkin, linux-mmc, dianders, Vineet.Gupta1, Eugeniy.Paltsev, linux-snps-arc, stable, ulf.hansson On Mon, 2018-02-26 at 18:53 +0200, Andy Shevchenko wrote: > On Mon, Feb 26, 2018 at 5:14 PM, Evgeniy Didin > <Evgeniy.Didin@synopsys.com> wrote: > > On Mon, 2018-02-26 at 16:39 +0200, Andy Shevchenko wrote: > > > On Mon, Feb 26, 2018 at 4:34 PM, Evgeniy Didin > > > <Evgeniy.Didin@synopsys.com> wrote: > > > > In commit 4c2357f57dd5 ("mmc: dw_mmc: Fix the CTO timeout calculation") > > > > have been made changes which can cause multiply overflow for 32-bit systems. > > > > The value of cto_ms is lower the drto_ms, but nevertheless overflow can occur. > > > > Lets cast this multiply to u64 type which prevents overflow. > > > > - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > > > > + > > > > + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > > > > > > IIRC, someone commented on this or similar, i.e. > > > > > > DIV_ROUND_UP_ULL() ? > > > > Switch DIV_ROUND_UP macro to DIV_ROUND_UP_ULL is not reasonable > > because overflow happens on multiply and DIV_ROUND_UP_ULL helps > > with sum overflow. > > Did you try to compile your code for 32-bit target? Yes, we have compiled code for 32-bit system. I am wondering why are you asking that? -- Best regards, Evgeniy Didin ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-26 17:14 ` Evgeniy Didin @ 2018-02-26 18:30 ` Andy Shevchenko 2018-02-26 20:27 ` Alexey Brodkin 0 siblings, 1 reply; 15+ messages in thread From: Andy Shevchenko @ 2018-02-26 18:30 UTC (permalink / raw) To: Evgeniy Didin Cc: linux-kernel, Alexey.Brodkin, linux-mmc, dianders, Vineet.Gupta1, Eugeniy.Paltsev, linux-snps-arc, stable, ulf.hansson On Mon, Feb 26, 2018 at 7:14 PM, Evgeniy Didin <Evgeniy.Didin@synopsys.com> wrote: > On Mon, 2018-02-26 at 18:53 +0200, Andy Shevchenko wrote: >> On Mon, Feb 26, 2018 at 5:14 PM, Evgeniy Didin >> <Evgeniy.Didin@synopsys.com> wrote: >> > On Mon, 2018-02-26 at 16:39 +0200, Andy Shevchenko wrote: >> > > On Mon, Feb 26, 2018 at 4:34 PM, Evgeniy Didin >> > > <Evgeniy.Didin@synopsys.com> wrote: >> > > > In commit 4c2357f57dd5 ("mmc: dw_mmc: Fix the CTO timeout calculation") >> > > > have been made changes which can cause multiply overflow for 32-bit systems. >> > > > The value of cto_ms is lower the drto_ms, but nevertheless overflow can occur. >> > > > Lets cast this multiply to u64 type which prevents overflow. >> > > > - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); >> > > > + >> > > > + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); >> > > >> > > IIRC, someone commented on this or similar, i.e. >> > > >> > > DIV_ROUND_UP_ULL() ? >> > >> > Switch DIV_ROUND_UP macro to DIV_ROUND_UP_ULL is not reasonable >> > because overflow happens on multiply and DIV_ROUND_UP_ULL helps >> > with sum overflow. >> >> Did you try to compile your code for 32-bit target? > Yes, we have compiled code for 32-bit system. > I am wondering why are you asking that? Because I simple didn't believe you. ERROR: "__udivdi3" [drivers/mmc/host/dw_mmc.ko] undefined! ...scripts/Makefile.modpost:92: recipe for target '__modpost' failed make[2]: *** [__modpost] Error 1 +++ b/drivers/mmc/host/dw_mmc.c @@ -409,7 +409,7 @@ static inline void dw_mci_set_cto(struct dw_mci *host) - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-26 18:30 ` Andy Shevchenko @ 2018-02-26 20:27 ` Alexey Brodkin 2018-02-27 3:52 ` Jisheng Zhang 0 siblings, 1 reply; 15+ messages in thread From: Alexey Brodkin @ 2018-02-26 20:27 UTC (permalink / raw) To: andy.shevchenko Cc: linux-kernel, dianders, linux-mmc, Vineet.Gupta1, Eugeniy.Paltsev, linux-snps-arc, stable, Evgeniy.Didin, ulf.hansson Hi Andy, On Mon, 2018-02-26 at 20:30 +0200, Andy Shevchenko wrote: > On Mon, Feb 26, 2018 at 7:14 PM, Evgeniy Didin > <Evgeniy.Didin@synopsys.com> wrote: > > On Mon, 2018-02-26 at 18:53 +0200, Andy Shevchenko wrote: > > > On Mon, Feb 26, 2018 at 5:14 PM, Evgeniy Didin > > > <Evgeniy.Didin@synopsys.com> wrote: > > > > On Mon, 2018-02-26 at 16:39 +0200, Andy Shevchenko wrote: > > > > > On Mon, Feb 26, 2018 at 4:34 PM, Evgeniy Didin > > > > > <Evgeniy.Didin@synopsys.com> wrote: > > > > > > In commit 4c2357f57dd5 ("mmc: dw_mmc: Fix the CTO timeout calculation") > > > > > > have been made changes which can cause multiply overflow for 32-bit systems. > > > > > > The value of cto_ms is lower the drto_ms, but nevertheless overflow can occur. > > > > > > Lets cast this multiply to u64 type which prevents overflow. > > > > > > - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > > > > > > + > > > > > > + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > > > > > > > > > > IIRC, someone commented on this or similar, i.e. > > > > > > > > > > DIV_ROUND_UP_ULL() ? > > > > > > > > Switch DIV_ROUND_UP macro to DIV_ROUND_UP_ULL is not reasonable > > > > because overflow happens on multiply and DIV_ROUND_UP_ULL helps > > > > with sum overflow. > > > > > > Did you try to compile your code for 32-bit target? > > > > Yes, we have compiled code for 32-bit system. > > I am wondering why are you asking that? > > Because I simple didn't believe you. Well world around us is much more complicated than it sometimes looks like :) > ERROR: "__udivdi3" [drivers/mmc/host/dw_mmc.ko] undefined! > ...scripts/Makefile.modpost:92: recipe for target '__modpost' failed > make[2]: *** [__modpost] Error 1 That's right __udivdi3() is not defined for some architectures but it is defined for some others including ARC, Xtensa etc, see https://elixir.bootlin.com/linux/latest/ident/__udivdi3 What happens __udivdi3() is implemented in libgcc in one form or another form be it pure assembly or generic implementation written in C. So maybe we need to add export of __udivdi3() for other arches, what do you think? -Alexey ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-26 20:27 ` Alexey Brodkin @ 2018-02-27 3:52 ` Jisheng Zhang 2018-02-27 10:49 ` Andy Shevchenko 0 siblings, 1 reply; 15+ messages in thread From: Jisheng Zhang @ 2018-02-27 3:52 UTC (permalink / raw) To: Alexey Brodkin Cc: andy.shevchenko, linux-kernel, dianders, linux-mmc, Vineet.Gupta1, Eugeniy.Paltsev, linux-snps-arc, stable, Evgeniy.Didin, ulf.hansson On Mon, 26 Feb 2018 20:27:22 +0000 Alexey Brodkin wrote: > Hi Andy, > > On Mon, 2018-02-26 at 20:30 +0200, Andy Shevchenko wrote: > > On Mon, Feb 26, 2018 at 7:14 PM, Evgeniy Didin > > <Evgeniy.Didin@synopsys.com> wrote: > > > On Mon, 2018-02-26 at 18:53 +0200, Andy Shevchenko wrote: > > > > On Mon, Feb 26, 2018 at 5:14 PM, Evgeniy Didin > > > > <Evgeniy.Didin@synopsys.com> wrote: > > > > > On Mon, 2018-02-26 at 16:39 +0200, Andy Shevchenko wrote: > > > > > > On Mon, Feb 26, 2018 at 4:34 PM, Evgeniy Didin > > > > > > <Evgeniy.Didin@synopsys.com> wrote: > > > > > > > In commit 4c2357f57dd5 ("mmc: dw_mmc: Fix the CTO timeout calculation") > > > > > > > have been made changes which can cause multiply overflow for 32-bit systems. > > > > > > > The value of cto_ms is lower the drto_ms, but nevertheless overflow can occur. > > > > > > > Lets cast this multiply to u64 type which prevents overflow. > > > > > > > - cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > > > > > > > + > > > > > > > + cto_ms = DIV_ROUND_UP((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); > > > > > > > > > > > > IIRC, someone commented on this or similar, i.e. > > > > > > > > > > > > DIV_ROUND_UP_ULL() ? > > > > > > > > > > Switch DIV_ROUND_UP macro to DIV_ROUND_UP_ULL is not reasonable > > > > > because overflow happens on multiply and DIV_ROUND_UP_ULL helps > > > > > with sum overflow. > > > > > > > > Did you try to compile your code for 32-bit target? > > > > > > Yes, we have compiled code for 32-bit system. > > > I am wondering why are you asking that? > > > > Because I simple didn't believe you. > > Well world around us is much more complicated than it sometimes looks like :) > > > ERROR: "__udivdi3" [drivers/mmc/host/dw_mmc.ko] undefined! > > ...scripts/Makefile.modpost:92: recipe for target '__modpost' failed > > make[2]: *** [__modpost] Error 1 > > That's right __udivdi3() is not defined for some architectures but it is defined for > some others including ARC, Xtensa etc, see > https://elixir.bootlin.com/linux/latest/ident/__udivdi3 > > What happens __udivdi3() is implemented in libgcc in one form or another form > be it pure assembly or generic implementation written in C. > > So maybe we need to add export of __udivdi3() for other arches, what do you think? Per my understanding, Linux kernel prefer to make use of do_div or implementations in <linux/math64.h> for 64bit divide Thanks ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems 2018-02-27 3:52 ` Jisheng Zhang @ 2018-02-27 10:49 ` Andy Shevchenko 0 siblings, 0 replies; 15+ messages in thread From: Andy Shevchenko @ 2018-02-27 10:49 UTC (permalink / raw) To: Jisheng Zhang Cc: Alexey Brodkin, linux-kernel, dianders, linux-mmc, Vineet.Gupta1, Eugeniy.Paltsev, linux-snps-arc, stable, Evgeniy.Didin, ulf.hansson On Tue, Feb 27, 2018 at 5:52 AM, Jisheng Zhang <Jisheng.Zhang@synaptics.com> wrote: > On Mon, 26 Feb 2018 20:27:22 +0000 Alexey Brodkin wrote: >> On Mon, 2018-02-26 at 20:30 +0200, Andy Shevchenko wrote: >> > On Mon, Feb 26, 2018 at 7:14 PM, Evgeniy Didin >> > <Evgeniy.Didin@synopsys.com> wrote: >> > > On Mon, 2018-02-26 at 18:53 +0200, Andy Shevchenko wrote: >> > > > On Mon, Feb 26, 2018 at 5:14 PM, Evgeniy Didin >> > > > > > IIRC, someone commented on this or similar, i.e. >> > > > > > DIV_ROUND_UP_ULL() ? ^^^^^^^^^^^^ >> So maybe we need to add export of __udivdi3() for other arches, what do you think? > Per my understanding, Linux kernel prefer to make use of do_div or implementations > in <linux/math64.h> for 64bit divide To everyone in this thread. See just above. That's solution which will work. Other than that, drop COMPILE_TEST from the Kconfig and put a comment that driver will not compile on architectures w/o division library. -- With Best Regards, Andy Shevchenko ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation 2018-02-26 14:34 [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation Evgeniy Didin 2018-02-26 14:34 ` [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems Evgeniy Didin 2018-02-26 14:34 ` [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO " Evgeniy Didin @ 2018-02-27 3:02 ` Jisheng Zhang 2 siblings, 0 replies; 15+ messages in thread From: Jisheng Zhang @ 2018-02-27 3:02 UTC (permalink / raw) To: Evgeniy Didin Cc: linux-mmc, Alexey Brodkin, Eugeniy Paltsev, Douglas Anderson, Ulf Hansson, linux-kernel, linux-snps-arc, stable, Vineet Gupta On Mon, 26 Feb 2018 17:34:11 +0300 Evgeniy Didin wrote: > For some 32-bit architectures calculation of DTO and STO timeout can be incorrect > due to multiply overflow. Lets prevent this by casting multiply and result to u64. > > Suggested by Jisheng Zhang. > Switch DIV_ROUND_UP macro to DIV_ROUND_UP_ULL is not reasonable > because overflow happens on multiply and DIV_ROUND_UP_ULL helps > with sum overflow. hmmm, I mean something as below: -cto_ms = DIV_ROUND_UP(MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); +cto_ms = DIV_ROUND_UP_ULL((u64)MSEC_PER_SEC * cto_clks * cto_div, host->bus_hz); This could avoid build error in arm case. > > --- > Changes since v2: > -add fix for cto_ms > > Evgeniy Didin (2): > mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit > systems > mmc: dw_mmc: Fix the CTO overflow calculation for 32-bit systems These two patches could be folded into one patch? Thanks ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2018-03-01 1:23 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-02-26 14:34 [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation Evgeniy Didin 2018-02-26 14:34 ` [PATCH 1/2 v3] mmc: dw_mmc: Fix the DTO timeout overflow calculation for 32-bit systems Evgeniy Didin 2018-02-26 14:40 ` Andy Shevchenko 2018-02-27 1:14 ` Shawn Lin 2018-03-01 1:22 ` kbuild test robot 2018-02-26 14:34 ` [PATCH 2/2 v3] mmc: dw_mmc: Fix the CTO " Evgeniy Didin 2018-02-26 14:39 ` Andy Shevchenko 2018-02-26 15:14 ` Evgeniy Didin 2018-02-26 16:53 ` Andy Shevchenko 2018-02-26 17:14 ` Evgeniy Didin 2018-02-26 18:30 ` Andy Shevchenko 2018-02-26 20:27 ` Alexey Brodkin 2018-02-27 3:52 ` Jisheng Zhang 2018-02-27 10:49 ` Andy Shevchenko 2018-02-27 3:02 ` [PATCH 0/2 v3] mmc: dw_mmc: Fix DTO/STO timeout overflow calculation Jisheng Zhang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).