From: George Spelvin <lkml@sdf.org>
To: linux-kernel@vger.kernel.org, lkml@sdf.org
Cc: Maciej Zenczykowski <maze@google.com>,
"David S. Miller" <davem@davemloft.net>,
Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
netdev@vger.kernel.org
Subject: [RFC PATCH v1 18/50] net/ipv6/addrconf.c: Use prandom_u32_max for rfc3315 backoff time computation
Date: Wed, 21 Aug 2019 20:30:18 -0400 [thread overview]
Message-ID: <202003281704.02SH4767016334@sdf.org> (raw)
There's no need for 64-bit intermediate values and do_div.
(Actually, the algorithm isn't changing much, except that the old
code used a scaling factor of 1 million. prandom_u32_max uses
a factor of 2^32, making the final division more efficient.)
One thing that concerns me a bit is that the data types are all
signed. The old code cast the inputs to unsigned and produced
strange overflowed results if they were negative, so presumably
that never happens in practice.
The new code works the same for positive inputs, but produces
different strange overflowed results if fed negative inputs.
Signed-off-by: George Spelvin <lkml@sdf.org>
Cc: Maciej Żenczykowski <maze@google.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: netdev@vger.kernel.org
---
net/ipv6/addrconf.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index ec3f472bc5a8f..5172f1f874363 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -103,20 +103,19 @@ static inline u32 cstamp_delta(unsigned long cstamp)
static inline s32 rfc3315_s14_backoff_init(s32 irt)
{
/* multiply 'initial retransmission time' by 0.9 .. 1.1 */
- u64 tmp = (900000 + prandom_u32() % 200001) * (u64)irt;
- do_div(tmp, 1000000);
- return (s32)tmp;
+ s32 range = irt / 5;
+ return irt - (s32)(range/2) + (s32)prandom_u32_max(range);
}
static inline s32 rfc3315_s14_backoff_update(s32 rt, s32 mrt)
{
/* multiply 'retransmission timeout' by 1.9 .. 2.1 */
- u64 tmp = (1900000 + prandom_u32() % 200001) * (u64)rt;
- do_div(tmp, 1000000);
- if ((s32)tmp > mrt) {
+ s32 range = rt / 5;
+ s32 tmp = 2*rt - (s32)(range/2) + (s32)prandom_u32_max(range);
+ if (tmp > mrt) {
/* multiply 'maximum retransmission time' by 0.9 .. 1.1 */
- tmp = (900000 + prandom_u32() % 200001) * (u64)mrt;
- do_div(tmp, 1000000);
+ range = mrt / 5;
+ tmp = mrt - (s32)(range/2) + (s32)prandom_u32_max(range);
}
return (s32)tmp;
}
--
2.26.0
next reply other threads:[~2020-03-28 17:04 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-22 0:30 George Spelvin [this message]
[not found] <202003281643.02SGhD4n009959@sdf.org>
2020-03-28 16:56 ` [RFC PATCH v1 18/50] net/ipv6/addrconf.c: Use prandom_u32_max for rfc3315 backoff time computation Maciej Żenczykowski
2020-03-28 17:37 ` George Spelvin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202003281704.02SH4767016334@sdf.org \
--to=lkml@sdf.org \
--cc=davem@davemloft.net \
--cc=kuznet@ms2.inr.ac.ru \
--cc=linux-kernel@vger.kernel.org \
--cc=maze@google.com \
--cc=netdev@vger.kernel.org \
--cc=yoshfuji@linux-ipv6.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).