diff options
author | Florin Coras <fcoras@cisco.com> | 2018-09-17 22:09:02 -0700 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2018-09-20 10:05:48 +0000 |
commit | 0e88e851e058f4fb7cc690dbbdb19216ab360d1c (patch) | |
tree | 94b6117dfd76cc7a6da2ee344f676d7765d086e3 /src/vcl/vppcom.c | |
parent | 008dbe109ce2714be69ffb6549a0c0198a07f7d0 (diff) |
session/svm: add want_tx_event flag to fifo
Have applications use explicit flag to request events from vpp when it
transmits from a full fifo.
Change-Id: I687c8f050a066bd5ce739d880eaec1f286038d95
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vcl/vppcom.c')
-rw-r--r-- | src/vcl/vppcom.c | 36 |
1 files changed, 14 insertions, 22 deletions
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index cf3a770f045..16b467f5a36 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -1511,6 +1511,7 @@ vppcom_session_write (uint32_t session_handle, void *buf, size_t n) svm_msg_q_msg_t msg; session_event_t *e; svm_msg_q_t *mq; + u8 is_ct; if (PREDICT_FALSE (!buf)) return VPPCOM_EINVAL; @@ -1519,9 +1520,6 @@ vppcom_session_write (uint32_t session_handle, void *buf, size_t n) if (PREDICT_FALSE (!s)) return VPPCOM_EBADFD; - tx_fifo = s->tx_fifo; - is_nonblocking = VCL_SESS_ATTR_TEST (s->attr, VCL_SESS_ATTR_NONBLOCK); - if (PREDICT_FALSE (s->is_vep)) { clib_warning ("VCL<%d>: ERROR: vpp handle 0x%llx, sid %u: " @@ -1531,18 +1529,20 @@ vppcom_session_write (uint32_t session_handle, void *buf, size_t n) return VPPCOM_EBADFD; } - if (!(s->session_state & STATE_OPEN)) + if (PREDICT_FALSE (!(s->session_state & STATE_OPEN))) { session_state_t state = s->session_state; rv = ((state & STATE_DISCONNECT) ? VPPCOM_ECONNRESET : VPPCOM_ENOTCONN); VDBG (1, "VCL<%d>: vpp handle 0x%llx, sid %u: session is not open! " - "state 0x%x (%s)", - getpid (), s->vpp_handle, session_handle, + "state 0x%x (%s)", getpid (), s->vpp_handle, session_handle, state, vppcom_session_state_str (state)); return rv; } - mq = vcl_session_is_ct (s) ? s->our_evt_q : wrk->app_event_queue; + tx_fifo = s->tx_fifo; + is_ct = vcl_session_is_ct (s); + is_nonblocking = VCL_SESS_ATTR_TEST (s->attr, VCL_SESS_ATTR_NONBLOCK); + mq = is_ct ? s->our_evt_q : wrk->app_event_queue; if (svm_fifo_is_full (tx_fifo)) { if (is_nonblocking) @@ -1551,15 +1551,15 @@ vppcom_session_write (uint32_t session_handle, void *buf, size_t n) } while (svm_fifo_is_full (tx_fifo)) { + svm_fifo_set_want_tx_evt (tx_fifo, 1); svm_msg_q_lock (mq); - while (svm_msg_q_is_empty (mq) && svm_msg_q_timedwait (mq, 10e-6)) - ; + svm_msg_q_wait (mq); + svm_msg_q_sub_w_lock (mq, &msg); e = svm_msg_q_msg_data (mq, &msg); svm_msg_q_unlock (mq); - if (!vcl_is_tx_evt_for_session (e, s->session_index, - s->our_evt_q != 0)) + if (!vcl_is_tx_evt_for_session (e, s->session_index, is_ct)) vcl_handle_mq_event (wrk, e); svm_msg_q_free_msg (mq, &msg); } @@ -1576,17 +1576,9 @@ vppcom_session_write (uint32_t session_handle, void *buf, size_t n) ASSERT (n_write > 0); - if (VPPCOM_DEBUG > 2) - { - if (n_write <= 0) - clib_warning ("VCL<%d>: vpp handle 0x%llx, sid %u: " - "FIFO-FULL (%p)", getpid (), s->vpp_handle, - session_handle, tx_fifo); - else - clib_warning ("VCL<%d>: vpp handle 0x%llx, sid %u: " - "wrote %d bytes tx-fifo: (%p)", getpid (), - s->vpp_handle, session_handle, n_write, tx_fifo); - } + VDBG (2, "VCL<%d>: vpp handle 0x%llx, sid %u: wrote %d bytes", getpid (), + s->vpp_handle, session_handle, n_write); + return n_write; } |