175 lines
6 KiB
Diff
175 lines
6 KiB
Diff
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);
|
|
}
|
|
|