summaryrefslogtreecommitdiffstats
path: root/ospfd
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2023-04-19 14:13:18 +0200
committerDonald Sharp <sharpd@nvidia.com>2023-06-26 20:59:21 +0200
commit161972c9fe108ffe3de851a537d9b34efeb09e31 (patch)
tree6de17e2202d18969ee4aae4c85ecaccdc89c4f89 /ospfd
parentMerge pull request #13804 from LabNConsulting/aceelindem/ospf6d-config-callbacks (diff)
downloadfrr-161972c9fe108ffe3de851a537d9b34efeb09e31.tar.xz
frr-161972c9fe108ffe3de851a537d9b34efeb09e31.zip
*: 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 'ospfd')
-rw-r--r--ospfd/ospf_flood.c10
-rw-r--r--ospfd/ospf_zebra.c18
-rw-r--r--ospfd/ospfd.c8
3 files changed, 18 insertions, 18 deletions
diff --git a/ospfd/ospf_flood.c b/ospfd/ospf_flood.c
index a4d0f77fa..5ae15fd88 100644
--- a/ospfd/ospf_flood.c
+++ b/ospfd/ospf_flood.c
@@ -154,11 +154,11 @@ struct external_info *ospf_external_info_check(struct ospf *ospf,
redist_on =
is_default_prefix4(&p)
? vrf_bitmap_check(
- zclient->default_information[AFI_IP],
- ospf->vrf_id)
- : (zclient->mi_redist[AFI_IP][type].enabled
- || vrf_bitmap_check(
- zclient->redist[AFI_IP][type],
+ &zclient->default_information[AFI_IP],
+ ospf->vrf_id)
+ : (zclient->mi_redist[AFI_IP][type].enabled ||
+ vrf_bitmap_check(
+ &zclient->redist[AFI_IP][type],
ospf->vrf_id));
// Pending: check for MI above.
if (redist_on) {
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index 27d74cd4f..339bb4356 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -814,16 +814,16 @@ int ospf_is_type_redistributed(struct ospf *ospf, int type,
unsigned short instance)
{
return (DEFAULT_ROUTE_TYPE(type)
- ? vrf_bitmap_check(zclient->default_information[AFI_IP],
- ospf->vrf_id)
- : ((instance
- && redist_check_instance(
+ ? vrf_bitmap_check(
+ &zclient->default_information[AFI_IP],
+ ospf->vrf_id)
+ : ((instance &&
+ redist_check_instance(
&zclient->mi_redist[AFI_IP][type],
- instance))
- || (!instance
- && vrf_bitmap_check(
- zclient->redist[AFI_IP][type],
- ospf->vrf_id))));
+ instance)) ||
+ (!instance &&
+ vrf_bitmap_check(&zclient->redist[AFI_IP][type],
+ ospf->vrf_id))));
}
int ospf_redistribute_update(struct ospf *ospf, struct ospf_redist *red,
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index 053907f20..af769a1f2 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -2284,20 +2284,20 @@ static void ospf_set_redist_vrf_bitmaps(struct ospf *ospf, bool set)
"%s: setting redist vrf %d bitmap for type %d",
__func__, ospf->vrf_id, type);
if (set)
- vrf_bitmap_set(zclient->redist[AFI_IP][type],
+ vrf_bitmap_set(&zclient->redist[AFI_IP][type],
ospf->vrf_id);
else
- vrf_bitmap_unset(zclient->redist[AFI_IP][type],
+ vrf_bitmap_unset(&zclient->redist[AFI_IP][type],
ospf->vrf_id);
}
red_list = ospf->redist[DEFAULT_ROUTE];
if (red_list) {
if (set)
- vrf_bitmap_set(zclient->default_information[AFI_IP],
+ vrf_bitmap_set(&zclient->default_information[AFI_IP],
ospf->vrf_id);
else
- vrf_bitmap_unset(zclient->default_information[AFI_IP],
+ vrf_bitmap_unset(&zclient->default_information[AFI_IP],
ospf->vrf_id);
}
}