From f4d21ac280d6196d24901ad54402f2e0b4e1fd79 Mon Sep 17 00:00:00 2001 From: wu-changsheng <851744572@qq.com> Date: Fri, 15 Jan 2021 11:13:26 +0800 Subject: [PATCH] fix rte_pktmbuf_pool_create probabilistic fail Signed-off-by: wu-changsheng <851744572@qq.com> --- dpdk.spec | 7 +- fix-populate-with-small-virtual-chunks.patch | 113 +++++++++++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 fix-populate-with-small-virtual-chunks.patch diff --git a/dpdk.spec b/dpdk.spec index d6fed94..c976e55 100644 --- a/dpdk.spec +++ b/dpdk.spec @@ -1,6 +1,6 @@ Name: dpdk Version: 19.11 -Release: 7 +Release: 8 Packager: packaging@6wind.com URL: http://dpdk.org %global source_version 19.11 @@ -18,6 +18,7 @@ Patch8: CVE-2020-14376-CVE-2020-14377.patch Patch9: fix-pool-allocation.patch Patch10: CVE-2020-14374.patch Patch11: CVE-2020-14375.patch +Patch12: fix-populate-with-small-virtual-chunks.patch Summary: Data Plane Development Kit core Group: System Environment/Libraries @@ -86,6 +87,7 @@ This package contains the pdump tool for capture the dpdk network packets. %patch9 -p1 %patch10 -p1 %patch11 -p1 +%patch12 -p1 %build namer=%{kern_devel_ver} @@ -187,6 +189,9 @@ strip -g $RPM_BUILD_ROOT/lib/modules/${namer}/extra/dpdk/rte_kni.ko /usr/sbin/depmod %changelog +* Fri Jan 15 2020 wuchangsheng - 19.11-8 +-fix rte_pktmbuf_pool_create probabilistic fail + * Mon Dec 28 2020 huangliming - 19.11-7 -fix CVE-2020-14374 CVE-2020-14375 diff --git a/fix-populate-with-small-virtual-chunks.patch b/fix-populate-with-small-virtual-chunks.patch new file mode 100644 index 0000000..1c412b6 --- /dev/null +++ b/fix-populate-with-small-virtual-chunks.patch @@ -0,0 +1,113 @@ +From 43503c59adee6cae7069da23e105c24e044bf72c Mon Sep 17 00:00:00 2001 +From: Olivier Matz +Date: Fri, 17 Jan 2020 15:57:52 +0100 +Subject: mempool: fix populate with small virtual chunks + +To populate a mempool with a virtual area, the mempool code calls +rte_mempool_populate_iova() for each iova-contiguous area. It happens +(rarely) that this area is too small to store one object. In this case, +rte_mempool_populate_iova() returns an error, which is forwarded by +rte_mempool_populate_virt(). + +This case should not throw an error in rte_mempool_populate_virt(). +Instead, the area that is too small should just be ignored. + +To fix this issue, change the return value of +rte_mempool_populate_iova() to 0 when no object can be populated, +so it can be ignored by the caller. As this would be an API/ABI change, +only do this modification internally for now. + +Fixes: 354788b60cfd ("mempool: allow populating with unaligned virtual area") +Cc: stable@dpdk.org + +Signed-off-by: Olivier Matz +Tested-by: Anatoly Burakov +Tested-by: Alvin Zhang + +Conflict:NA +Reference:http://git.dpdk.org/dpdk/patch/?id=43503c59adee6cae7069da23e105c24e044bf72c +Signed-off-by:wuchangsheng +--- + lib/librte_mempool/rte_mempool.c | 30 +++++++++++++++++++++++++----- + 1 file changed, 25 insertions(+), 5 deletions(-) + +diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c +index aea5972..08906df 100644 +--- a/lib/librte_mempool/rte_mempool.c ++++ b/lib/librte_mempool/rte_mempool.c +@@ -297,8 +297,8 @@ mempool_ops_alloc_once(struct rte_mempool *mp) + * zone. Return the number of objects added, or a negative value + * on error. + */ +-int +-rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, ++static int ++__rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, + rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb, + void *opaque) + { +@@ -332,7 +332,7 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, + off = RTE_PTR_ALIGN_CEIL(vaddr, RTE_MEMPOOL_ALIGN) - vaddr; + + if (off > len) { +- ret = -EINVAL; ++ ret = 0; + goto fail; + } + +@@ -343,7 +343,7 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, + + /* not enough room to store one object */ + if (i == 0) { +- ret = -EINVAL; ++ ret = 0; + goto fail; + } + +@@ -356,6 +356,21 @@ fail: + return ret; + } + ++int ++rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, ++ rte_iova_t iova, size_t len, rte_mempool_memchunk_free_cb_t *free_cb, ++ void *opaque) ++{ ++ int ret; ++ ++ ret = __rte_mempool_populate_iova(mp, vaddr, iova, len, free_cb, ++ opaque); ++ if (ret == 0) ++ ret = -EINVAL; ++ ++ return ret; ++} ++ + static rte_iova_t + get_iova(void *addr) + { +@@ -406,8 +421,10 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, + break; + } + +- ret = rte_mempool_populate_iova(mp, addr + off, iova, ++ ret = __rte_mempool_populate_iova(mp, addr + off, iova, + phys_len, free_cb, opaque); ++ if (ret == 0) ++ continue; + if (ret < 0) + goto fail; + /* no need to call the free callback for next chunks */ +@@ -415,6 +432,9 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, + cnt += ret; + } + ++ if (cnt == 0) ++ return -EINVAL; ++ + return cnt; + + fail: +-- +cgit v1.0 + -- Gitee