summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@nvidia.com>2025-01-31 12:38:20 -0500
committerDonald Sharp <sharpd@nvidia.com>2025-01-31 15:05:40 -0500
commit64709ec2a9c4aa1143f64311a9dbc98468a2052c (patch)
tree1e143b2ae9e56f482b17097ba3bd74a2c41eb34c
parent07a803a7b30ad3386e491c4efe9eef7f70029d53 (diff)
zebra: Ensure dplane does not send work back to master at wrong time
When looping through the dplane providers, the worklist was being populated with items from the last provider and then the event system was checked to see if we should stop processing. If the event system says `yes` then the dplane code would stop and send the worklist to the master zebra pthread for collection. This obviously skipped the next dplane provider on the list which is double plus not good. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
-rw-r--r--zebra/zebra_dplane.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index b57c930154..9acdb4b2f8 100644
--- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c
@@ -7528,6 +7528,16 @@ static void dplane_thread_loop(struct event *event)
if (!zdplane_info.dg_run)
break;
+ /*
+ * The yield should only happen after a bit of work has been
+ * done but before we pull any new work off any provider
+ * queue to continue looping. This is a safe spot to
+ * do so.
+ */
+ if (event_should_yield(event)) {
+ reschedule = true;
+ break;
+ }
/* Locate next provider */
next_prov = dplane_prov_list_next(&zdplane_info.dg_providers,
prov);
@@ -7592,11 +7602,6 @@ static void dplane_thread_loop(struct event *event)
zlog_debug("dplane dequeues %d completed work from provider %s",
counter, dplane_provider_get_name(prov));
- if (event_should_yield(event)) {
- reschedule = true;
- break;
- }
-
/* Locate next provider */
prov = next_prov;
}