From patchwork Fri Sep 24 10:54:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elad Nachman X-Patchwork-Id: 99581 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id AB7B4A0548; Fri, 24 Sep 2021 12:54:21 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 963B0412F5; Fri, 24 Sep 2021 12:54:21 +0200 (CEST) Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) by mails.dpdk.org (Postfix) with ESMTP id E4B274122D for ; Fri, 24 Sep 2021 12:54:20 +0200 (CEST) Received: by mail-ed1-f43.google.com with SMTP id v10so29891652edj.10 for ; Fri, 24 Sep 2021 03:54:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id; bh=ZH5Ib/Vk8YwS90ER3uo3khduckgAmBbRp8RqWKqZsfM=; b=qJP4kejDxPBm1jZ0/xvWviV8q3RkgWRYA3lQW755aK8HtqygMiaoIgXFCnYcrHBVi+ 7LWIDJ9Pb0LeK9LZ0m9Kf6K0xR56jr9/wNOtdatk1M8izAP12V3WFN7Em6s63OWBxa6h QfNPBMLGBtp5j5tP8SsahQodCkhfGMYPLraqY4PpO7L5oJemDERyp+IQXlXTUXNgzecf Dbm1TO+RMzjsB/JVCdQT+GJhMzlawj/VXiEXBGSlZa5BIHI+5C6rBflJbK5no4XDTVLg xMlEPFsICs5kls4b4D1XGIkux6dMopz+hqr+OiTzwRMmNEaqmS7xWtUP6hFfXfNuj/Yp LXYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=ZH5Ib/Vk8YwS90ER3uo3khduckgAmBbRp8RqWKqZsfM=; b=zcC2Lo17AdQ9XWTPMxG/P2P/iROLtUNEcSx6LNyAbp5/KIM3ti6lEMm6lrkgaKJ7oz sTrSQXF8YDKZzAaINfhomcugqyLt09j/GOTXxWoyOihsXOLJWFtrq74SMKdd6eeaKH5l viNg7YRKOjYV15vlaI8G6xcmJ4ACS9N9syIv9W4Q/KFub2sloHg97glpgeh63ReRD6Vf 3Qyihg27MObAnZ3YzOjjTOSJ81tjYA1W5vLuKQxsGRyzRD/CkG3EE+Y4kXxts04V2ZfC QbmPP9h84i7SnaoKGsFfX58C7Lcn7RMU4DTWuZpjHeMaMhes8TmUfD+3+IXa7IVbGv6i fMwA== X-Gm-Message-State: AOAM533AbQ7qVYS1G4Y4CwKaK5t/J/+SJSrHb7Q0cINpKQsTIgNtYZ+/ f7BUisVebAFXI8Rl4SMwfb8= X-Google-Smtp-Source: ABdhPJyfbntWeGLYEOy0bEFxZxMJW1znZ8xKtogi/YqLVbSjLmqIZyjDv8XQbvSD88zhzbGiblamAQ== X-Received: by 2002:a17:906:7754:: with SMTP id o20mr10745146ejn.475.1632480860620; Fri, 24 Sep 2021 03:54:20 -0700 (PDT) Received: from localhost (89-139-20-144.bb.netvision.net.il. [89.139.20.144]) by smtp.gmail.com with ESMTPSA id q11sm5612630edv.80.2021.09.24.03.54.18 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 24 Sep 2021 03:54:19 -0700 (PDT) From: Elad Nachman To: ferruh.yigit@intel.com Cc: dev@dpdk.org, erclists@gmail.com, iryzhov@nfware.com, Elad Nachman Date: Fri, 24 Sep 2021 13:54:09 +0300 Message-Id: <20210924105409.21711-1-eladv6@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [dpdk-dev] [PATCH v2] kni: Fix request overwritten X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- 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 */