[v2] fix mult_frac() multiple argument evaluation bug

Message ID f9f9fdbb-ec8e-4f5e-a998-2a58627a1a43@p183
State New
Headers
Series [v2] fix mult_frac() multiple argument evaluation bug |

Commit Message

Alexey Dobriyan May 20, 2023, 6:25 p.m. UTC
  mult_frac() evaluates _all_ arguments multiple times in the body.

Clarify comment while I'm at it.

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
---

 include/linux/math.h |   22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)
  

Patch

--- a/include/linux/math.h
+++ b/include/linux/math.h
@@ -118,17 +118,17 @@  __STRUCT_FRACT(s32)
 __STRUCT_FRACT(u32)
 #undef __STRUCT_FRACT
 
-/*
- * Multiplies an integer by a fraction, while avoiding unnecessary
- * overflow or loss of precision.
- */
-#define mult_frac(x, numer, denom)(			\
-{							\
-	typeof(x) quot = (x) / (denom);			\
-	typeof(x) rem  = (x) % (denom);			\
-	(quot * (numer)) + ((rem * (numer)) / (denom));	\
-}							\
-)
+/* Calculate "x * n / d" without unnecessary overflow or loss of precision. */
+#define mult_frac(x, n, d)	\
+({				\
+	typeof(x) x_ = (x);	\
+	typeof(n) n_ = (n);	\
+	typeof(d) d_ = (d);	\
+				\
+	typeof(x_) q = x_ / d_;	\
+	typeof(x_) r = x_ % d_;	\
+	q * n_ + r * n_ / d_;	\
+})
 
 #define sector_div(a, b) do_div(a, b)