lib: Call nexthop g_addr hashes together

When hashing a nexthop, shove all the nexthop g_addr data together
and pass it as one call to jhash2() to optimize a bit better.

Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
This commit is contained in:
Stephen Worley 2019-08-06 17:30:16 -04:00
parent 12ec584da8
commit a15e669ceb

View File

@ -374,16 +374,28 @@ unsigned int nexthop_level(struct nexthop *nexthop)
return rv;
}
#define GATE_SIZE 4 /* Number of uint32_t words in struct g_addr */
uint32_t nexthop_hash(const struct nexthop *nexthop)
{
uint32_t key = 0x45afe398;
uint32_t gate_src_rmap_raw[GATE_SIZE * 3] = {};
key = jhash_3words(nexthop->type, nexthop->vrf_id,
nexthop->nh_label_type, key);
/* gate and blackhole are together in a union */
key = jhash(&nexthop->gate, sizeof(nexthop->gate), key);
key = jhash(&nexthop->src, sizeof(nexthop->src), key);
key = jhash(&nexthop->rmap_src, sizeof(nexthop->rmap_src), key);
assert(((sizeof(nexthop->gate) + sizeof(nexthop->src)
+ sizeof(nexthop->rmap_src))
/ 3)
== (GATE_SIZE * sizeof(uint32_t)));
memcpy(gate_src_rmap_raw, &nexthop->gate, GATE_SIZE);
memcpy(gate_src_rmap_raw + GATE_SIZE, &nexthop->src, GATE_SIZE);
memcpy(gate_src_rmap_raw + (2 * GATE_SIZE), &nexthop->rmap_src,
GATE_SIZE);
key = jhash2(gate_src_rmap_raw, (GATE_SIZE * 3), key);
if (nexthop->nh_label) {
int labels = nexthop->nh_label->num_labels;