build: fix crash by disabling AVX512 with binutils 2.31
authorFerruh Yigit <ferruh.yigit@intel.com>
Thu, 2 May 2019 13:35:26 +0000 (14:35 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 2 May 2019 15:48:07 +0000 (17:48 +0200)
On Skylake platform, with native build, KNI kernel module crashes
because of the corrupted values passed to kernel module.

The corruption occurs because the userspace kni library works
unexpectedly. Compiler [1] is using AVX512 instructions and generated
binary is wrong [2].

It turned around gcc does its job correct, but gas is generating binary
wrong. And expected binutils 2.30, 2.31 & 2.31.1 are affected. Issue has
been fixed in binutils 2.32 with:
Commit x86: don't mistakenly scale non-8-bit displacements

AVX512 was already disabled with bintuils 2.30 [3], extending it to
2.31 & 2.31.1 too.

[1] gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2)

[2] gcc bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90028

[3] Bugzilla ID 97 has the details.

Bugzilla ID: 249
Cc: stable@dpdk.org
Signed-off-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
config/x86/meson.build
doc/guides/rel_notes/release_19_05.rst
mk/toolchain/gcc/rte.toolchain-compat.mk

index ca4d125..0a7bed7 100644 (file)
@@ -10,6 +10,10 @@ if not is_windows
                        message('Binutils 2.30 detected, disabling AVX512 support as workaround for bug #97')
                endif
        endif
+       if ldver.contains('2.31') and cc.has_argument('-mno-avx512f')
+               machine_args += '-mno-avx512f'
+               message('Binutils 2.31 detected, disabling AVX512 support as workaround for bug #249')
+       endif
 endif
 
 # we require SSE4.2 for DPDK
index 439725c..468e325 100644 (file)
@@ -368,6 +368,12 @@ Known Issues
    Also, make sure to start the actual text at the margin.
    =========================================================
 
+* **On x86 platforms, AVX512 support is disabled with binutils 2.31**
+
+  Because a defect in binutils 2.31 AVX512 support is disabled.
+  DPDK defect: https://bugs.dpdk.org/show_bug.cgi?id=249
+  GCC defect: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90028
+
 * **No software AES-XTS implementation.**
 
   There are currently no cryptodev software PMDs available which implement
index df71e4a..ea40a11 100644 (file)
@@ -27,7 +27,14 @@ ifneq ($(filter 2.30%,$(LD_VERSION)),)
 FORCE_DISABLE_AVX512 := y
 # print warning only once for librte_eal
 ifneq ($(filter %librte_eal,$(CURDIR)),)
-$(warning AVX512 support disabled because of ld 2.30. See Bug 97)
+$(warning AVX512 support disabled because of binutils 2.30. See Bug 97)
+endif
+endif
+ifneq ($(filter 2.31%,$(LD_VERSION)),)
+FORCE_DISABLE_AVX512 := y
+# print warning only once for librte_eal
+ifneq ($(filter %librte_eal,$(CURDIR)),)
+$(warning AVX512 support disabled because of binutils 2.31. See Bug 249)
 endif
 endif
 endif