Merge pull request #16774 from donaldsharp/bgp_give_some_ordering_increases

Bgp give some ordering increases
This commit is contained in:
Russ White 2024-09-17 11:01:34 -04:00 committed by GitHub
commit da96ad08cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 32 additions and 7 deletions

View file

@ -4011,8 +4011,9 @@ static struct bgp_process_queue *bgp_processq_alloc(struct bgp *bgp)
return pqnode;
}
void bgp_process(struct bgp *bgp, struct bgp_dest *dest,
struct bgp_path_info *pi, afi_t afi, safi_t safi)
static void bgp_process_internal(struct bgp *bgp, struct bgp_dest *dest,
struct bgp_path_info *pi, afi_t afi,
safi_t safi, bool early_process)
{
#define ARBITRARY_PROCESS_QLEN 10000
struct work_queue *wq = bgp->process_queue;
@ -4075,9 +4076,8 @@ void bgp_process(struct bgp *bgp, struct bgp_dest *dest,
struct work_queue_item *item = work_queue_last_item(wq);
pqnode = item->data;
if (CHECK_FLAG(pqnode->flags, BGP_PROCESS_QUEUE_EOIU_MARKER)
|| pqnode->bgp != bgp
|| pqnode->queued >= ARBITRARY_PROCESS_QLEN)
if (CHECK_FLAG(pqnode->flags, BGP_PROCESS_QUEUE_EOIU_MARKER) ||
(pqnode->queued >= ARBITRARY_PROCESS_QLEN && !early_process))
pqnode = bgp_processq_alloc(bgp);
else
pqnode_reuse = 1;
@ -4091,7 +4091,10 @@ void bgp_process(struct bgp *bgp, struct bgp_dest *dest,
/* can't be enqueued twice */
assert(STAILQ_NEXT(dest, pq) == NULL);
STAILQ_INSERT_TAIL(&pqnode->pqueue, dest, pq);
if (early_process)
STAILQ_INSERT_HEAD(&pqnode->pqueue, dest, pq);
else
STAILQ_INSERT_TAIL(&pqnode->pqueue, dest, pq);
pqnode->queued++;
if (!pqnode_reuse)
@ -4100,6 +4103,18 @@ void bgp_process(struct bgp *bgp, struct bgp_dest *dest,
return;
}
void bgp_process(struct bgp *bgp, struct bgp_dest *dest,
struct bgp_path_info *pi, afi_t afi, safi_t safi)
{
bgp_process_internal(bgp, dest, pi, afi, safi, false);
}
void bgp_process_early(struct bgp *bgp, struct bgp_dest *dest,
struct bgp_path_info *pi, afi_t afi, safi_t safi)
{
bgp_process_internal(bgp, dest, pi, afi, safi, true);
}
void bgp_add_eoiu_mark(struct bgp *bgp)
{
struct bgp_process_queue *pqnode;

View file

@ -804,10 +804,20 @@ extern void bgp_withdraw(struct peer *peer, const struct prefix *p,
int sub_type, struct prefix_rd *prd,
mpls_label_t *label, uint8_t num_labels);
/* for bgp_nexthop and bgp_damp */
/*
* Add a route to be processed for bgp bestpath through the bgp
* workqueue. This route is added to the end of all other routes
* queued for processing
*
* bgp_process_early adds the route for processing at the beginning
* of the current queue for processing.
*/
extern void bgp_process(struct bgp *bgp, struct bgp_dest *dest,
struct bgp_path_info *pi, afi_t afi, safi_t safi);
extern void bgp_process_early(struct bgp *bgp, struct bgp_dest *dest,
struct bgp_path_info *pi, afi_t afi, safi_t safi);
/*
* Add an end-of-initial-update marker to the process queue. This is just a
* queue element with NULL bgp node.