summaryrefslogtreecommitdiff
path: root/bgpd/bgp_route.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_route.c')
-rw-r--r--bgpd/bgp_route.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 71a1149d10..0c3f983f42 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -4201,12 +4201,30 @@ static wq_item_status meta_queue_process(struct work_queue *dummy, void *data)
{
struct meta_queue *mq = data;
uint32_t i;
+ uint32_t peers_on_fifo;
+ static uint32_t total_runs = 0;
+
+ total_runs++;
+
+ frr_with_mutex (&bm->peer_connection_mtx)
+ peers_on_fifo = peer_connection_fifo_count(&bm->connection_fifo);
+
+ /*
+ * If the number of peers on the fifo is greater than 10
+ * let's yield this run of the MetaQ to allow the packet processing to make
+ * progress against the incoming packets. But we should also
+ * attempt to allow this to run occassionally. Let's run
+ * something every 10 attempts to process the work queue.
+ */
+ if (peers_on_fifo > 10 && total_runs % 10 != 0)
+ return WQ_QUEUE_BLOCKED;
for (i = 0; i < MQ_SIZE; i++)
if (process_subq(mq->subq[i], i)) {
mq->size--;
break;
}
+
return mq->size ? WQ_REQUEUE : WQ_SUCCESS;
}