spl: Backport compatibility patches for newer kernels
This commit is contained in:
parent
ff371b96df
commit
ebfb506036
|
@ -7,7 +7,7 @@ stdenv.mkDerivation {
|
|||
sha256 = "1qqzyj2if5wai4jiwml4i8s6v8k7hbi7jmiph800lhkk5j8s72l9";
|
||||
};
|
||||
|
||||
patches = [ ./install_prefix.patch ./const.patch ];
|
||||
patches = [ ./install_prefix.patch ./const.patch ./kernel-3.16.patch ./kernel-3.17.patch ];
|
||||
|
||||
buildInputs = [ perl autoconf automake libtool ];
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ stdenv.mkDerivation {
|
|||
sha256 = "0mcivbddms8kbapbs9x6achqyvh5i6h1rd2b3jm8g5yjn0flc5gl";
|
||||
};
|
||||
|
||||
patches = [ ./install_prefix.patch ./const.patch ];
|
||||
patches = [ ./install_prefix.patch ./const.patch ./kernel-3.16.patch ./kernel-3.17.patch ];
|
||||
|
||||
buildInputs = [ perl autoconf automake libtool ];
|
||||
|
||||
|
|
34
pkgs/os-specific/linux/spl/kernel-3.16.patch
Normal file
34
pkgs/os-specific/linux/spl/kernel-3.16.patch
Normal file
|
@ -0,0 +1,34 @@
|
|||
From e3020723dc43af2bc22af0d68571a61daf9b44d0 Mon Sep 17 00:00:00 2001
|
||||
From: Turbo Fredriksson <turbo@bayour.com>
|
||||
Date: Sun, 14 Sep 2014 15:47:22 +0000
|
||||
Subject: [PATCH] Linux 3.16 compat: smp_mb__after_clear_bit()
|
||||
|
||||
The smp_mb__{before,after}_clear_bit functions have been renamed
|
||||
smp_mb__{before,after}_atomic. Rather than adding a compatibility
|
||||
function to handle this the code has been updated to use smp_wmb().
|
||||
|
||||
This has the advantage of being a stable functionally equivalent
|
||||
interface. On many architectures smp_mb__after_clear_bit() expands
|
||||
to smp_wmb(). Others might be able to do something slightly more
|
||||
efficient but this will be safe and correct on all of them.
|
||||
|
||||
Signed-off-by: Turbo Fredriksson <turbo@bayour.com>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #386
|
||||
---
|
||||
module/spl/spl-kmem.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c
|
||||
index 6de513e..79954eb 100644
|
||||
--- a/module/spl/spl-kmem.c
|
||||
+++ b/module/spl/spl-kmem.c
|
||||
@@ -2365,7 +2365,7 @@ spl_kmem_cache_reap_now(spl_kmem_cache_t *skc, int count)
|
||||
|
||||
spl_slab_reclaim(skc, count, 1);
|
||||
clear_bit(KMC_BIT_REAPING, &skc->skc_flags);
|
||||
- smp_mb__after_clear_bit();
|
||||
+ smp_wmb();
|
||||
wake_up_bit(&skc->skc_flags, KMC_BIT_REAPING);
|
||||
out:
|
||||
atomic_dec(&skc->skc_ref);
|
175
pkgs/os-specific/linux/spl/kernel-3.17.patch
Normal file
175
pkgs/os-specific/linux/spl/kernel-3.17.patch
Normal file
|
@ -0,0 +1,175 @@
|
|||
From 2fc44f66ec9b83069593d87cf311069458c0d5ae Mon Sep 17 00:00:00 2001
|
||||
From: Ned Bass <bass6@llnl.gov>
|
||||
Date: Fri, 8 Aug 2014 17:41:22 -0700
|
||||
Subject: [PATCH] Linux 3.17 compat: remove wait_on_bit action function
|
||||
|
||||
Linux kernel 3.17 removes the action function argument from
|
||||
wait_on_bit(). Add autoconf test and compatibility macro to support
|
||||
the new interface.
|
||||
|
||||
The former "wait_on_bit" interface required an 'action' function to
|
||||
be provided which does the actual waiting. There were over 20 such
|
||||
functions in the kernel, many of them identical, though most cases
|
||||
can be satisfied by one of just two functions: one which uses
|
||||
io_schedule() and one which just uses schedule(). This API change
|
||||
was made to consolidate all of those redundant wait functions.
|
||||
|
||||
References: torvalds/linux@7431620
|
||||
|
||||
Signed-off-by: Ned Bass <bass6@llnl.gov>
|
||||
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||||
Closes #378
|
||||
---
|
||||
config/spl-build.m4 | 26 ++++++++++++++++++++++++++
|
||||
include/linux/Makefile.am | 1 +
|
||||
include/linux/wait_compat.h | 45 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
include/sys/types.h | 1 +
|
||||
module/spl/spl-kmem.c | 11 ++---------
|
||||
5 files changed, 75 insertions(+), 9 deletions(-)
|
||||
create mode 100644 include/linux/wait_compat.h
|
||||
|
||||
diff --git a/config/spl-build.m4 b/config/spl-build.m4
|
||||
index eef5233..2514d8c 100644
|
||||
--- a/config/spl-build.m4
|
||||
+++ b/config/spl-build.m4
|
||||
@@ -94,6 +94,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
|
||||
SPL_AC_2ARGS_VFS_GETATTR
|
||||
SPL_AC_USLEEP_RANGE
|
||||
SPL_AC_KMEM_CACHE_ALLOCFLAGS
|
||||
+ SPL_AC_WAIT_ON_BIT
|
||||
])
|
||||
|
||||
AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
|
||||
@@ -2570,3 +2571,28 @@ AC_DEFUN([SPL_AC_KMEM_CACHE_ALLOCFLAGS], [
|
||||
])
|
||||
])
|
||||
])
|
||||
+
|
||||
+dnl #
|
||||
+dnl # 3.17 API change,
|
||||
+dnl # wait_on_bit() no longer requires an action argument. The former
|
||||
+dnl # "wait_on_bit" interface required an 'action' function to be provided
|
||||
+dnl # which does the actual waiting. There were over 20 such functions in the
|
||||
+dnl # kernel, many of them identical, though most cases can be satisfied by one
|
||||
+dnl # of just two functions: one which uses io_schedule() and one which just
|
||||
+dnl # uses schedule(). This API change was made to consolidate all of those
|
||||
+dnl # redundant wait functions.
|
||||
+dnl #
|
||||
+AC_DEFUN([SPL_AC_WAIT_ON_BIT], [
|
||||
+ AC_MSG_CHECKING([whether wait_on_bit() takes an action])
|
||||
+ SPL_LINUX_TRY_COMPILE([
|
||||
+ #include <linux/wait.h>
|
||||
+ ],[
|
||||
+ int (*action)(void *) = NULL;
|
||||
+ wait_on_bit(NULL, 0, action, 0);
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(yes)
|
||||
+ AC_DEFINE(HAVE_WAIT_ON_BIT_ACTION, 1, [yes])
|
||||
+ ],[
|
||||
+ AC_MSG_RESULT(no)
|
||||
+ ])
|
||||
+])
|
||||
diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am
|
||||
index 59f2ec5..ec7023d 100644
|
||||
--- a/include/linux/Makefile.am
|
||||
+++ b/include/linux/Makefile.am
|
||||
@@ -17,6 +17,7 @@ KERNEL_H = \
|
||||
$(top_srcdir)/include/linux/sysctl_compat.h \
|
||||
$(top_srcdir)/include/linux/time_compat.h \
|
||||
$(top_srcdir)/include/linux/uaccess_compat.h \
|
||||
+ $(top_srcdir)/include/linux/wait_compat.h \
|
||||
$(top_srcdir)/include/linux/zlib_compat.h
|
||||
|
||||
USER_H =
|
||||
diff --git a/include/linux/wait_compat.h b/include/linux/wait_compat.h
|
||||
new file mode 100644
|
||||
index 0000000..66f9a9a
|
||||
--- /dev/null
|
||||
+++ b/include/linux/wait_compat.h
|
||||
@@ -0,0 +1,45 @@
|
||||
+/*****************************************************************************\
|
||||
+ * Copyright (C) 2007-2014 Lawrence Livermore National Security, LLC.
|
||||
+ * Copyright (C) 2007 The Regents of the University of California.
|
||||
+ * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
|
||||
+ * Written by Brian Behlendorf <behlendorf1@llnl.gov>.
|
||||
+ * UCRL-CODE-235197
|
||||
+ *
|
||||
+ * This file is part of the SPL, Solaris Porting Layer.
|
||||
+ * For details, see <http://zfsonlinux.org/>.
|
||||
+ *
|
||||
+ * The SPL is free software; you can redistribute it and/or modify it
|
||||
+ * under the terms of the GNU General Public License as published by the
|
||||
+ * Free Software Foundation; either version 2 of the License, or (at your
|
||||
+ * option) any later version.
|
||||
+ *
|
||||
+ * The SPL is distributed in the hope that it will be useful, but WITHOUT
|
||||
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
+ * for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License along
|
||||
+ * with the SPL. If not, see <http://www.gnu.org/licenses/>.
|
||||
+\*****************************************************************************/
|
||||
+
|
||||
+#ifndef _SPL_WAIT_COMPAT_H
|
||||
+#define _SPL_WAIT_COMPAT_H
|
||||
+
|
||||
+
|
||||
+#ifndef HAVE_WAIT_ON_BIT_ACTION
|
||||
+# define spl_wait_on_bit(word, bit, mode) wait_on_bit(word, bit, mode)
|
||||
+#else
|
||||
+
|
||||
+static inline int
|
||||
+spl_bit_wait(void *word)
|
||||
+{
|
||||
+ schedule();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#define spl_wait_on_bit(word, bit, mode) \
|
||||
+ wait_on_bit(word, bit, spl_bit_wait, mode)
|
||||
+
|
||||
+#endif /* HAVE_WAIT_ON_BIT_ACTION */
|
||||
+
|
||||
+#endif /* SPL_WAIT_COMPAT_H */
|
||||
diff --git a/include/sys/types.h b/include/sys/types.h
|
||||
index decb6bb..fcec0fa 100644
|
||||
--- a/include/sys/types.h
|
||||
+++ b/include/sys/types.h
|
||||
@@ -43,6 +43,7 @@
|
||||
#include <linux/zlib_compat.h>
|
||||
#include <linux/mm_compat.h>
|
||||
#include <linux/delay.h>
|
||||
+#include <linux/wait_compat.h>
|
||||
|
||||
#ifndef HAVE_UINTPTR_T
|
||||
typedef unsigned long uintptr_t;
|
||||
diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c
|
||||
index 0a9d775..6de513e 100644
|
||||
--- a/module/spl/spl-kmem.c
|
||||
+++ b/module/spl/spl-kmem.c
|
||||
@@ -1900,13 +1900,6 @@ spl_cache_grow_wait(spl_kmem_cache_t *skc)
|
||||
return !test_bit(KMC_BIT_GROWING, &skc->skc_flags);
|
||||
}
|
||||
|
||||
-static int
|
||||
-spl_cache_reclaim_wait(void *word)
|
||||
-{
|
||||
- schedule();
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* No available objects on any slabs, create a new slab. Note that this
|
||||
* functionality is disabled for KMC_SLAB caches which are backed by the
|
||||
@@ -1928,8 +1921,8 @@ spl_cache_grow(spl_kmem_cache_t *skc, int flags, void **obj)
|
||||
* then return so the local magazine can be rechecked for new objects.
|
||||
*/
|
||||
if (test_bit(KMC_BIT_REAPING, &skc->skc_flags)) {
|
||||
- rc = wait_on_bit(&skc->skc_flags, KMC_BIT_REAPING,
|
||||
- spl_cache_reclaim_wait, TASK_UNINTERRUPTIBLE);
|
||||
+ rc = spl_wait_on_bit(&skc->skc_flags, KMC_BIT_REAPING,
|
||||
+ TASK_UNINTERRUPTIBLE);
|
||||
SRETURN(rc ? rc : -EAGAIN);
|
||||
}
|
||||
|
Loading…
Reference in a new issue