From 7b77c27caa8617c82df5c5af6b9ce6ae010d7f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Thu, 2 May 2019 08:03:27 +0100 Subject: [PATCH] linux_5_0: restore __kernel_fpu_{begin,restore} In 5.0er these function were removed from the public interface also zfs needs them for AVX/AES-NI support. Without this patch for example throughput on a encrypted zfs dataset drops to 200 MB/s from 1.2 GB/s. These functions were removed as their was no user within the linux kernel tree itself. --- .../kernel/export_kernel_fpu_functions.patch | 60 +++++++++++++++++++ pkgs/os-specific/linux/kernel/patches.nix | 5 ++ pkgs/top-level/all-packages.nix | 1 + 3 files changed, 66 insertions(+) create mode 100644 pkgs/os-specific/linux/kernel/export_kernel_fpu_functions.patch diff --git a/pkgs/os-specific/linux/kernel/export_kernel_fpu_functions.patch b/pkgs/os-specific/linux/kernel/export_kernel_fpu_functions.patch new file mode 100644 index 000000000000..205497aee2da --- /dev/null +++ b/pkgs/os-specific/linux/kernel/export_kernel_fpu_functions.patch @@ -0,0 +1,60 @@ +From 245e0f743d814c9ff2d1c748175e321301eb16cf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= +Date: Thu, 2 May 2019 05:28:08 +0100 +Subject: [PATCH] x86/fpu: Export __kernel_fpu_{begin,end}() + +This partially undo commit: + +12209993 x86/fpu: Don't export __kernel_fpu_{begin,end}() + +We need this symbol in zfs for AES-NI/AVX support. +--- + arch/x86/include/asm/fpu/api.h | 2 ++ + arch/x86/kernel/fpu/core.c | 6 ++++-- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/include/asm/fpu/api.h b/arch/x86/include/asm/fpu/api.h +index b56d504af6545..7d53388d266ea 100644 +--- a/arch/x86/include/asm/fpu/api.h ++++ b/arch/x86/include/asm/fpu/api.h +@@ -18,6 +18,8 @@ + * If you intend to use the FPU in softirq you need to check first with + * irq_fpu_usable() if it is possible. + */ ++extern void __kernel_fpu_begin(void); ++extern void __kernel_fpu_end(void); + extern void kernel_fpu_begin(void); + extern void kernel_fpu_end(void); + extern bool irq_fpu_usable(void); +diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c +index 2e5003fef51a9..2ea85b32421a0 100644 +--- a/arch/x86/kernel/fpu/core.c ++++ b/arch/x86/kernel/fpu/core.c +@@ -93,7 +93,7 @@ bool irq_fpu_usable(void) + } + EXPORT_SYMBOL(irq_fpu_usable); + +-static void __kernel_fpu_begin(void) ++void __kernel_fpu_begin(void) + { + struct fpu *fpu = ¤t->thread.fpu; + +@@ -111,8 +111,9 @@ static void __kernel_fpu_begin(void) + __cpu_invalidate_fpregs_state(); + } + } ++EXPORT_SYMBOL(__kernel_fpu_begin); + +-static void __kernel_fpu_end(void) ++void __kernel_fpu_end(void) + { + struct fpu *fpu = ¤t->thread.fpu; + +@@ -121,6 +122,7 @@ static void __kernel_fpu_end(void) + + kernel_fpu_enable(); + } ++EXPORT_SYMBOL(__kernel_fpu_end); + + void kernel_fpu_begin(void) + { diff --git a/pkgs/os-specific/linux/kernel/patches.nix b/pkgs/os-specific/linux/kernel/patches.nix index 4c338b37deca..e941cd4ea413 100644 --- a/pkgs/os-specific/linux/kernel/patches.nix +++ b/pkgs/os-specific/linux/kernel/patches.nix @@ -57,4 +57,9 @@ rec { sha256 = "1l8xq02rd7vakxg52xm9g4zng0ald866rpgm8kjlh88mwwyjkrwv"; }; }; + + export_kernel_fpu_functions = rec { + name = "export_kernel_fpu_functions"; + patch = ./export_kernel_fpu_functions.patch; + }; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index b86fa5c3d087..579c4bc96e0b 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -15061,6 +15061,7 @@ in kernelPatches = [ kernelPatches.bridge_stp_helper kernelPatches.modinst_arg_list_too_long + kernelPatches.export_kernel_fpu_functions ]; };