From dded2aba4ad0d7f1d123b6a8b659e7a75b1caac6 Mon Sep 17 00:00:00 2001 From: Mark Stapp Date: Tue, 11 Dec 2018 14:17:42 -0500 Subject: [PATCH] zebra: make incoming zserv message-processing a singleton event Stop creating individual, one-time events as each batch of incoming zserv/zapi messages is processed - use a singleton event so that the incoming message activity is more fair if the zebra main pthread has other events to run. Signed-off-by: Mark Stapp --- zebra/zserv.c | 15 +++++++++++++-- zebra/zserv.h | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/zebra/zserv.c b/zebra/zserv.c index b40e9e2af..a48505a51 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -492,8 +492,8 @@ static int zserv_process_messages(struct thread *thread) struct zserv *client = THREAD_ARG(thread); struct stream *msg; struct stream_fifo *cache = stream_fifo_new(); - uint32_t p2p = zebrad.packets_to_process; + bool need_resched = false; pthread_mutex_lock(&client->ibuf_mtx); { @@ -505,6 +505,12 @@ static int zserv_process_messages(struct thread *thread) } msg = NULL; + + /* Need to reschedule processing work if there are still + * packets in the fifo. + */ + if (stream_fifo_head(client->ibuf_fifo)) + need_resched = true; } pthread_mutex_unlock(&client->ibuf_mtx); @@ -516,6 +522,10 @@ static int zserv_process_messages(struct thread *thread) stream_fifo_free(cache); + /* Reschedule ourselves if necessary */ + if (need_resched) + zserv_event(client, ZSERV_PROCESS_MESSAGES); + return 0; } @@ -628,6 +638,7 @@ void zserv_close_client(struct zserv *client) thread_cancel_event(zebrad.master, client); THREAD_OFF(client->t_cleanup); + THREAD_OFF(client->t_process); /* destroy pthread */ frr_pthread_destroy(client->pthread); @@ -828,7 +839,7 @@ void zserv_event(struct zserv *client, enum zserv_event event) break; case ZSERV_PROCESS_MESSAGES: thread_add_event(zebrad.master, zserv_process_messages, client, - 0, NULL); + 0, &client->t_process); break; case ZSERV_HANDLE_CLIENT_FAIL: thread_add_event(zebrad.master, zserv_handle_client_fail, diff --git a/zebra/zserv.h b/zebra/zserv.h index f7967f54f..5051a2520 100644 --- a/zebra/zserv.h +++ b/zebra/zserv.h @@ -73,6 +73,9 @@ struct zserv { struct thread *t_read; struct thread *t_write; + /* Event for message processing, for the main pthread */ + struct thread *t_process; + /* Threads for the main pthread */ struct thread *t_cleanup; -- 2.39.2