]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_dplane.c
Merge pull request #13444 from donaldsharp/fix_dplane_provider_counter
[mirror_frr.git] / zebra / zebra_dplane.c
index a3b61c90498fe747d423d3beec89ea0e06e90972..3653f715276b3ae40d81cdcec3a2da10f3a3fb09 100644 (file)
@@ -5736,6 +5736,21 @@ void dplane_provider_enqueue_out_ctx(struct zebra_dplane_provider *prov,
                                  memory_order_relaxed);
 }
 
+static struct zebra_dplane_ctx *
+dplane_provider_dequeue_out_ctx(struct zebra_dplane_provider *prov)
+{
+       struct zebra_dplane_ctx *ctx;
+
+       ctx = dplane_ctx_list_pop(&(prov->dp_ctx_out_list));
+       if (!ctx)
+               return NULL;
+
+       atomic_fetch_sub_explicit(&(prov->dp_out_queued), 1,
+                                 memory_order_relaxed);
+
+       return ctx;
+}
+
 /*
  * Accessor for provider object
  */
@@ -6763,7 +6778,7 @@ static void dplane_thread_loop(struct event *event)
                dplane_provider_lock(prov);
 
                while (counter < limit) {
-                       ctx = dplane_ctx_list_pop(&(prov->dp_ctx_out_list));
+                       ctx = dplane_provider_dequeue_out_ctx(prov);
                        if (ctx) {
                                dplane_ctx_list_add_tail(&work_list, ctx);
                                counter++;