diff options
| author | Donald Sharp <sharpd@nvidia.com> | 2024-10-23 13:16:29 -0400 |
|---|---|---|
| committer | Donatas Abraitis <donatas@opensourcerouting.org> | 2025-03-17 14:57:24 +0200 |
| commit | 518d3fab755d2d0c2cd07c6a67092bd738c060bd (patch) | |
| tree | 7769d7f17e13966bc9be94c84cdab605858f2f5c | |
| parent | f741b31f27eb4ccfe146ae87a8c448022249215c (diff) | |
bgpd: Do not call evpn_overlay_free no matter what
bgp_update is a very expensive call. Calling evpn_overlay_free
even when we have no evpn data to free is not trivial. Let's
limit the call into this function until we actually have data to
free.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
| -rw-r--r-- | bgpd/bgp_route.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 4a36f1a26d..39bff576eb 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -4642,10 +4642,12 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, * will not be interned. In which case, it is ok to update the * attr->evpn_overlay, so that, this can be stored in adj_in. */ - if ((afi == AFI_L2VPN) && evpn) - bgp_attr_set_evpn_overlay(attr, evpn); - else - evpn_overlay_free(evpn); + if (evpn) { + if (afi == AFI_L2VPN) + bgp_attr_set_evpn_overlay(attr, evpn); + else + evpn_overlay_free(evpn); + } bgp_adj_in_set(dest, peer, attr, addpath_id, &bgp_labels); } @@ -4821,10 +4823,12 @@ void bgp_update(struct peer *peer, const struct prefix *p, uint32_t addpath_id, * attr->evpn_overlay with evpn directly. Instead memcpy * evpn to new_atr.evpn_overlay before it is interned. */ - if (soft_reconfig && (afi == AFI_L2VPN) && evpn) - bgp_attr_set_evpn_overlay(&new_attr, evpn); - else - evpn_overlay_free(evpn); + if (soft_reconfig && evpn) { + if (afi == AFI_L2VPN) + bgp_attr_set_evpn_overlay(&new_attr, evpn); + else + evpn_overlay_free(evpn); + } /* Apply incoming route-map. * NB: new_attr may now contain newly allocated values from route-map |
