vcl: EPOLLOUT should be generated when epoll_ctl called with EPOLLOUT 65/28265/2
authorhanlin <[email protected]>
Thu, 26 Dec 2019 03:44:28 +0000 (11:44 +0800)
committerDave Wallace <[email protected]>
Wed, 12 Aug 2020 14:37:52 +0000 (14:37 +0000)
event

Type: fix

When we call epoll_ctl to add or mod fd with EPOLLOUT event, mostly to
check if we can write. So we expect a EPOLLOUT event should be generated
immediately unless tx queue is full.

Signed-off-by: hanlin <[email protected]>
Change-Id: Ie99986a44dbb07b6ff2fba6512171056f79e77bd
(cherry picked from commit 475c9d7bcd0f2ceca77022eaef67ad9a84365609)

src/vcl/vppcom.c

index 52639c4..6be438c 100644 (file)
@@ -2475,6 +2475,15 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
        svm_fifo_add_want_deq_ntf (session->tx_fifo,
                                   SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
 
+      /* Generate EPOLLOUT when tx_fifo/ct_tx_fifo not full */
+      if ((event->events & EPOLLOUT) &&
+         (vcl_session_write_ready (session) > 0))
+       {
+         session_event_t e = { 0 };
+         e.event_type = SESSION_IO_EVT_TX;
+         e.session_index = session->session_index;
+         vec_add1 (wrk->unhandled_evts_vector, e);
+       }
       VDBG (1, "EPOLL_CTL_ADD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",
            vep_handle, session_handle, event->events, event->data.u64);
       vcl_evt (VCL_EVT_EPOLL_CTLADD, session, event->events, event->data.u64);
@@ -2500,6 +2509,17 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
          rv = VPPCOM_EINVAL;
          goto done;
        }
+
+      /* Generate EPOLLOUT when tx_fifo/ct_tx_fifo not full */
+      if ((event->events & EPOLLOUT) &&
+         !(session->vep.ev.events & EPOLLOUT) &&
+         (vcl_session_write_ready (session) > 0))
+       {
+         session_event_t e = { 0 };
+         e.event_type = SESSION_IO_EVT_TX;
+         e.session_index = session->session_index;
+         vec_add1 (wrk->unhandled_evts_vector, e);
+       }
       session->vep.et_mask = VEP_DEFAULT_ET_MASK;
       session->vep.ev = *event;
       VDBG (1, "EPOLL_CTL_MOD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",