X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvppcom.c;h=d9012cdaed641e2e193f115d504e6d29f566baf2;hb=ff426930051664aee1638ccff23c3345b4c129e7;hp=f181f35ee27cb480c17f1d4aa1ee3c65ae461c11;hpb=f9240dc9207b677038183ca29888d4be89bb88d5;p=vpp.git diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index f181f35ee27..d9012cdaed6 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -30,7 +30,7 @@ vcl_wait_for_segment (u64 segment_handle) f64 timeout; if (segment_handle == VCL_INVALID_SEGMENT_HANDLE) - return 1; + return 0; timeout = clib_time_now (&wrk->clib_time) + wait_for_seconds; while (clib_time_now (&wrk->clib_time) < timeout) @@ -505,6 +505,10 @@ vcl_session_bound_handler (vcl_worker_t * wrk, session_bound_msg_t * mp) vcl_session_table_add_listener (wrk, mp->handle, sid); session->session_state = STATE_LISTEN; + session->vpp_evt_q = uword_to_pointer (mp->vpp_evt_q, svm_msg_q_t *); + vec_validate (wrk->vpp_event_queues, 0); + wrk->vpp_event_queues[0] = session->vpp_evt_q; + if (session->is_dgram) { svm_fifo_t *rx_fifo, *tx_fifo; @@ -607,13 +611,16 @@ vcl_session_worker_update_reply_handler (vcl_worker_t * wrk, void *data) s->session_index); return; } - s->rx_fifo = uword_to_pointer (msg->rx_fifo, svm_fifo_t *); - s->tx_fifo = uword_to_pointer (msg->tx_fifo, svm_fifo_t *); - s->rx_fifo->client_session_index = s->session_index; - s->tx_fifo->client_session_index = s->session_index; - s->rx_fifo->client_thread_index = wrk->wrk_index; - s->tx_fifo->client_thread_index = wrk->wrk_index; + if (s->rx_fifo) + { + s->rx_fifo = uword_to_pointer (msg->rx_fifo, svm_fifo_t *); + s->tx_fifo = uword_to_pointer (msg->tx_fifo, svm_fifo_t *); + s->rx_fifo->client_session_index = s->session_index; + s->tx_fifo->client_session_index = s->session_index; + s->rx_fifo->client_thread_index = wrk->wrk_index; + s->tx_fifo->client_thread_index = wrk->wrk_index; + } s->session_state = STATE_UPDATED; VDBG (0, "session %u[0x%llx] moved to worker %u", s->session_index, @@ -2601,31 +2608,34 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, if (!(session = vcl_session_get (wrk, sid))) break; session_events = session->vep.ev.events; - if (EPOLLOUT & session_events) - { - add_event = 1; - events[*num_ev].events |= EPOLLOUT; - session_evt_data = session->vep.ev.data.u64; - } + if (!(EPOLLOUT & session_events)) + break; + add_event = 1; + events[*num_ev].events |= EPOLLOUT; + session_evt_data = session->vep.ev.data.u64; break; case SESSION_CTRL_EVT_DISCONNECTED: disconnected_msg = (session_disconnected_msg_t *) e->data; session = vcl_session_disconnected_handler (wrk, disconnected_msg); if (!session) break; + session_events = session->vep.ev.events; + if (!((EPOLLHUP | EPOLLRDHUP) & session_events)) + break; add_event = 1; events[*num_ev].events |= EPOLLHUP | EPOLLRDHUP; session_evt_data = session->vep.ev.data.u64; - session_events = session->vep.ev.events; break; case SESSION_CTRL_EVT_RESET: sid = vcl_session_reset_handler (wrk, (session_reset_msg_t *) e->data); if (!(session = vcl_session_get (wrk, sid))) break; + session_events = session->vep.ev.events; + if (!((EPOLLHUP | EPOLLRDHUP) & session_events)) + break; add_event = 1; events[*num_ev].events |= EPOLLHUP | EPOLLRDHUP; session_evt_data = session->vep.ev.data.u64; - session_events = session->vep.ev.events; break; case SESSION_CTRL_EVT_REQ_WORKER_UPDATE: vcl_session_req_worker_update_handler (wrk, e->data); @@ -2710,7 +2720,7 @@ vppcom_epoll_wait_condvar (vcl_worker_t * wrk, struct epoll_event *events, double total_wait = 0, wait_slice; int rv; - wait_for_time = (wait_for_time == -1) ? (double) 10e9 : wait_for_time; + wait_for_time = (wait_for_time == -1) ? (double) 1e6 : wait_for_time; wait_slice = wrk->cut_through_registrations ? 10e-6 : wait_for_time; do