aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet
diff options
context:
space:
mode:
Diffstat (limited to 'src/vnet')
-rw-r--r--src/vnet/session/application_local.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/src/vnet/session/application_local.c b/src/vnet/session/application_local.c
index 58d3789cfee..9de987d7c31 100644
--- a/src/vnet/session/application_local.c
+++ b/src/vnet/session/application_local.c
@@ -518,10 +518,16 @@ ct_custom_tx (void *session, transport_send_params_t * sp)
session_t *s = (session_t *) session;
if (session_has_transport (s))
return 0;
- /* As all other sessions, cut-throughs are scheduled by vpp for tx so let
- * the scheduler's custom tx logic decide when to deschedule, i.e., after
- * fifo is emptied. */
- return ct_session_tx (s);
+ /* If event enqueued towards peer, remove from scheduler and
+ * remove session tx flag, i.e., accept new tx events */
+ if (!ct_session_tx (s))
+ {
+ sp->flags = TRANSPORT_SND_F_DESCHED;
+ svm_fifo_unset_event (s->tx_fifo);
+ }
+ /* The scheduler uses packet count as a means of upper bounding the amount
+ * of work done per dispatch. So make it look like we have sent something */
+ return 1;
}
static int
@@ -632,10 +638,7 @@ ct_session_tx (session_t * s)
peer_s = session_get (peer_ct->c_s_index, peer_ct->c_thread_index);
if (peer_s->session_state >= SESSION_STATE_TRANSPORT_CLOSING)
return 0;
- session_enqueue_notify (peer_s);
- /* The scheduler uses packet count as a means of upper bounding the amount
- * of work done per dispatch. So make it look like we have sent something */
- return 1;
+ return session_enqueue_notify (peer_s);
}
static clib_error_t *