From dc489d53cd3797f29fff126920b7194f707ca144 Mon Sep 17 00:00:00 2001 From: rtreffer Date: Fri, 31 Jul 2020 21:01:56 +0200 Subject: [PATCH] Backport zfs 5.8 compaitibility patch to zfs 0.8.4 Adding this patch makes zfs compile against 5.8-rc7 kernels. Upstream PR: https://github.com/openzfs/zfs/pull/10422 Modifications: - spl_kvmalloc does not exists in zfs 0.8.4 - related code was dropped. --- .../BACKPORT-Linux-5.8-compat-__vmalloc.patch | 154 ++++++++++++++++++ pkgs/os-specific/linux/zfs/default.nix | 2 +- 2 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 pkgs/os-specific/linux/zfs/BACKPORT-Linux-5.8-compat-__vmalloc.patch diff --git a/pkgs/os-specific/linux/zfs/BACKPORT-Linux-5.8-compat-__vmalloc.patch b/pkgs/os-specific/linux/zfs/BACKPORT-Linux-5.8-compat-__vmalloc.patch new file mode 100644 index 0000000000000..780ce83d84f35 --- /dev/null +++ b/pkgs/os-specific/linux/zfs/BACKPORT-Linux-5.8-compat-__vmalloc.patch @@ -0,0 +1,154 @@ +From 6cc95288ccea12ad7b67b2b5b3997dfad8e5b5c9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20Niew=C3=B6hner?= + +Date: Tue, 9 Jun 2020 01:32:02 +0200 +Subject: [PATCH] BACKPORT: Linux 5.8 compat: __vmalloc() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The `pgprot` argument has been removed from `__vmalloc` in Linux 5.8, +being `PAGE_KERNEL` always now [1]. + +Detect this during configure and define a wrapper for older kernels. + +[1] https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/mm/vmalloc.c?h=next-20200605&id=88dca4ca5a93d2c09e5bbc6a62fbfc3af83c4fca + +Reviewed-by: Brian Behlendorf +Co-authored-by: Sebastian Gottschall +Co-authored-by: Michael Niewöhner +Signed-off-by: Sebastian Gottschall +Signed-off-by: Michael Niewöhner +Closes #10422 +--- + config/kernel-kmem.m4 | 26 ++++++++++++++++++++++++++ + config/kernel.m4 | 2 ++ + include/spl/sys/kmem.h | 9 +++++++++ + module/spl/spl-kmem-cache.c | 4 ++-- + module/spl/spl-kmem.c | 9 ++++----- + 5 files changed, 43 insertions(+), 7 deletions(-) + +diff --git a/config/kernel-kmem.m4 b/config/kernel-kmem.m4 +index cc055e530..f1c0d2412 100644 +--- a/config/kernel-kmem.m4 ++++ b/config/kernel-kmem.m4 +@@ -56,3 +56,29 @@ AC_DEFUN([SPL_AC_DEBUG_KMEM_TRACKING], [ + AC_MSG_CHECKING([whether detailed kmem tracking is enabled]) + AC_MSG_RESULT([$enable_debug_kmem_tracking]) + ]) ++ ++dnl # ++dnl # 5.8 API, ++dnl # __vmalloc PAGE_KERNEL removal ++dnl # ++AC_DEFUN([ZFS_AC_KERNEL_SRC_VMALLOC_PAGE_KERNEL], [ ++ ZFS_LINUX_TEST_SRC([__vmalloc], [ ++ #include ++ #include ++ ],[ ++ void *p __attribute__ ((unused)); ++ ++ p = __vmalloc(0, GFP_KERNEL, PAGE_KERNEL); ++ ]) ++]) ++ ++AC_DEFUN([ZFS_AC_KERNEL_VMALLOC_PAGE_KERNEL], [ ++ AC_MSG_CHECKING([whether __vmalloc(ptr, flags, pageflags) is available]) ++ ZFS_LINUX_TEST_RESULT([__vmalloc], [ ++ AC_MSG_RESULT(yes) ++ AC_DEFINE(HAVE_VMALLOC_PAGE_KERNEL, 1, [__vmalloc page flags exists]) ++ ],[ ++ AC_MSG_RESULT(no) ++ ]) ++]) ++- +diff --git a/config/kernel.m4 b/config/kernel.m4 +index b67fcef8c..23edfdcd8 100644 +--- a/config/kernel.m4 ++++ b/config/kernel.m4 +@@ -45,6 +45,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ + ZFS_AC_KERNEL_SRC_SCHED + ZFS_AC_KERNEL_SRC_USLEEP_RANGE + ZFS_AC_KERNEL_SRC_KMEM_CACHE ++ ZFS_AC_KERNEL_SRC_VMALLOC_PAGE_KERNEL + ZFS_AC_KERNEL_SRC_WAIT + ZFS_AC_KERNEL_SRC_INODE_TIMES + ZFS_AC_KERNEL_SRC_INODE_LOCK +@@ -163,6 +164,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ + ZFS_AC_KERNEL_SCHED + ZFS_AC_KERNEL_USLEEP_RANGE + ZFS_AC_KERNEL_KMEM_CACHE ++ ZFS_AC_KERNEL_VMALLOC_PAGE_KERNEL + ZFS_AC_KERNEL_WAIT + ZFS_AC_KERNEL_INODE_TIMES + ZFS_AC_KERNEL_INODE_LOCK +diff --git a/include/spl/sys/kmem.h b/include/spl/sys/kmem.h +index 72d3a7765..ca15bfe7f 100644 +--- a/include/spl/sys/kmem.h ++++ b/include/spl/sys/kmem.h +@@ -169,6 +169,15 @@ extern void *spl_kmem_alloc(size_t sz, int fl, const char *func, int line); + extern void *spl_kmem_zalloc(size_t sz, int fl, const char *func, int line); + extern void spl_kmem_free(const void *ptr, size_t sz); + ++/* ++ * 5.8 API change, pgprot_t argument removed. ++ */ ++#ifdef HAVE_VMALLOC_PAGE_KERNEL ++#define spl_vmalloc(size, flags) __vmalloc(size, flags, PAGE_KERNEL) ++#else ++#define spl_vmalloc(size, flags) __vmalloc(size, flags) ++#endif ++ + /* + * The following functions are only available for internal use. + */ +diff --git a/module/spl/spl-kmem-cache.c b/module/spl/spl-kmem-cache.c +index d71b4b348..4866b2993 100644 +--- a/module/spl/spl-kmem-cache.c ++++ b/module/spl/spl-kmem-cache.c +@@ -203,7 +203,7 @@ kv_alloc(spl_kmem_cache_t *skc, int size, int flags) + ASSERT(ISP2(size)); + ptr = (void *)__get_free_pages(lflags, get_order(size)); + } else { +- ptr = __vmalloc(size, lflags | __GFP_HIGHMEM, PAGE_KERNEL); ++ ptr = spl_vmalloc(size, lflags | __GFP_HIGHMEM); + } + + /* Resulting allocated memory will be page aligned */ +@@ -1242,7 +1242,7 @@ spl_cache_grow(spl_kmem_cache_t *skc, int flags, void **obj) + * allocation. + * + * However, this can't be applied to KVM_VMEM due to a bug that +- * __vmalloc() doesn't honor gfp flags in page table allocation. ++ * spl_vmalloc() doesn't honor gfp flags in page table allocation. + */ + if (!(skc->skc_flags & KMC_VMEM)) { + rc = __spl_cache_grow(skc, flags | KM_NOSLEEP); +diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c +index cee69ad43..ca1fc145f 100644 +--- a/module/spl/spl-kmem.c ++++ b/module/spl/spl-kmem.c +@@ -172,16 +172,15 @@ spl_kmem_alloc_impl(size_t size, int flags, int node) + * kmem_zalloc() callers. + * + * For vmem_alloc() and vmem_zalloc() callers it is permissible +- * to use __vmalloc(). However, in general use of __vmalloc() +- * is strongly discouraged because a global lock must be +- * acquired. Contention on this lock can significantly ++ * to use spl_vmalloc(). However, in general use of ++ * spl_vmalloc() is strongly discouraged because a global lock ++ * must be acquired. Contention on this lock can significantly + * impact performance so frequently manipulating the virtual + * address space is strongly discouraged. + */ + if ((size > spl_kmem_alloc_max) || use_vmem) { + if (flags & KM_VMEM) { +- ptr = __vmalloc(size, lflags | __GFP_HIGHMEM, +- PAGE_KERNEL); ++ ptr = spl_vmalloc(size, lflags | __GFP_HIGHMEM); + } else { + return (NULL); + } +-- +2.25.1 + diff --git a/pkgs/os-specific/linux/zfs/default.nix b/pkgs/os-specific/linux/zfs/default.nix index 581316dc74db5..56b36d4f36855 100644 --- a/pkgs/os-specific/linux/zfs/default.nix +++ b/pkgs/os-specific/linux/zfs/default.nix @@ -42,7 +42,7 @@ let inherit rev sha256; }; - patches = [ ] ++ extraPatches; + patches = [ ./BACKPORT-Linux-5.8-compat-__vmalloc.patch ] ++ extraPatches; postPatch = optionalString buildKernel '' patchShebangs scripts