From dcf754b73574b5716ada5eb6064ab374e7b2b964 Mon Sep 17 00:00:00 2001 From: rainbow_0206 Date: Tue, 11 Sep 2018 17:21:43 +0800 Subject: Fix: fix epoll problem The same fd can be added to different epoll. Change-Id: Ib9d6a6a2f69879dea2fea8d9ae8348d2746b89d5 Signed-off-by: rainbow_0206 --- stacks/vpp/adapt/dmm_vcl_adpt.c | 1 + stacks/vpp/patch/0002-Fix-fix-epoll-problem.patch | 62 +++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 stacks/vpp/patch/0002-Fix-fix-epoll-problem.patch (limited to 'stacks/vpp') diff --git a/stacks/vpp/adapt/dmm_vcl_adpt.c b/stacks/vpp/adapt/dmm_vcl_adpt.c index 1b2b9a9..d4974e2 100644 --- a/stacks/vpp/adapt/dmm_vcl_adpt.c +++ b/stacks/vpp/adapt/dmm_vcl_adpt.c @@ -35,6 +35,7 @@ vpphs_ep_ctl_ops (int epFD, int proFD, int ctl_ops, tmpEvt.data.ptr = pdata; tmpEvt.events = events->events; + tmpEvt.events |= (EPOLLIN | EPOLLOUT); if (DMM_VCL_ADPT_DEBUG > 0) clib_warning ("DMM VCL ADPT<%d>: epfd=%d,fd=%d,ops=%d, events=%u", diff --git a/stacks/vpp/patch/0002-Fix-fix-epoll-problem.patch b/stacks/vpp/patch/0002-Fix-fix-epoll-problem.patch new file mode 100644 index 0000000..7975e27 --- /dev/null +++ b/stacks/vpp/patch/0002-Fix-fix-epoll-problem.patch @@ -0,0 +1,62 @@ +From bdb9568fe64c6bdfde17f61dac57a7f54214912c Mon Sep 17 00:00:00 2001 +From: Jiang Wenjiang +Date: Mon, 10 Sep 2018 03:01:41 +0800 +Subject: [PATCH] Fix: fix epoll problem + +The same fd can add to different epoll. +--- + src/vcl/vppcom.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c +index cab2f60..9cb52cb 100644 +--- a/src/vcl/vppcom.c ++++ b/src/vcl/vppcom.c +@@ -162,6 +162,7 @@ typedef struct + u64 options[16]; + elog_track_t elog_track; + vce_event_handler_reg_t *poll_reg; ++ u32 ep_count; //the count that add to epoll + } session_t; + + typedef struct vppcom_cfg_t_ +@@ -3430,6 +3431,7 @@ vppcom_session_write_ready (session_t * session, u32 session_index) + + if (PREDICT_FALSE (session->state & STATE_LISTEN)) + { ++ return 0; + clib_warning ("VCL<%d>: ERROR: vpp handle 0x%llx, sid %u: " + "cannot write to a listen session!", + getpid (), session->vpp_handle, session_index); +@@ -3802,6 +3804,7 @@ vppcom_epoll_ctl (uint32_t vep_idx, int op, uint32_t session_index, + session_t *vep_session; + session_t *session; + int rv; ++ int ep_cnt = 0; + + if (vep_idx == session_index) + { +@@ -3846,6 +3849,9 @@ vppcom_epoll_ctl (uint32_t vep_idx, int op, uint32_t session_index, + switch (op) + { + case EPOLL_CTL_ADD: ++ ep_cnt = __sync_add_and_fetch (&(session->ep_count), 1); ++ if (ep_cnt != 1) ++ break; + if (PREDICT_FALSE (!event)) + { + clib_warning ("VCL<%d>: ERROR: EPOLL_CTL_ADD: NULL pointer to " +@@ -3950,6 +3956,10 @@ vppcom_epoll_ctl (uint32_t vep_idx, int op, uint32_t session_index, + break; + + case EPOLL_CTL_DEL: ++ ep_cnt = __sync_sub_and_fetch (&(session->ep_count), 1); ++ if (ep_cnt != 0) ++ break; ++ + if (PREDICT_FALSE (!session->is_vep_session)) + { + clib_warning ("VCL<%d>: ERROR: sid %u EPOLL_CTL_DEL: " +-- +1.8.3.1 + -- cgit 1.2.3-korg