summaryrefslogtreecommitdiff
path: root/lib/zclient.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2023-04-19 08:13:18 -0400
committerDonald Sharp <sharpd@nvidia.com>2023-06-26 14:59:21 -0400
commit161972c9fe108ffe3de851a537d9b34efeb09e31 (patch)
tree6de17e2202d18969ee4aae4c85ecaccdc89c4f89 /lib/zclient.c
parentdee79c33a425d264e53e0e5d0ad51b1bc13945d0 (diff)
*: Rearrange vrf_bitmap_X api to reduce memory footprint
When running all daemons with config for most of them, FRR has sharpd@janelle:~/frr$ vtysh -c "show debug hashtable" | grep "VRF BIT HASH" | wc -l 3570 3570 hashes for bitmaps associated with the vrf. This is a very large number of hashes. Let's do two things: a) Reduce the created size of the actually created hashes to 2 instead of 32. b) Delay generation of the hash *until* a set operation happens. As that no hash directly implies a unset value if/when checked. This reduces the number of hashes to 61 in my setup for normal operation. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
Diffstat (limited to 'lib/zclient.c')
-rw-r--r--lib/zclient.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/lib/zclient.c b/lib/zclient.c
index 1654c984bd..929a18a953 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -180,14 +180,14 @@ void zclient_stop(struct zclient *zclient)
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
- vrf_bitmap_free(zclient->redist[afi][i]);
+ vrf_bitmap_free(&zclient->redist[afi][i]);
zclient->redist[afi][i] = VRF_BITMAP_NULL;
}
redist_del_instance(
&zclient->mi_redist[afi][zclient->redist_default],
zclient->instance);
- vrf_bitmap_free(zclient->default_information[afi]);
+ vrf_bitmap_free(&zclient->default_information[afi]);
zclient->default_information[afi] = VRF_BITMAP_NULL;
}
}
@@ -494,7 +494,7 @@ void zclient_send_reg_requests(struct zclient *zclient, vrf_id_t vrf_id)
/* Set unwanted redistribute route. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
- vrf_bitmap_set(zclient->redist[afi][zclient->redist_default],
+ vrf_bitmap_set(&zclient->redist[afi][zclient->redist_default],
vrf_id);
/* Flush all redistribute request. */
@@ -524,15 +524,15 @@ void zclient_send_reg_requests(struct zclient *zclient, vrf_id_t vrf_id)
/* Resend all redistribute request. */
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
- if (i != zclient->redist_default
- && vrf_bitmap_check(zclient->redist[afi][i],
- vrf_id))
+ if (i != zclient->redist_default &&
+ vrf_bitmap_check(&zclient->redist[afi][i], vrf_id))
zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD,
zclient, afi, i, 0,
vrf_id);
/* If default information is needed. */
- if (vrf_bitmap_check(zclient->default_information[afi], vrf_id))
+ if (vrf_bitmap_check(&zclient->default_information[afi],
+ vrf_id))
zebra_redistribute_default_send(
ZEBRA_REDISTRIBUTE_DEFAULT_ADD, zclient, afi,
vrf_id);
@@ -561,7 +561,7 @@ void zclient_send_dereg_requests(struct zclient *zclient, vrf_id_t vrf_id)
/* Set unwanted redistribute route. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
- vrf_bitmap_unset(zclient->redist[afi][zclient->redist_default],
+ vrf_bitmap_unset(&zclient->redist[afi][zclient->redist_default],
vrf_id);
/* Flush all redistribute request. */
@@ -591,15 +591,15 @@ void zclient_send_dereg_requests(struct zclient *zclient, vrf_id_t vrf_id)
/* Flush all redistribute request. */
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
- if (i != zclient->redist_default
- && vrf_bitmap_check(zclient->redist[afi][i],
- vrf_id))
+ if (i != zclient->redist_default &&
+ vrf_bitmap_check(&zclient->redist[afi][i], vrf_id))
zebra_redistribute_send(
ZEBRA_REDISTRIBUTE_DELETE, zclient, afi,
i, 0, vrf_id);
/* If default information is needed. */
- if (vrf_bitmap_check(zclient->default_information[afi], vrf_id))
+ if (vrf_bitmap_check(&zclient->default_information[afi],
+ vrf_id))
zebra_redistribute_default_send(
ZEBRA_REDISTRIBUTE_DEFAULT_DELETE, zclient, afi,
vrf_id);
@@ -726,7 +726,7 @@ void zclient_init(struct zclient *zclient, int redist_default,
/* Clear redistribution flags. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
- zclient->redist[afi][i] = vrf_bitmap_init();
+ vrf_bitmap_init(&zclient->redist[afi][i]);
/* Set unwanted redistribute route. bgpd does not need BGP route
redistribution. */
@@ -738,7 +738,7 @@ void zclient_init(struct zclient *zclient, int redist_default,
instance);
/* Set default-information redistribute to zero. */
- zclient->default_information[afi] = vrf_bitmap_init();
+ vrf_bitmap_init(&zclient->default_information[afi]);
}
if (zclient_debug)
@@ -4208,15 +4208,15 @@ void zclient_redistribute(int command, struct zclient *zclient, afi_t afi,
} else {
if (command == ZEBRA_REDISTRIBUTE_ADD) {
- if (vrf_bitmap_check(zclient->redist[afi][type],
+ if (vrf_bitmap_check(&zclient->redist[afi][type],
vrf_id))
return;
- vrf_bitmap_set(zclient->redist[afi][type], vrf_id);
+ vrf_bitmap_set(&zclient->redist[afi][type], vrf_id);
} else {
- if (!vrf_bitmap_check(zclient->redist[afi][type],
+ if (!vrf_bitmap_check(&zclient->redist[afi][type],
vrf_id))
return;
- vrf_bitmap_unset(zclient->redist[afi][type], vrf_id);
+ vrf_bitmap_unset(&zclient->redist[afi][type], vrf_id);
}
}
@@ -4231,14 +4231,15 @@ void zclient_redistribute_default(int command, struct zclient *zclient,
{
if (command == ZEBRA_REDISTRIBUTE_DEFAULT_ADD) {
- if (vrf_bitmap_check(zclient->default_information[afi], vrf_id))
+ if (vrf_bitmap_check(&zclient->default_information[afi],
+ vrf_id))
return;
- vrf_bitmap_set(zclient->default_information[afi], vrf_id);
+ vrf_bitmap_set(&zclient->default_information[afi], vrf_id);
} else {
- if (!vrf_bitmap_check(zclient->default_information[afi],
+ if (!vrf_bitmap_check(&zclient->default_information[afi],
vrf_id))
return;
- vrf_bitmap_unset(zclient->default_information[afi], vrf_id);
+ vrf_bitmap_unset(&zclient->default_information[afi], vrf_id);
}
if (zclient->sock > 0)