From: Daniel Borkmann <dborkman@redhat.com>
To: Joe Perches <joe@perches.com>
Cc: davem@davemloft.net, netdev@vger.kernel.org,
"Theodore Ts'o" <tytso@mit.edu>
Subject: Re: [PATCH net-next 1/2] net: introduce generic net_random_N helper
Date: Tue, 03 Sep 2013 14:26:43 +0200 [thread overview]
Message-ID: <5225D583.9090404@redhat.com> (raw)
In-Reply-To: <1378210546.2048.20.camel@joe-AO722>
On 09/03/2013 02:15 PM, Joe Perches wrote:
> On Tue, 2013-09-03 at 13:40 +0200, Daniel Borkmann wrote:
>> On 09/03/2013 01:00 PM, Joe Perches wrote:
>>> On Tue, 2013-09-03 at 12:26 +0200, Daniel Borkmann wrote:
>>>> We have implemented the same function over and over, so introduce a
>>>> generic helper net_random_N() that unifies these implementations.
>>>> It internally used net_random() which eventually resolves to
>>>> prandom_u32(). Explicit include of reciprocal_div.h is not necessary.
>>>
>>> Perhaps adding a generic helper to random.h like
>>> u32 prandom_u32_between(u32 low, u32 high);
>>> or
>>> u32 prandom_u32_range(u32 bound1, u32 bound2)
>>> would be better.
>>
>> Sure, this could be done as a follow-up. Once, we've migrated users to
>> the new API, follow-ups could go ahead to do the rest, and migration
>> will be easy. Note that the lower bound is 0 here.
>
> Part of the reason I suggested this it to make the
> API more readable/intelligible.
>
> At first glance, I have no idea what net_random_N does.
>
> I think #define net_random() prandom_u32()
> should be removed eventually as well.
Why? Assume there could be different PRNGs in future that have different properties
(e.g. speed vs. period, etc). Then, changing net_random() to something else is way
easier and less error-prone than searching through the whole subtree of net and
replacing every occurrence of prandom_u32().
> If gcc doesn't already do this optimization,
> perhaps there are also some use of
> net_random() % non_const
> that could be optimized a bit using this API.
I agree with you, needs to be evaluated on a case by case basis for future work.
> $ git grep -E "(prandom_u32|net_random)\s*\(\s*\)\s*\%" net
> net/batman-adv/bat_iv_ogm.c: msecs += prandom_u32() % (2 * BATADV_JITTER);
> net/batman-adv/bat_iv_ogm.c: return jiffies + msecs_to_jiffies(prandom_u32() % (BATADV_JITTER / 2));
> net/core/neighbour.c: return base ? (net_random() % base) + (base >> 1) : 0;
> net/core/neighbour.c: unsigned long sched_next = now + (net_random() % p->proxy_delay);
> net/core/pktgen.c: flow = prandom_u32() % pkt_dev->cflows;
> net/core/pktgen.c: t = prandom_u32() %
> net/core/pktgen.c: mc = prandom_u32() % pkt_dev->src_mac_count;
> net/core/pktgen.c: mc = prandom_u32() % pkt_dev->dst_mac_count;
> net/core/pktgen.c: pkt_dev->cur_udp_src = prandom_u32() %
> net/core/pktgen.c: pkt_dev->cur_udp_dst = prandom_u32() %
> net/core/pktgen.c: t = prandom_u32() % (imx - imn) + imn;
> net/core/pktgen.c: t = prandom_u32() %
> net/core/pktgen.c: t = prandom_u32() %
> net/core/stream.c: current_timeo = vm_wait = (net_random() % (HZ / 5)) + 2;
> net/ipv4/igmp.c: int tv = net_random() % max_delay;
> net/ipv4/igmp.c: int tv = net_random() % in_dev->mr_maxdelay;
> net/ipv4/igmp.c: int tv = net_random() % delay;
> net/ipv4/inet_connection_sock.c: smallest_rover = rover = net_random() % remaining + low;
> net/ipv6/addrconf.c: rand_num = net_random() % (idev->cnf.rtr_solicit_delay ? : 1);
> net/ipv6/mcast.c: unsigned long tv = net_random() % idev->mc_maxdelay;
> net/ipv6/mcast.c: unsigned long tv = net_random() % delay;
> net/ipv6/mcast.c: unsigned long tv = net_random() % delay;
> net/ipv6/mcast.c: delay = net_random() % resptime;
> net/ipv6/mcast.c: delay = net_random() % unsolicited_report_interval(ma->idev);
> net/netfilter/nf_conntrack_core.c: (prandom_u32() % net->ct.sysctl_events_retry_timeout);
> net/netfilter/nf_conntrack_core.c: (prandom_u32() % net->ct.sysctl_events_retry_timeout);
> net/sched/act_gact.c: if (!gact->tcfg_pval || net_random() % gact->tcfg_pval)
> net/sched/sch_netem.c: skb->data[net_random() % skb_headlen(skb)] ^= 1<<(net_random() % 8);
> net/sctp/socket.c: rover = net_random() % remaining + low;
> net/sunrpc/xprtsock.c: unsigned short rand = (unsigned short) net_random() % range;
> net/xfrm/xfrm_state.c: spi = low + net_random()%(high-low+1);
>
>
next prev parent reply other threads:[~2013-09-03 12:26 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-03 10:26 [PATCH net-next 0/2] net_random_N, reciprocal_divide helper updates Daniel Borkmann
2013-09-03 10:26 ` [PATCH net-next 1/2] net: introduce generic net_random_N helper Daniel Borkmann
2013-09-03 11:00 ` Joe Perches
2013-09-03 11:40 ` Daniel Borkmann
2013-09-03 12:15 ` Joe Perches
2013-09-03 12:26 ` Daniel Borkmann [this message]
2013-09-03 12:41 ` Joe Perches
2013-09-03 13:59 ` Eric Dumazet
2013-09-03 10:26 ` [PATCH net-next 2/2] net: use reciprocal_divide instead of reimplementing it Daniel Borkmann
2013-09-03 14:02 ` Eric Dumazet
2013-09-03 14:35 ` Daniel Borkmann
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=5225D583.9090404@redhat.com \
--to=dborkman@redhat.com \
--cc=davem@davemloft.net \
--cc=joe@perches.com \
--cc=netdev@vger.kernel.org \
--cc=tytso@mit.edu \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.