From patchwork Tue Jun 22 10:57:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yunjian Wang X-Patchwork-Id: 94670 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 381D0A0547; Tue, 22 Jun 2021 12:58:18 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EDD7D4003F; Tue, 22 Jun 2021 12:58:17 +0200 (CEST) Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) by mails.dpdk.org (Postfix) with ESMTP id EF9704003C; Tue, 22 Jun 2021 12:58:15 +0200 (CEST) Received: from dggemv704-chm.china.huawei.com (unknown [172.30.72.57]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4G8NXc26dQz1BQ6J; Tue, 22 Jun 2021 18:53:04 +0800 (CST) Received: from dggpemm500008.china.huawei.com (7.185.36.136) by dggemv704-chm.china.huawei.com (10.3.19.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2; Tue, 22 Jun 2021 18:58:13 +0800 Received: from localhost (10.174.243.60) by dggpemm500008.china.huawei.com (7.185.36.136) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2176.2; Tue, 22 Jun 2021 18:58:12 +0800 From: wangyunjian To: CC: , , , , Yunjian Wang , , Cheng Liu Date: Tue, 22 Jun 2021 18:57:52 +0800 Message-ID: <4aebf99afe5bae2b25f2e5445a32243ffd6f7e97.1624359204.git.wangyunjian@huawei.com> X-Mailer: git-send-email 1.9.5.msysgit.1 In-Reply-To: <4ebfe0d38b335a437edc9c58368153d005f562ce.1622460655.git.wangyunjian@huawei.com> References: <4ebfe0d38b335a437edc9c58368153d005f562ce.1622460655.git.wangyunjian@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.174.243.60] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To dggpemm500008.china.huawei.com (7.185.36.136) X-CFilter-Loop: Reflected Subject: [dpdk-dev] [PATCH v2] kni: fix wrong mbuf alloc count in kni_allocate_mbufs 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" From: Yunjian Wang In kni_allocate_mbufs(), we alloc mbuf for alloc_q as this code. allocq_free = (kni->alloc_q->read - kni->alloc_q->write - 1) \ & (MAX_MBUF_BURST_NUM - 1); The value of allocq_free maybe zero, for example : The ring size is 1024. After init, write = read = 0. Then we fill kni->alloc_q to full. At this time, write = 1023, read = 0. Then the kernel send 32 packets to userspace. At this time, write = 1023, read = 32. And then the userspace receive this 32 packets. Then fill the kni->alloc_q, (32 - 1023 - 1) & 31 = 0, fill nothing. ... Then the kernel send 32 packets to userspace. At this time, write = 1023, read = 992. And then the userspace receive this 32 packets. Then fill the kni->alloc_q, (992 - 1023 - 1) & 31 = 0, fill nothing. Then the kernel send 32 packets to userspace. The kni->alloc_q only has 31 mbufs and will drop one packet. Absolutely, this is a special scene. Normally, it will fill some mbufs everytime, but may not enough for the kernel to use. In this patch, we always keep the kni->alloc_q to full for the kernel to use. Fixes: 49da4e82cf94 ("kni: allocate no more mbuf than empty slots in queue") Cc: stable@dpdk.org Signed-off-by: Cheng Liu Signed-off-by: Yunjian Wang Acked-by: Ferruh Yigit --- v2: add fixes tag and update commit log --- lib/kni/rte_kni.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/kni/rte_kni.c b/lib/kni/rte_kni.c index 9dae6a8d7c..eb24b0d0ae 100644 --- a/lib/kni/rte_kni.c +++ b/lib/kni/rte_kni.c @@ -677,8 +677,9 @@ kni_allocate_mbufs(struct rte_kni *kni) return; } - allocq_free = (kni->alloc_q->read - kni->alloc_q->write - 1) - & (MAX_MBUF_BURST_NUM - 1); + allocq_free = kni_fifo_free_count(kni->alloc_q); + allocq_free = (allocq_free > MAX_MBUF_BURST_NUM) ? + MAX_MBUF_BURST_NUM : allocq_free; for (i = 0; i < allocq_free; i++) { pkts[i] = rte_pktmbuf_alloc(kni->pktmbuf_pool); if (unlikely(pkts[i] == NULL)) {