Fix lack of multiple KNI requests handling support by introducing a request in progress flag which will fail additional requests with EAGAIN return code if the original request has not been processed by user-space.
Bugzilla ID: 809 Signed-off-by: Elad Nachman <ela...@gmail.com> --- kernel/linux/kni/kni_net.c | 9 +++++++++ lib/kni/rte_kni.c | 2 ++ lib/kni/rte_kni_common.h | 1 + 3 files changed, 12 insertions(+) diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c index 611719b5ee..927bf9537c 100644 --- a/kernel/linux/kni/kni_net.c +++ b/kernel/linux/kni/kni_net.c @@ -110,6 +110,7 @@ kni_net_process_request(struct net_device *dev, struct rte_kni_request *req) void *resp_va; uint32_t num; int ret_val; + struct rte_kni_request *cur_req; ASSERT_RTNL(); @@ -123,7 +124,15 @@ kni_net_process_request(struct net_device *dev, struct rte_kni_request *req) mutex_lock(&kni->sync_lock); + /* Check that existing request has been processed: */ + cur_req = (struct rte_kni_request *)kni->sync_kva; + if (cur_req->req_in_progress) { + ret = -EAGAIN; + goto fail; + } + /* Construct data */ + req->req_in_progress = 1; memcpy(kni->sync_kva, req, sizeof(struct rte_kni_request)); num = kni_fifo_put(kni->req_q, &kni->sync_va, 1); if (num < 1) { diff --git a/lib/kni/rte_kni.c b/lib/kni/rte_kni.c index d3e236005e..0599e0356a 100644 --- a/lib/kni/rte_kni.c +++ b/lib/kni/rte_kni.c @@ -307,6 +307,7 @@ rte_kni_alloc(struct rte_mempool *pktmbuf_pool, kni->sync_addr = kni->m_sync_addr->addr; dev_info.sync_va = kni->m_sync_addr->addr; dev_info.sync_phys = kni->m_sync_addr->iova; + memset(kni->sync_addr, 0, sizeof(struct rte_kni_request)); kni->pktmbuf_pool = pktmbuf_pool; kni->group_id = conf->group_id; @@ -596,6 +597,7 @@ rte_kni_handle_request(struct rte_kni *kni) ret = kni_fifo_put(kni->resp_q, (void **)&req, 1); else ret = 1; + req->req_in_progress = 0; if (ret != 1) { RTE_LOG(ERR, KNI, "Fail to put the muf back to resp_q\n"); return -1; /* It is an error of can't putting the mbuf back */ diff --git a/lib/kni/rte_kni_common.h b/lib/kni/rte_kni_common.h index b547ea5501..1973e467f9 100644 --- a/lib/kni/rte_kni_common.h +++ b/lib/kni/rte_kni_common.h @@ -40,6 +40,7 @@ enum rte_kni_req_id { */ struct rte_kni_request { uint32_t req_id; /**< Request id */ + uint32_t req_in_progress; /**< Request in progress flag */ RTE_STD_C11 union { uint32_t new_mtu; /**< New MTU */ -- 2.17.1