bgpd: small optimization with UPDATE generation

After a batch of generated UPDATEs, call bgp_writes_on() once instead of
after generating each packet.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
Quentin Young 2017-11-30 17:16:37 -05:00
parent c58b0f46dd
commit 6ec98a2f37
No known key found for this signature in database
GPG Key ID: DAF48E0F57E0834F

View File

@ -306,7 +306,12 @@ int bgp_nlri_parse(struct peer *peer, struct attr *attr,
return -1; return -1;
} }
/* The next action for the peer from a write perspective */ /*
* Checks a variety of conditions to determine whether the peer needs to be
* rescheduled for packet generation again, and does so if necessary.
*
* @param peer to check for rescheduling
*/
static void bgp_write_proceed_actions(struct peer *peer) static void bgp_write_proceed_actions(struct peer *peer)
{ {
afi_t afi; afi_t afi;
@ -356,11 +361,10 @@ static void bgp_write_proceed_actions(struct peer *peer)
} }
} }
/** /*
* Enqueue onto the peer's output buffer any packets which are pending for the * Generate advertisement information (withdraws, updates, EOR) from each
* update group it is a member of. * update group a peer belongs to, encode this information into packets, and
* * enqueue the packets onto the peer's output buffer.
* XXX: Severely needs performance work.
*/ */
int bgp_generate_updgrp_packets(struct thread *thread) int bgp_generate_updgrp_packets(struct thread *thread)
{ {
@ -435,7 +439,6 @@ int bgp_generate_updgrp_packets(struct thread *thread)
peer, afi, peer, afi,
safi))) { safi))) {
bgp_packet_add(peer, s); bgp_packet_add(peer, s);
bgp_writes_on(peer);
} }
} }
} }
@ -448,11 +451,13 @@ int bgp_generate_updgrp_packets(struct thread *thread)
* and advance peer */ * and advance peer */
s = bpacket_reformat_for_peer(next_pkt, paf); s = bpacket_reformat_for_peer(next_pkt, paf);
bgp_packet_add(peer, s); bgp_packet_add(peer, s);
bgp_writes_on(peer);
bpacket_queue_advance_peer(paf); bpacket_queue_advance_peer(paf);
} }
} while (s && (++generated < wpq)); } while (s && (++generated < wpq));
if (generated)
bgp_writes_on(peer);
bgp_write_proceed_actions(peer); bgp_write_proceed_actions(peer);
return 0; return 0;