]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: make incoming zserv message-processing a singleton event
authorMark Stapp <mjs@voltanet.io>
Tue, 11 Dec 2018 19:17:42 +0000 (14:17 -0500)
committerMark Stapp <mjs@voltanet.io>
Thu, 13 Dec 2018 09:56:00 +0000 (04:56 -0500)
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 <mjs@voltanet.io>
zebra/zserv.c
zebra/zserv.h

index b40e9e2af51fff8688d09ba9a7fd3bd2e5d68f0a..a48505a5141074094f6cad73aa3779dd58e49aaa 100644 (file)
@@ -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,
index f7967f54f00b18e6afa5da7b5e4db12950ad21bd..5051a252020232db91ca0562e98a5ade5ed2d27e 100644 (file)
@@ -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;