Subject: [PATCH 4.9 240/271] tcp_bbr: improve arithmetic division in bbr_update_bw()

From: Greg Kroah-Hartman <[email-masked]>
Date: Tue, 28 Jan 2020 15:06:29 +0100

From: Wen Yang <[email-masked]>

[ Upstream commit 5b2f1f3070b6447b76174ea8bfb7390dc6253ebd ]

do_div() does a 64-by-32 division. Use div64_long() instead of it
if the divisor is long, to avoid truncation to 32-bit.
And as a nice side effect also cleans up the function a bit.

Signed-off-by: Wen Yang <[email-masked]>
Cc: Eric Dumazet <[email-masked]>
Cc: "David S. Miller" <[email-masked]>
Cc: Alexey Kuznetsov <[email-masked]>
Cc: Hideaki YOSHIFUJI <[email-masked]>
Cc: [email-masked]
Cc: [email-masked]
Signed-off-by: Eric Dumazet <[email-masked]>
Signed-off-by: David S. Miller <[email-masked]>
Signed-off-by: Greg Kroah-Hartman <[email-masked]>
---
 net/ipv4/tcp_bbr.c |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

--- a/net/ipv4/tcp_bbr.c
+++ b/net/ipv4/tcp_bbr.c
@@ -649,8 +649,7 @@ static void bbr_update_bw(struct sock *s
 	 * bandwidth sample. Delivered is in packets and interval_us in uS and
 	 * ratio will be <<1 for most connections. So delivered is first scaled.
 	 */
-	bw = (u64)rs->delivered * BW_UNIT;
-	do_div(bw, rs->interval_us);
+	bw = div64_long((u64)rs->delivered * BW_UNIT, rs->interval_us);
 
 	/* If this sample is application-limited, it is likely to have a very
 	 * low delivered count that represents application behavior rather than