proxy main lock not released in certain cases and resulting in deadlock.
Type: fix
Signed-off-by: Sivaprasad Tummala <Sivaprasad.Tummala@intel.com>
Change-Id: Ib869f459b447189bb921c05fd260f3691c2ac787
max_dequeue = svm_fifo_max_dequeue_cons (s->rx_fifo);
if (PREDICT_FALSE (max_dequeue == 0))
max_dequeue = svm_fifo_max_dequeue_cons (s->rx_fifo);
if (PREDICT_FALSE (max_dequeue == 0))
+ {
+ clib_spinlock_unlock_if_init (&pm->sessions_lock);
+ return 0;
+ }
max_dequeue = clib_min (pm->rcv_buffer_size, max_dequeue);
actual_transfer = svm_fifo_peek (rx_fifo, 0 /* relative_offset */ ,
max_dequeue = clib_min (pm->rcv_buffer_size, max_dequeue);
actual_transfer = svm_fifo_peek (rx_fifo, 0 /* relative_offset */ ,
ASSERT (ps != 0);
if (ps->vpp_active_open_handle == SESSION_INVALID_HANDLE)
ASSERT (ps != 0);
if (ps->vpp_active_open_handle == SESSION_INVALID_HANDLE)
/* Force ack on active open side to update rcv wnd. Make sure it's done on
* the right thread */
/* Force ack on active open side to update rcv wnd. Make sure it's done on
* the right thread */
session_send_rpc_evt_to_thread (ps->server_rx_fifo->master_thread_index,
proxy_force_ack, arg);
session_send_rpc_evt_to_thread (ps->server_rx_fifo->master_thread_index,
proxy_force_ack, arg);
clib_spinlock_unlock_if_init (&pm->sessions_lock);
return 0;
clib_spinlock_unlock_if_init (&pm->sessions_lock);
return 0;
handle = session_handle (ao_s);
p = hash_get (pm->proxy_session_by_active_open_handle, handle);
if (!p)
handle = session_handle (ao_s);
p = hash_get (pm->proxy_session_by_active_open_handle, handle);
if (!p)
if (pool_is_free_index (pm->sessions, p[0]))
if (pool_is_free_index (pm->sessions, p[0]))
ps = pool_elt_at_index (pm->sessions, p[0]);
if (ps->vpp_server_handle == ~0)
ps = pool_elt_at_index (pm->sessions, p[0]);
if (ps->vpp_server_handle == ~0)
proxy_s = session_get_from_handle (ps->vpp_server_handle);
proxy_s = session_get_from_handle (ps->vpp_server_handle);
tc = session_get_transport (proxy_s);
tcp_send_ack ((tcp_connection_t *) tc);
tc = session_get_transport (proxy_s);
tcp_send_ack ((tcp_connection_t *) tc);
clib_spinlock_unlock_if_init (&pm->sessions_lock);
return 0;
clib_spinlock_unlock_if_init (&pm->sessions_lock);
return 0;