bgpd: optimize attrhash_cmp calls

Only call attrhash_cmp when necessary.

Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
This commit is contained in:
Louis Scalbert 2025-02-11 17:00:25 +01:00
parent 9f8027b8a4
commit cbf27be5d9
5 changed files with 15 additions and 19 deletions

View file

@ -2062,8 +2062,7 @@ static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,
bgp_path_info_add(dest, tmp_pi); bgp_path_info_add(dest, tmp_pi);
} else { } else {
tmp_pi = local_pi; tmp_pi = local_pi;
if (attrhash_cmp(tmp_pi->attr, attr) if (!CHECK_FLAG(tmp_pi->flags, BGP_PATH_REMOVED) && attrhash_cmp(tmp_pi->attr, attr))
&& !CHECK_FLAG(tmp_pi->flags, BGP_PATH_REMOVED))
route_change = 0; route_change = 0;
else { else {
/* /*
@ -3154,8 +3153,7 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
pi = bgp_create_evpn_bgp_path_info(parent_pi, dest, &attr); pi = bgp_create_evpn_bgp_path_info(parent_pi, dest, &attr);
new_pi = true; new_pi = true;
} else { } else {
if (attrhash_cmp(pi->attr, &attr) if (!CHECK_FLAG(pi->flags, BGP_PATH_REMOVED) && attrhash_cmp(pi->attr, &attr)) {
&& !CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) {
bgp_dest_unlock_node(dest); bgp_dest_unlock_node(dest);
return 0; return 0;
} }
@ -3278,8 +3276,8 @@ static int install_evpn_route_entry_in_vni_common(
* install_evpn_route_entry_in_vni_mac() or * install_evpn_route_entry_in_vni_mac() or
* install_evpn_route_entry_in_vni_ip() * install_evpn_route_entry_in_vni_ip()
*/ */
if (attrhash_cmp(pi->attr, parent_pi->attr) && if (!CHECK_FLAG(pi->flags, BGP_PATH_REMOVED) &&
!CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) attrhash_cmp(pi->attr, parent_pi->attr))
return 0; return 0;
/* The attribute has changed. */ /* The attribute has changed. */
/* Add (or update) attribute to hash. */ /* Add (or update) attribute to hash. */

View file

@ -212,8 +212,8 @@ static int bgp_evpn_es_route_install(struct bgp *bgp,
bgp_dest_lock_node((struct bgp_dest *)parent_pi->net); bgp_dest_lock_node((struct bgp_dest *)parent_pi->net);
bgp_path_info_add(dest, pi); bgp_path_info_add(dest, pi);
} else { } else {
if (attrhash_cmp(pi->attr, parent_pi->attr) if (!CHECK_FLAG(pi->flags, BGP_PATH_REMOVED) &&
&& !CHECK_FLAG(pi->flags, BGP_PATH_REMOVED)) { attrhash_cmp(pi->attr, parent_pi->attr)) {
bgp_dest_unlock_node(dest); bgp_dest_unlock_node(dest);
return 0; return 0;
} }
@ -421,8 +421,7 @@ int bgp_evpn_mh_route_update(struct bgp *bgp, struct bgp_evpn_es *es,
bgp_path_info_add(dest, tmp_pi); bgp_path_info_add(dest, tmp_pi);
} else { } else {
tmp_pi = local_pi; tmp_pi = local_pi;
if (attrhash_cmp(tmp_pi->attr, attr) if (!CHECK_FLAG(tmp_pi->flags, BGP_PATH_REMOVED) && attrhash_cmp(tmp_pi->attr, attr))
&& !CHECK_FLAG(tmp_pi->flags, BGP_PATH_REMOVED))
*route_changed = 0; *route_changed = 0;
else { else {
/* The attribute has changed. /* The attribute has changed.

View file

@ -1207,8 +1207,8 @@ leak_update(struct bgp *to_bgp, struct bgp_dest *bn,
return NULL; return NULL;
} }
if (attrhash_cmp(bpi->attr, new_attr) && labelssame && if (labelssame && !CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) &&
!CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) && attrhash_cmp(bpi->attr, new_attr) &&
leak_update_nexthop_valid(to_bgp, bn, new_attr, afi, safi, source_bpi, bpi, leak_update_nexthop_valid(to_bgp, bn, new_attr, afi, safi, source_bpi, bpi,
bgp_orig, p, bgp_orig, p,
debug) == !!CHECK_FLAG(bpi->flags, BGP_PATH_VALID)) { debug) == !!CHECK_FLAG(bpi->flags, BGP_PATH_VALID)) {

View file

@ -7505,9 +7505,9 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
break; break;
if (pi) { if (pi) {
if (attrhash_cmp(pi->attr, attr_new) if (!CHECK_FLAG(pi->flags, BGP_PATH_REMOVED) &&
&& !CHECK_FLAG(pi->flags, BGP_PATH_REMOVED) !CHECK_FLAG(bgp->flags, BGP_FLAG_FORCE_STATIC_PROCESS) &&
&& !CHECK_FLAG(bgp->flags, BGP_FLAG_FORCE_STATIC_PROCESS)) { attrhash_cmp(pi->attr, attr_new)) {
bgp_dest_unlock_node(dest); bgp_dest_unlock_node(dest);
bgp_attr_unintern(&attr_new); bgp_attr_unintern(&attr_new);
aspath_unintern(&attr.aspath); aspath_unintern(&attr.aspath);
@ -9759,8 +9759,8 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p,
if (bpi) { if (bpi) {
/* Ensure the (source route) type is updated. */ /* Ensure the (source route) type is updated. */
bpi->type = type; bpi->type = type;
if (attrhash_cmp(bpi->attr, new_attr) if (!CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) &&
&& !CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED)) { attrhash_cmp(bpi->attr, new_attr)) {
bgp_attr_unintern(&new_attr); bgp_attr_unintern(&new_attr);
aspath_unintern(&attr.aspath); aspath_unintern(&attr.aspath);
bgp_dest_unlock_node(bn); bgp_dest_unlock_node(bn);

View file

@ -946,8 +946,7 @@ void add_vnc_route(struct rfapi_descriptor *rfd, /* cookie, VPN UN addr, peer */
} }
} }
if (attrhash_cmp(bpi->attr, new_attr) if (!CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED) && attrhash_cmp(bpi->attr, new_attr)) {
&& !CHECK_FLAG(bpi->flags, BGP_PATH_REMOVED)) {
bgp_attr_unintern(&new_attr); bgp_attr_unintern(&new_attr);
bgp_dest_unlock_node(bn); bgp_dest_unlock_node(bn);