vcl: epoll fix postponed evt handling

Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I3d208f8ef4638e7557929f4b2bca4d640af85baa
(cherry picked from commit 87f7600dd6)
This commit is contained in:
Florin Coras
2021-06-28 19:13:29 -07:00
committed by Florin Coras
parent e19fef7c88
commit 803ac6389d

View File

@ -2675,8 +2675,8 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
struct epoll_event *event)
{
vcl_worker_t *wrk = vcl_worker_get_current ();
int rv = VPPCOM_OK, add_evt = 0;
vcl_session_t *vep_session;
int rv = VPPCOM_OK;
vcl_session_t *s;
svm_fifo_t *txf;
@ -2761,6 +2761,7 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
e.event_type = SESSION_IO_EVT_TX;
e.session_index = s->session_index;
vec_add1 (wrk->unhandled_evts_vector, e);
add_evt = 1;
}
/* Generate EPOLLIN if rx fifo has data */
if ((event->events & EPOLLIN) && (vcl_session_read_ready (s) > 0))
@ -2769,6 +2770,19 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
e.event_type = SESSION_IO_EVT_RX;
e.session_index = s->session_index;
vec_add1 (wrk->unhandled_evts_vector, e);
s->flags &= ~VCL_SESSION_F_HAS_RX_EVT;
add_evt = 1;
}
if (!add_evt && vcl_session_is_closing (s))
{
session_event_t e = { 0 };
if (s->session_state == VCL_STATE_VPP_CLOSING)
e.event_type = SESSION_CTRL_EVT_DISCONNECTED;
else
e.event_type = SESSION_CTRL_EVT_RESET;
e.session_index = s->session_index;
e.postponed = 1;
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);
@ -2813,6 +2827,7 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
e.event_type = SESSION_IO_EVT_RX;
e.session_index = s->session_index;
vec_add1 (wrk->unhandled_evts_vector, e);
s->flags &= ~VCL_SESSION_F_HAS_RX_EVT;
}
s->vep.et_mask = VEP_DEFAULT_ET_MASK;
s->vep.ev = *event;
@ -2980,9 +2995,17 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
events[*num_ev].events |= EPOLLHUP;
break;
case SESSION_CTRL_EVT_DISCONNECTED:
disconnected_msg = (session_disconnected_msg_t *) e->data;
s = vcl_session_disconnected_handler (wrk, disconnected_msg);
if (vcl_session_is_closed (s))
if (!e->postponed)
{
disconnected_msg = (session_disconnected_msg_t *) e->data;
s = vcl_session_disconnected_handler (wrk, disconnected_msg);
}
else
{
s = vcl_session_get (wrk, e->session_index);
}
if (vcl_session_is_closed (s) ||
!(s->flags & VCL_SESSION_F_IS_VEP_SESSION))
break;
sid = s->session_index;
session_events = s->vep.ev.events;
@ -2991,9 +3014,13 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
session_evt_data = s->vep.ev.data.u64;
break;
case SESSION_CTRL_EVT_RESET:
sid = vcl_session_reset_handler (wrk, (session_reset_msg_t *) e->data);
if (!e->postponed)
sid = vcl_session_reset_handler (wrk, (session_reset_msg_t *) e->data);
else
sid = e->session_index;
s = vcl_session_get (wrk, sid);
if (vcl_session_is_closed (s))
if (vcl_session_is_closed (s) ||
!(s->flags & VCL_SESSION_F_IS_VEP_SESSION))
break;
session_events = s->vep.ev.events;
add_event = 1;