summary |
shortlog |
log |
commit | commitdiff |
review |
tree
raw |
patch |
inline | side by side (from parent 1:
cdf73b9)
Type: fix
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I9f7dfe086bf7e11b7e0de7392f020c1052ba656a
s->vep.et_mask = VEP_DEFAULT_ET_MASK;
s->vep.lt_next = VCL_INVALID_SESSION_INDEX;
s->vep.ev = *event;
s->vep.et_mask = VEP_DEFAULT_ET_MASK;
s->vep.lt_next = VCL_INVALID_SESSION_INDEX;
s->vep.ev = *event;
+ s->vep.ev.events |= EPOLLHUP | EPOLLERR;
s->flags &= ~VCL_SESSION_F_IS_VEP;
s->flags |= VCL_SESSION_F_IS_VEP_SESSION;
vep_session->vep.next_sh = session_handle;
s->flags &= ~VCL_SESSION_F_IS_VEP;
s->flags |= VCL_SESSION_F_IS_VEP_SESSION;
vep_session->vep.next_sh = session_handle;
}
s->vep.et_mask = VEP_DEFAULT_ET_MASK;
s->vep.ev = *event;
}
s->vep.et_mask = VEP_DEFAULT_ET_MASK;
s->vep.ev = *event;
+ s->vep.ev.events |= EPOLLHUP | EPOLLERR;
VDBG (1, "EPOLL_CTL_MOD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",
vep_handle, session_handle, event->events, event->data.u64);
VDBG (1, "EPOLL_CTL_MOD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",
vep_handle, session_handle, event->events, event->data.u64);
+always_inline u8
+vcl_ep_session_needs_evt (vcl_session_t *s, u32 evt)
+{
+ /* No event if not epolled / events reset on hup or level-trigger on */
+ return ((s->vep.ev.events & evt) &&
+ s->vep.lt_next == VCL_INVALID_SESSION_INDEX);
+}
+
static inline void
vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
struct epoll_event *events, u32 * num_ev)
static inline void
vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e,
struct epoll_event *events, u32 * num_ev)
if (vcl_session_is_closed (s))
break;
vcl_fifo_rx_evt_valid_or_break (s);
if (vcl_session_is_closed (s))
break;
vcl_fifo_rx_evt_valid_or_break (s);
- session_events = s->vep.ev.events;
- if (!(EPOLLIN & s->vep.ev.events) ||
- (s->flags & VCL_SESSION_F_HAS_RX_EVT) ||
- (s->vep.lt_next != VCL_INVALID_SESSION_INDEX))
+ if (!vcl_ep_session_needs_evt (s, EPOLLIN) ||
+ (s->flags & VCL_SESSION_F_HAS_RX_EVT))
+ session_events = s->vep.ev.events;
add_event = 1;
events[*num_ev].events = EPOLLIN;
session_evt_data = s->vep.ev.data.u64;
add_event = 1;
events[*num_ev].events = EPOLLIN;
session_evt_data = s->vep.ev.data.u64;
break;
svm_fifo_reset_has_deq_ntf (vcl_session_is_ct (s) ? s->ct_tx_fifo :
s->tx_fifo);
break;
svm_fifo_reset_has_deq_ntf (vcl_session_is_ct (s) ? s->ct_tx_fifo :
s->tx_fifo);
- session_events = s->vep.ev.events;
- if (!(EPOLLOUT & session_events) ||
- (s->vep.lt_next != VCL_INVALID_SESSION_INDEX))
+ if (!vcl_ep_session_needs_evt (s, EPOLLOUT))
+ session_events = s->vep.ev.events;
add_event = 1;
events[*num_ev].events = EPOLLOUT;
session_evt_data = s->vep.ev.data.u64;
add_event = 1;
events[*num_ev].events = EPOLLOUT;
session_evt_data = s->vep.ev.data.u64;
s = vcl_session_accepted (wrk, (session_accepted_msg_t *) e->data);
else
s = vcl_session_get (wrk, e->session_index);
s = vcl_session_accepted (wrk, (session_accepted_msg_t *) e->data);
else
s = vcl_session_get (wrk, e->session_index);
+ if (!s || !vcl_ep_session_needs_evt (s, EPOLLIN))
- session_events = s->vep.ev.events;
- if (!(EPOLLIN & session_events) ||
- (s->vep.lt_next != VCL_INVALID_SESSION_INDEX))
- break;
+ session_events = s->vep.ev.events;
add_event = 1;
events[*num_ev].events = EPOLLIN;
session_evt_data = s->vep.ev.data.u64;
add_event = 1;
events[*num_ev].events = EPOLLIN;
session_evt_data = s->vep.ev.data.u64;
else
sid = e->session_index;
s = vcl_session_get (wrk, sid);
else
sid = e->session_index;
s = vcl_session_get (wrk, sid);
- if (vcl_session_is_closed (s))
- break;
- session_events = s->vep.ev.events;
- /* Generate EPOLLOUT because there's no connected event */
- if (!(EPOLLOUT & session_events))
+ if (vcl_session_is_closed (s) || !vcl_ep_session_needs_evt (s, EPOLLOUT))
break;
/* We didn't have a fifo when the event was added */
vcl_session_add_want_deq_ntf (s, SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
add_event = 1;
break;
/* We didn't have a fifo when the event was added */
vcl_session_add_want_deq_ntf (s, SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
add_event = 1;
+ session_events = s->vep.ev.events;
+ /* Generate EPOLLOUT because there's no connected event */
events[*num_ev].events = EPOLLOUT;
session_evt_data = s->vep.ev.data.u64;
if (s->session_state == VCL_STATE_DETACHED)
events[*num_ev].events = EPOLLOUT;
session_evt_data = s->vep.ev.data.u64;
if (s->session_state == VCL_STATE_DETACHED)
- events[*num_ev].events |= EPOLLHUP;
+ {
+ events[*num_ev].events |= EPOLLHUP;
+ s->vep.ev.events = 0;
+ }
break;
case SESSION_CTRL_EVT_DISCONNECTED:
if (!e->postponed)
break;
case SESSION_CTRL_EVT_DISCONNECTED:
if (!e->postponed)
s = vcl_session_get (wrk, e->session_index);
s->flags &= ~VCL_SESSION_F_PENDING_DISCONNECT;
}
s = vcl_session_get (wrk, e->session_index);
s->flags &= ~VCL_SESSION_F_PENDING_DISCONNECT;
}
- if (vcl_session_is_closed (s) ||
- !(s->flags & VCL_SESSION_F_IS_VEP_SESSION))
+ if (vcl_session_is_closed (s) || !vcl_ep_session_needs_evt (s, EPOLLHUP))
{
if (s && (s->flags & VCL_SESSION_F_PENDING_FREE))
vcl_session_free (wrk, s);
{
if (s && (s->flags & VCL_SESSION_F_PENDING_FREE))
vcl_session_free (wrk, s);
events[*num_ev].events = EPOLLHUP;
}
session_evt_data = s->vep.ev.data.u64;
events[*num_ev].events = EPOLLHUP;
}
session_evt_data = s->vep.ev.data.u64;
break;
case SESSION_CTRL_EVT_BOUND:
vcl_session_bound_handler (wrk, (session_bound_msg_t *) e->data);
break;
case SESSION_CTRL_EVT_BOUND:
vcl_session_bound_handler (wrk, (session_bound_msg_t *) e->data);
s = vcl_session_get (wrk, sid);
s->flags &= ~VCL_SESSION_F_PENDING_DISCONNECT;
}
s = vcl_session_get (wrk, sid);
s->flags &= ~VCL_SESSION_F_PENDING_DISCONNECT;
}
- if (vcl_session_is_closed (s) ||
- !(s->flags & VCL_SESSION_F_IS_VEP_SESSION))
+ if (vcl_session_is_closed (s) || !vcl_ep_session_needs_evt (s, EPOLLHUP))
{
if (s && (s->flags & VCL_SESSION_F_PENDING_FREE))
vcl_session_free (wrk, s);
{
if (s && (s->flags & VCL_SESSION_F_PENDING_FREE))
vcl_session_free (wrk, s);
events[*num_ev].events |= EPOLLIN;
}
session_evt_data = s->vep.ev.data.u64;
events[*num_ev].events |= EPOLLIN;
}
session_evt_data = s->vep.ev.data.u64;
break;
case SESSION_CTRL_EVT_UNLISTEN_REPLY:
vcl_session_unlisten_reply_handler (wrk, e->data);
break;
case SESSION_CTRL_EVT_UNLISTEN_REPLY:
vcl_session_unlisten_reply_handler (wrk, e->data);
+ ASSERT (s->flags & VCL_SESSION_F_IS_VEP_SESSION);
events[*num_ev].data.u64 = session_evt_data;
if (EPOLLONESHOT & session_events)
{
s = vcl_session_get (wrk, sid);
events[*num_ev].data.u64 = session_evt_data;
if (EPOLLONESHOT & session_events)
{
s = vcl_session_get (wrk, sid);
+ if (!(events[*num_ev].events & EPOLLHUP))
+ s->vep.ev.events = EPOLLHUP | EPOLLERR;
}
else if (!(EPOLLET & session_events))
{
}
else if (!(EPOLLET & session_events))
{
s = vcl_session_get (wrk, next);
next = s->vep.lt_next;
s = vcl_session_get (wrk, next);
next = s->vep.lt_next;
+ if (s->vep.ev.events == 0)
+ {
+ vec_add1 (to_remove, s->session_index);
+ continue;
+ }
if ((s->vep.ev.events & EPOLLIN) && (rv = vcl_session_read_ready (s)))
{
add_event = 1;
if ((s->vep.ev.events & EPOLLIN) && (rv = vcl_session_read_ready (s)))
{
add_event = 1;
add_event = 0;
evt_flags = 0;
if (EPOLLONESHOT & s->vep.ev.events)
add_event = 0;
evt_flags = 0;
if (EPOLLONESHOT & s->vep.ev.events)
+ s->vep.ev.events = EPOLLHUP | EPOLLERR;
+ if (evt_flags & EPOLLHUP)
s->vep.ev.events = 0;
if (*n_evts == maxevents)
{
s->vep.ev.events = 0;
if (*n_evts == maxevents)
{