mirror of https://github.com/torvalds/linux.git
mul_u64_u64_div_u64: fix the division-by-zero behavior
The current implementation forces a compile-time 1/0 division, which generates an undefined instruction (ud2 on x86) rather than a proper runtime division-by-zero exception. Change to trigger an actual div-by-0 exception at runtime, consistent with other division operations. Use a non-1 dividend to prevent the compiler from optimizing the division into a comparison. Link: https://lkml.kernel.org/r/q246p466-1453-qon9-29so-37105116009q@onlyvoer.pbz Signed-off-by: Nicolas Pitre <npitre@baylibre.com> Cc: Biju Das <biju.das.jz@bp.renesas.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Weißschuh <linux@weissschuh.net> Cc: Uwe Kleine-König <u.kleine-koenig@baylibre.com> Cc: David Laight <david.laight.linux@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
d71b90e5ba
commit
e795000e75
|
|
@ -212,12 +212,13 @@ u64 mul_u64_u64_div_u64(u64 a, u64 b, u64 c)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* make sure c is not zero, trigger exception otherwise */
|
/* make sure c is not zero, trigger runtime exception otherwise */
|
||||||
#pragma GCC diagnostic push
|
if (unlikely(c == 0)) {
|
||||||
#pragma GCC diagnostic ignored "-Wdiv-by-zero"
|
unsigned long zero = 0;
|
||||||
if (unlikely(c == 0))
|
|
||||||
return 1/0;
|
OPTIMIZER_HIDE_VAR(zero);
|
||||||
#pragma GCC diagnostic pop
|
return ~0UL/zero;
|
||||||
|
}
|
||||||
|
|
||||||
int shift = __builtin_ctzll(c);
|
int shift = __builtin_ctzll(c);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue