diff options
| author | Valerian_He <1826906282@qq.com> | 2023-08-08 10:47:29 +0000 | 
|---|---|---|
| committer | Valerian_He <1826906282@qq.com> | 2023-08-08 10:48:07 +0000 | 
| commit | 98efa5bc6bac9e3917afe2fa206ec795ddf86b87 (patch) | |
| tree | bec88bbb7b364d234860c17efe23aa73776bce69 /bgpd/bgp_evpn.c | |
| parent | 49f04841131b917ac6218ecba933af36f51a7f91 (diff) | |
bgpd: bgp_path_info_extra memory optimization
Even if some of the attributes in bgp_path_info_extra are
not used, their memory is still allocated every time. It
cause a waste of memory.
This commit code deletes all unnecessary attributes and
changes the optional attributes to pointer storage. Memory
will only be allocated when they are actually used. After
optimization, extra info related memory is reduced by about
half(~400B -> ~200B).
Signed-off-by: Valerian_He <1826906282@qq.com>
Diffstat (limited to 'bgpd/bgp_evpn.c')
| -rw-r--r-- | bgpd/bgp_evpn.c | 32 | 
1 files changed, 21 insertions, 11 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index a33f59cf5b..35f2438929 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -1924,7 +1924,8 @@ static int update_evpn_route_entry(struct bgp *bgp, struct bgpevpn *vpn,  		/* Mark route as self type-2 route */  		if (flags && CHECK_FLAG(flags, ZEBRA_MACIP_TYPE_SVI_IP)) -			tmp_pi->extra->af_flags = BGP_EVPN_MACIP_TYPE_SVI_IP; +			tmp_pi->extra->evpn->af_flags = +				BGP_EVPN_MACIP_TYPE_SVI_IP;  		bgp_path_info_add(dest, tmp_pi);  	} else {  		tmp_pi = local_pi; @@ -2390,7 +2391,8 @@ void bgp_evpn_update_type2_route_entry(struct bgp *bgp, struct bgpevpn *vpn,  			attr.router_flag = 1;  	}  	memcpy(&attr.esi, &local_pi->attr->esi, sizeof(esi_t)); -	bgp_evpn_get_rmac_nexthop(vpn, &evp, &attr, local_pi->extra->af_flags); +	bgp_evpn_get_rmac_nexthop(vpn, &evp, &attr, +				  local_pi->extra->evpn->af_flags);  	vni2label(vpn->vni, &(attr.label));  	/* Add L3 VNI RTs and RMAC for non IPv6 link-local if  	 * using L3 VNI for type-2 routes also. @@ -2829,7 +2831,11 @@ bgp_create_evpn_bgp_path_info(struct bgp_path_info *parent_pi,  		       attr_new, dest);  	SET_FLAG(pi->flags, BGP_PATH_VALID);  	bgp_path_info_extra_get(pi); -	pi->extra->parent = bgp_path_info_lock(parent_pi); +	if (!pi->extra->vrfleak) +		pi->extra->vrfleak = +			XCALLOC(MTYPE_BGP_ROUTE_EXTRA_VRFLEAK, +				sizeof(struct bgp_path_info_extra_vrfleak)); +	pi->extra->vrfleak->parent = bgp_path_info_lock(parent_pi);  	bgp_dest_lock_node((struct bgp_dest *)parent_pi->net);  	if (parent_pi->extra) {  		memcpy(&pi->extra->label, &parent_pi->extra->label, @@ -2935,8 +2941,9 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,  	/* Check if route entry is already present. */  	for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) -		if (pi->extra -		    && (struct bgp_path_info *)pi->extra->parent == parent_pi) +		if (pi->extra && pi->extra->vrfleak && +		    (struct bgp_path_info *)pi->extra->vrfleak->parent == +			    parent_pi)  			break;  	if (!pi) { @@ -3031,8 +3038,9 @@ static int install_evpn_route_entry_in_vni_common(  	/* Check if route entry is already present. */  	for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) -		if (pi->extra -		    && (struct bgp_path_info *)pi->extra->parent == parent_pi) +		if (pi->extra && pi->extra->vrfleak && +		    (struct bgp_path_info *)pi->extra->vrfleak->parent == +			    parent_pi)  			break;  	if (!pi) { @@ -3127,8 +3135,9 @@ static int uninstall_evpn_route_entry_in_vni_common(  	/* Find matching route entry. */  	for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) -		if (pi->extra && -		    (struct bgp_path_info *)pi->extra->parent == parent_pi) +		if (pi->extra && pi->extra->vrfleak && +		    (struct bgp_path_info *)pi->extra->vrfleak->parent == +			    parent_pi)  			break;  	if (!pi) @@ -3305,8 +3314,9 @@ static int uninstall_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,  	/* Find matching route entry. */  	for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next) -		if (pi->extra -		    && (struct bgp_path_info *)pi->extra->parent == parent_pi) +		if (pi->extra && pi->extra->vrfleak && +		    (struct bgp_path_info *)pi->extra->vrfleak->parent == +			    parent_pi)  			break;  	if (!pi) {  | 
