mirror of
git://git.yoctoproject.org/meta-dpdk.git
synced 2025-07-05 05:04:45 +02:00
dpdk/21.11: fix illegal instruction on non-AVX CPU
Backport a patch from main branch to fix illegal instruction issue on CPU which has no AVX instructions. Reference: https://bugs.dpdk.org/show_bug.cgi?id=1038 Signed-off-by: Yongxin Liu <yongxin.liu@windriver.com> Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
This commit is contained in:
parent
09098721b1
commit
b06ab02b69
|
@ -0,0 +1,171 @@
|
||||||
|
From aa802b10237c2f7d3b0d0498de9b2fb438f9b9a2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Bruce Richardson <bruce.richardson@intel.com>
|
||||||
|
Date: Fri, 17 Jun 2022 11:59:20 +0100
|
||||||
|
Subject: [PATCH] dma/idxd: fix AVX2 in non-datapath functions
|
||||||
|
|
||||||
|
While all systems which will use the idxd driver for hardware will
|
||||||
|
support AVX2, if the driver is present the initialization functions e.g.
|
||||||
|
to register logs, will be called on all systems - irrespective of HW
|
||||||
|
support. This can cause issues if the system running DPDK does not have
|
||||||
|
AVX2, and the compiler has included AVX instructions in the
|
||||||
|
initialization code.
|
||||||
|
|
||||||
|
To fix this, remove AVX2 instruction set from the whole build of the
|
||||||
|
driver. Instead, we add "target(avx2)" attribute to all datapath
|
||||||
|
functions, so those - and only those functions - will having AVX2
|
||||||
|
instructions in them.
|
||||||
|
|
||||||
|
Bugzilla ID: 1038
|
||||||
|
Fixes: 3d36a0a1c7de ("dma/idxd: add data path job submission")
|
||||||
|
Cc: stable@dpdk.org
|
||||||
|
|
||||||
|
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
|
||||||
|
Acked-by: Conor Walsh <conor.walsh@intel.com>
|
||||||
|
|
||||||
|
Upstream-Status: Backport [http://git.dpdk.org/dpdk/commit/?id=aa802b10237c2f7d3b0d0498de9b2fb438f9b9a2]
|
||||||
|
|
||||||
|
Signed-off-by: Yongxin Liu <yongxin.liu@windriver.com>
|
||||||
|
---
|
||||||
|
drivers/dma/idxd/idxd_common.c | 23 +++++++++++++++++++++++
|
||||||
|
drivers/dma/idxd/meson.build | 1 -
|
||||||
|
2 files changed, 23 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/dma/idxd/idxd_common.c b/drivers/dma/idxd/idxd_common.c
|
||||||
|
index ea6413cc7a..c77200a457 100644
|
||||||
|
--- a/drivers/dma/idxd/idxd_common.c
|
||||||
|
+++ b/drivers/dma/idxd/idxd_common.c
|
||||||
|
@@ -13,12 +13,23 @@
|
||||||
|
|
||||||
|
#define IDXD_PMD_NAME_STR "dmadev_idxd"
|
||||||
|
|
||||||
|
+/* systems with DSA all support AVX2 so allow our data-path functions to
|
||||||
|
+ * always use at least that instruction set
|
||||||
|
+ */
|
||||||
|
+#ifndef __AVX2__
|
||||||
|
+#define __use_avx2 __attribute__((target("avx2")))
|
||||||
|
+#else
|
||||||
|
+#define __use_avx2
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+__use_avx2
|
||||||
|
static __rte_always_inline rte_iova_t
|
||||||
|
__desc_idx_to_iova(struct idxd_dmadev *idxd, uint16_t n)
|
||||||
|
{
|
||||||
|
return idxd->desc_iova + (n * sizeof(struct idxd_hw_desc));
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
static __rte_always_inline void
|
||||||
|
__idxd_movdir64b(volatile void *dst, const struct idxd_hw_desc *src)
|
||||||
|
{
|
||||||
|
@@ -28,6 +39,7 @@ __idxd_movdir64b(volatile void *dst, const struct idxd_hw_desc *src)
|
||||||
|
: "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
static __rte_always_inline void
|
||||||
|
__submit(struct idxd_dmadev *idxd)
|
||||||
|
{
|
||||||
|
@@ -74,6 +86,7 @@ __submit(struct idxd_dmadev *idxd)
|
||||||
|
_mm256_setzero_si256());
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
static __rte_always_inline int
|
||||||
|
__idxd_write_desc(struct idxd_dmadev *idxd,
|
||||||
|
const uint32_t op_flags,
|
||||||
|
@@ -112,6 +125,7 @@ __idxd_write_desc(struct idxd_dmadev *idxd,
|
||||||
|
return job_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
int
|
||||||
|
idxd_enqueue_copy(void *dev_private, uint16_t qid __rte_unused, rte_iova_t src,
|
||||||
|
rte_iova_t dst, unsigned int length, uint64_t flags)
|
||||||
|
@@ -126,6 +140,7 @@ idxd_enqueue_copy(void *dev_private, uint16_t qid __rte_unused, rte_iova_t src,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
int
|
||||||
|
idxd_enqueue_fill(void *dev_private, uint16_t qid __rte_unused, uint64_t pattern,
|
||||||
|
rte_iova_t dst, unsigned int length, uint64_t flags)
|
||||||
|
@@ -136,6 +151,7 @@ idxd_enqueue_fill(void *dev_private, uint16_t qid __rte_unused, uint64_t pattern
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
int
|
||||||
|
idxd_submit(void *dev_private, uint16_t qid __rte_unused)
|
||||||
|
{
|
||||||
|
@@ -143,6 +159,7 @@ idxd_submit(void *dev_private, uint16_t qid __rte_unused)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
static enum rte_dma_status_code
|
||||||
|
get_comp_status(struct idxd_completion *c)
|
||||||
|
{
|
||||||
|
@@ -163,6 +180,7 @@ get_comp_status(struct idxd_completion *c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
int
|
||||||
|
idxd_vchan_status(const struct rte_dma_dev *dev, uint16_t vchan __rte_unused,
|
||||||
|
enum rte_dma_vchan_status *status)
|
||||||
|
@@ -180,6 +198,7 @@ idxd_vchan_status(const struct rte_dma_dev *dev, uint16_t vchan __rte_unused,
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
static __rte_always_inline int
|
||||||
|
batch_ok(struct idxd_dmadev *idxd, uint16_t max_ops, enum rte_dma_status_code *status)
|
||||||
|
{
|
||||||
|
@@ -224,6 +243,7 @@ batch_ok(struct idxd_dmadev *idxd, uint16_t max_ops, enum rte_dma_status_code *s
|
||||||
|
return -1; /* error case */
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
static inline uint16_t
|
||||||
|
batch_completed(struct idxd_dmadev *idxd, uint16_t max_ops, bool *has_error)
|
||||||
|
{
|
||||||
|
@@ -275,6 +295,7 @@ batch_completed(struct idxd_dmadev *idxd, uint16_t max_ops, bool *has_error)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
static uint16_t
|
||||||
|
batch_completed_status(struct idxd_dmadev *idxd, uint16_t max_ops, enum rte_dma_status_code *status)
|
||||||
|
{
|
||||||
|
@@ -366,6 +387,7 @@ batch_completed_status(struct idxd_dmadev *idxd, uint16_t max_ops, enum rte_dma_
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
uint16_t
|
||||||
|
idxd_completed(void *dev_private, uint16_t qid __rte_unused, uint16_t max_ops,
|
||||||
|
uint16_t *last_idx, bool *has_error)
|
||||||
|
@@ -383,6 +405,7 @@ idxd_completed(void *dev_private, uint16_t qid __rte_unused, uint16_t max_ops,
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+__use_avx2
|
||||||
|
uint16_t
|
||||||
|
idxd_completed_status(void *dev_private, uint16_t qid __rte_unused, uint16_t max_ops,
|
||||||
|
uint16_t *last_idx, enum rte_dma_status_code *status)
|
||||||
|
diff --git a/drivers/dma/idxd/meson.build b/drivers/dma/idxd/meson.build
|
||||||
|
index f1396be945..dcc0a297d7 100644
|
||||||
|
--- a/drivers/dma/idxd/meson.build
|
||||||
|
+++ b/drivers/dma/idxd/meson.build
|
||||||
|
@@ -5,7 +5,6 @@ build = dpdk_conf.has('RTE_ARCH_X86')
|
||||||
|
reason = 'only supported on x86'
|
||||||
|
|
||||||
|
deps += ['bus_pci']
|
||||||
|
-cflags += '-mavx2' # all platforms with idxd HW support AVX
|
||||||
|
sources = files(
|
||||||
|
'idxd_common.c',
|
||||||
|
'idxd_pci.c',
|
||||||
|
--
|
||||||
|
2.32.0
|
||||||
|
|
|
@ -2,6 +2,7 @@ include dpdk.inc
|
||||||
|
|
||||||
SRC_URI += " \
|
SRC_URI += " \
|
||||||
file://0001-meson.build-march-and-mcpu-already-passed-by-Yocto-21.11.patch \
|
file://0001-meson.build-march-and-mcpu-already-passed-by-Yocto-21.11.patch \
|
||||||
|
file://0002-dma-idxd-fix-AVX2-in-non-datapath-functions.patch \
|
||||||
"
|
"
|
||||||
|
|
||||||
STABLE = "-stable"
|
STABLE = "-stable"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user