Skip to content

Commit

Permalink
Merge pull request #16774 from donaldsharp/bgp_give_some_ordering_inc…
Browse files Browse the repository at this point in the history
…reases

Bgp give some ordering increases
  • Loading branch information
riw777 authored Sep 17, 2024
2 parents ade993b + 220b4ef commit da96ad0
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 7 deletions.
27 changes: 21 additions & 6 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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;
Expand Down
12 changes: 11 additions & 1 deletion bgpd/bgp_route.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit da96ad0

Please sign in to comment.