提交 8fc54f68 编写于 作者: D Daniel Borkmann 提交者: David S. Miller

net: use reciprocal_scale() helper

Replace open codings of (((u64) <x> * <y>) >> 32) with reciprocal_scale().
Signed-off-by: NDaniel Borkmann <dborkman@redhat.com>
Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 690e36e7
...@@ -3124,8 +3124,7 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, ...@@ -3124,8 +3124,7 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
} }
if (map) { if (map) {
tcpu = map->cpus[((u64) hash * map->len) >> 32]; tcpu = map->cpus[reciprocal_scale(hash, map->len)];
if (cpu_online(tcpu)) { if (cpu_online(tcpu)) {
cpu = tcpu; cpu = tcpu;
goto done; goto done;
......
...@@ -298,7 +298,7 @@ u16 __skb_tx_hash(const struct net_device *dev, struct sk_buff *skb, ...@@ -298,7 +298,7 @@ u16 __skb_tx_hash(const struct net_device *dev, struct sk_buff *skb,
qcount = dev->tc_to_txq[tc].count; qcount = dev->tc_to_txq[tc].count;
} }
return (u16) (((u64)skb_get_hash(skb) * qcount) >> 32) + qoffset; return (u16) reciprocal_scale(skb_get_hash(skb), qcount) + qoffset;
} }
EXPORT_SYMBOL(__skb_tx_hash); EXPORT_SYMBOL(__skb_tx_hash);
...@@ -371,9 +371,8 @@ static inline int get_xps_queue(struct net_device *dev, struct sk_buff *skb) ...@@ -371,9 +371,8 @@ static inline int get_xps_queue(struct net_device *dev, struct sk_buff *skb)
if (map->len == 1) if (map->len == 1)
queue_index = map->queues[0]; queue_index = map->queues[0];
else else
queue_index = map->queues[ queue_index = map->queues[reciprocal_scale(skb_get_hash(skb),
((u64)skb_get_hash(skb) * map->len) >> 32]; map->len)];
if (unlikely(queue_index >= dev->real_num_tx_queues)) if (unlikely(queue_index >= dev->real_num_tx_queues))
queue_index = -1; queue_index = -1;
} }
......
...@@ -229,7 +229,7 @@ struct sock *__inet_lookup_listener(struct net *net, ...@@ -229,7 +229,7 @@ struct sock *__inet_lookup_listener(struct net *net,
} }
} else if (score == hiscore && reuseport) { } else if (score == hiscore && reuseport) {
matches++; matches++;
if (((u64)phash * matches) >> 32 == 0) if (reciprocal_scale(phash, matches) == 0)
result = sk; result = sk;
phash = next_pseudo_random32(phash); phash = next_pseudo_random32(phash);
} }
......
...@@ -285,7 +285,7 @@ clusterip_hashfn(const struct sk_buff *skb, ...@@ -285,7 +285,7 @@ clusterip_hashfn(const struct sk_buff *skb,
} }
/* node numbers are 1..n, not 0..n */ /* node numbers are 1..n, not 0..n */
return (((u64)hashval * config->num_total_nodes) >> 32) + 1; return reciprocal_scale(hashval, config->num_total_nodes) + 1;
} }
static inline int static inline int
......
...@@ -224,7 +224,7 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum, ...@@ -224,7 +224,7 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
remaining = (high - low) + 1; remaining = (high - low) + 1;
rand = prandom_u32(); rand = prandom_u32();
first = (((u64)rand * remaining) >> 32) + low; first = reciprocal_scale(rand, remaining) + low;
/* /*
* force rand to be an odd multiple of UDP_HTABLE_SIZE * force rand to be an odd multiple of UDP_HTABLE_SIZE
*/ */
...@@ -448,7 +448,7 @@ static struct sock *udp4_lib_lookup2(struct net *net, ...@@ -448,7 +448,7 @@ static struct sock *udp4_lib_lookup2(struct net *net,
} }
} else if (score == badness && reuseport) { } else if (score == badness && reuseport) {
matches++; matches++;
if (((u64)hash * matches) >> 32 == 0) if (reciprocal_scale(hash, matches) == 0)
result = sk; result = sk;
hash = next_pseudo_random32(hash); hash = next_pseudo_random32(hash);
} }
...@@ -529,7 +529,7 @@ struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr, ...@@ -529,7 +529,7 @@ struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
} }
} else if (score == badness && reuseport) { } else if (score == badness && reuseport) {
matches++; matches++;
if (((u64)hash * matches) >> 32 == 0) if (reciprocal_scale(hash, matches) == 0)
result = sk; result = sk;
hash = next_pseudo_random32(hash); hash = next_pseudo_random32(hash);
} }
......
...@@ -198,7 +198,7 @@ struct sock *inet6_lookup_listener(struct net *net, ...@@ -198,7 +198,7 @@ struct sock *inet6_lookup_listener(struct net *net,
} }
} else if (score == hiscore && reuseport) { } else if (score == hiscore && reuseport) {
matches++; matches++;
if (((u64)phash * matches) >> 32 == 0) if (reciprocal_scale(phash, matches) == 0)
result = sk; result = sk;
phash = next_pseudo_random32(phash); phash = next_pseudo_random32(phash);
} }
......
...@@ -243,7 +243,7 @@ static struct sock *udp6_lib_lookup2(struct net *net, ...@@ -243,7 +243,7 @@ static struct sock *udp6_lib_lookup2(struct net *net,
goto exact_match; goto exact_match;
} else if (score == badness && reuseport) { } else if (score == badness && reuseport) {
matches++; matches++;
if (((u64)hash * matches) >> 32 == 0) if (reciprocal_scale(hash, matches) == 0)
result = sk; result = sk;
hash = next_pseudo_random32(hash); hash = next_pseudo_random32(hash);
} }
...@@ -323,7 +323,7 @@ struct sock *__udp6_lib_lookup(struct net *net, ...@@ -323,7 +323,7 @@ struct sock *__udp6_lib_lookup(struct net *net,
} }
} else if (score == badness && reuseport) { } else if (score == badness && reuseport) {
matches++; matches++;
if (((u64)hash * matches) >> 32 == 0) if (reciprocal_scale(hash, matches) == 0)
result = sk; result = sk;
hash = next_pseudo_random32(hash); hash = next_pseudo_random32(hash);
} }
......
...@@ -142,7 +142,7 @@ static u32 hash_conntrack_raw(const struct nf_conntrack_tuple *tuple, u16 zone) ...@@ -142,7 +142,7 @@ static u32 hash_conntrack_raw(const struct nf_conntrack_tuple *tuple, u16 zone)
static u32 __hash_bucket(u32 hash, unsigned int size) static u32 __hash_bucket(u32 hash, unsigned int size)
{ {
return ((u64)hash * size) >> 32; return reciprocal_scale(hash, size);
} }
static u32 hash_bucket(u32 hash, const struct net *net) static u32 hash_bucket(u32 hash, const struct net *net)
......
...@@ -83,7 +83,8 @@ static unsigned int nf_ct_expect_dst_hash(const struct nf_conntrack_tuple *tuple ...@@ -83,7 +83,8 @@ static unsigned int nf_ct_expect_dst_hash(const struct nf_conntrack_tuple *tuple
hash = jhash2(tuple->dst.u3.all, ARRAY_SIZE(tuple->dst.u3.all), hash = jhash2(tuple->dst.u3.all, ARRAY_SIZE(tuple->dst.u3.all),
(((tuple->dst.protonum ^ tuple->src.l3num) << 16) | (((tuple->dst.protonum ^ tuple->src.l3num) << 16) |
(__force __u16)tuple->dst.u.all) ^ nf_conntrack_hash_rnd); (__force __u16)tuple->dst.u.all) ^ nf_conntrack_hash_rnd);
return ((u64)hash * nf_ct_expect_hsize) >> 32;
return reciprocal_scale(hash, nf_ct_expect_hsize);
} }
struct nf_conntrack_expect * struct nf_conntrack_expect *
......
...@@ -126,7 +126,8 @@ hash_by_src(const struct net *net, u16 zone, ...@@ -126,7 +126,8 @@ hash_by_src(const struct net *net, u16 zone,
/* Original src, to ensure we map it consistently if poss. */ /* Original src, to ensure we map it consistently if poss. */
hash = jhash2((u32 *)&tuple->src, sizeof(tuple->src) / sizeof(u32), hash = jhash2((u32 *)&tuple->src, sizeof(tuple->src) / sizeof(u32),
tuple->dst.protonum ^ zone ^ nf_conntrack_hash_rnd); tuple->dst.protonum ^ zone ^ nf_conntrack_hash_rnd);
return ((u64)hash * net->ct.nat_htable_size) >> 32;
return reciprocal_scale(hash, net->ct.nat_htable_size);
} }
/* Is this tuple already taken? (not by us) */ /* Is this tuple already taken? (not by us) */
...@@ -274,7 +275,7 @@ find_best_ips_proto(u16 zone, struct nf_conntrack_tuple *tuple, ...@@ -274,7 +275,7 @@ find_best_ips_proto(u16 zone, struct nf_conntrack_tuple *tuple,
} }
var_ipp->all[i] = (__force __u32) var_ipp->all[i] = (__force __u32)
htonl(minip + (((u64)j * dist) >> 32)); htonl(minip + reciprocal_scale(j, dist));
if (var_ipp->all[i] != range->max_addr.all[i]) if (var_ipp->all[i] != range->max_addr.all[i])
full_range = true; full_range = true;
......
...@@ -126,7 +126,7 @@ hmark_hash(struct hmark_tuple *t, const struct xt_hmark_info *info) ...@@ -126,7 +126,7 @@ hmark_hash(struct hmark_tuple *t, const struct xt_hmark_info *info)
hash = jhash_3words(src, dst, t->uports.v32, info->hashrnd); hash = jhash_3words(src, dst, t->uports.v32, info->hashrnd);
hash = hash ^ (t->proto & info->proto_mask); hash = hash ^ (t->proto & info->proto_mask);
return (((u64)hash * info->hmodulus) >> 32) + info->hoffset; return reciprocal_scale(hash, info->hmodulus) + info->hoffset;
} }
static void static void
......
...@@ -55,7 +55,8 @@ xt_cluster_hash(const struct nf_conn *ct, ...@@ -55,7 +55,8 @@ xt_cluster_hash(const struct nf_conn *ct,
WARN_ON(1); WARN_ON(1);
break; break;
} }
return (((u64)hash * info->total_nodes) >> 32);
return reciprocal_scale(hash, info->total_nodes);
} }
static inline bool static inline bool
......
...@@ -135,7 +135,7 @@ hash_dst(const struct xt_hashlimit_htable *ht, const struct dsthash_dst *dst) ...@@ -135,7 +135,7 @@ hash_dst(const struct xt_hashlimit_htable *ht, const struct dsthash_dst *dst)
* give results between [0 and cfg.size-1] and same hash distribution, * give results between [0 and cfg.size-1] and same hash distribution,
* but using a multiply, less expensive than a divide * but using a multiply, less expensive than a divide
*/ */
return ((u64)hash * ht->cfg.size) >> 32; return reciprocal_scale(hash, ht->cfg.size);
} }
static struct dsthash_ent * static struct dsthash_ent *
......
...@@ -77,7 +77,8 @@ static unsigned int fq_codel_hash(const struct fq_codel_sched_data *q, ...@@ -77,7 +77,8 @@ static unsigned int fq_codel_hash(const struct fq_codel_sched_data *q,
hash = jhash_3words((__force u32)keys.dst, hash = jhash_3words((__force u32)keys.dst,
(__force u32)keys.src ^ keys.ip_proto, (__force u32)keys.src ^ keys.ip_proto,
(__force u32)keys.ports, q->perturbation); (__force u32)keys.ports, q->perturbation);
return ((u64)hash * q->flows_cnt) >> 32;
return reciprocal_scale(hash, q->flows_cnt);
} }
static unsigned int fq_codel_classify(struct sk_buff *skb, struct Qdisc *sch, static unsigned int fq_codel_classify(struct sk_buff *skb, struct Qdisc *sch,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册