vcl svm: fix rx event loss
When vcl_epoll_wait_handle_mq handles rx events exceeding maxevents, VPP will not signal because cursize > 0, and the remaining rx events cannot be triggered because the eventfd event has been read. Therefore, we should dequeue all events until cursize = 0. And then handle msg up to maxevents with vcl_epoll_wait_handle_mq_event and those beyond with vcl_handle_mq_event. Type: fix Signed-off-by: hanlin <hanlin_wang@163.com> Change-Id: I8a0c87cb41c837deb8284b40f668cc3c7d9d6e56 Signed-off-by: hanlin <hanlin_wang@163.com>
This commit is contained in:
@ -2923,7 +2923,7 @@ vcl_epoll_wait_handle_mq (vcl_worker_t * wrk, svm_msg_q_t * mq,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ASSERT (maxevents > *num_ev);
|
ASSERT (maxevents > *num_ev);
|
||||||
vcl_mq_dequeue_batch (wrk, mq, maxevents - *num_ev);
|
vcl_mq_dequeue_batch (wrk, mq, ~0);
|
||||||
svm_msg_q_unlock (mq);
|
svm_msg_q_unlock (mq);
|
||||||
|
|
||||||
handle_dequeued:
|
handle_dequeued:
|
||||||
@ -2931,7 +2931,10 @@ handle_dequeued:
|
|||||||
{
|
{
|
||||||
msg = vec_elt_at_index (wrk->mq_msg_vector, i);
|
msg = vec_elt_at_index (wrk->mq_msg_vector, i);
|
||||||
e = svm_msg_q_msg_data (mq, msg);
|
e = svm_msg_q_msg_data (mq, msg);
|
||||||
vcl_epoll_wait_handle_mq_event (wrk, e, events, num_ev);
|
if (*num_ev < maxevents)
|
||||||
|
vcl_epoll_wait_handle_mq_event (wrk, e, events, num_ev);
|
||||||
|
else
|
||||||
|
vcl_handle_mq_event (wrk, e);
|
||||||
svm_msg_q_free_msg (mq, msg);
|
svm_msg_q_free_msg (mq, msg);
|
||||||
}
|
}
|
||||||
vec_reset_length (wrk->mq_msg_vector);
|
vec_reset_length (wrk->mq_msg_vector);
|
||||||
|
Reference in New Issue
Block a user