diff options
author | Donald Sharp <sharpd@nvidia.com> | 2023-04-19 14:13:18 +0200 |
---|---|---|
committer | Donald Sharp <sharpd@nvidia.com> | 2023-06-26 20:59:21 +0200 |
commit | 161972c9fe108ffe3de851a537d9b34efeb09e31 (patch) | |
tree | 6de17e2202d18969ee4aae4c85ecaccdc89c4f89 /ospfd | |
parent | Merge pull request #13804 from LabNConsulting/aceelindem/ospf6d-config-callbacks (diff) | |
download | frr-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.c | 10 | ||||
-rw-r--r-- | ospfd/ospf_zebra.c | 18 | ||||
-rw-r--r-- | ospfd/ospfd.c | 8 |
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); } } |