vcl: unset fifo evt before size check 36/39536/1
authorFlorin Coras <fcoras@cisco.com>
Mon, 18 Sep 2023 16:56:21 +0000 (09:56 -0700)
committerFlorin Coras <fcoras@cisco.com>
Mon, 18 Sep 2023 17:22:35 +0000 (10:22 -0700)
For blocking sessions, if fifo event still active before size check it
could lead to vpp not generating an event because of race to check flag
in vpp and to eventually unset flag in vcl.

Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I0e350b9ff92a4e08a9249345ae224589c09d305b

src/vcl/vppcom.c

index 4b2f1f1..e929fa1 100644 (file)
@@ -2052,13 +2052,13 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n,
 
   if (svm_fifo_is_empty_cons (rx_fifo))
     {
+      if (is_ct)
+       svm_fifo_unset_event (s->rx_fifo);
+      svm_fifo_unset_event (rx_fifo);
       if (is_nonblocking)
        {
          if (vcl_session_is_closing (s))
            return vcl_session_closing_error (s);
-         if (is_ct)
-           svm_fifo_unset_event (s->rx_fifo);
-         svm_fifo_unset_event (rx_fifo);
          return VPPCOM_EWOULDBLOCK;
        }
       while (svm_fifo_is_empty_cons (rx_fifo))
@@ -2164,11 +2164,13 @@ vppcom_session_read_segments (uint32_t session_handle,
 
   if (svm_fifo_is_empty_cons (rx_fifo))
     {
+      if (is_ct)
+       svm_fifo_unset_event (s->rx_fifo);
+      svm_fifo_unset_event (rx_fifo);
       if (is_nonblocking)
        {
-         if (is_ct)
-           svm_fifo_unset_event (s->rx_fifo);
-         svm_fifo_unset_event (rx_fifo);
+         if (vcl_session_is_closing (s))
+           return vcl_session_closing_error (s);
          return VPPCOM_EWOULDBLOCK;
        }
       while (svm_fifo_is_empty_cons (rx_fifo))