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:

committed by
Florin Coras

parent
e19fef7c88
commit
803ac6389d
@ -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;
|
||||
|
Reference in New Issue
Block a user