summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac10
-rw-r--r--kernel/include/linux/netfilter/ipset/ip_set_compat.h.in12
2 files changed, 22 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index e0025df..ced2880 100644
--- a/configure.ac
+++ b/configure.ac
@@ -333,6 +333,16 @@ else
AC_SUBST(HAVE_IPV6_SKIP_EXTHDR_ARGS, 3)
fi
+AC_MSG_CHECKING([kernel source for cond_resched_rcu])
+if test -f $ksourcedir/include/linux/sched.h && \
+ $AWK '/( |\t)cond_resched_rcu\(/,/\)/' $ksourcedir/include/linux/sched.h | $GREP -q 'cond_resched_rcu'; then
+ AC_MSG_RESULT(yes)
+ AC_SUBST(HAVE_COND_RESCHED_RCU, define)
+else
+ AC_MSG_RESULT(no)
+ AC_SUBST(HAVE_COND_RESCHED_RCU, undef)
+fi
+
AC_MSG_CHECKING([kernel source for bool checkentry function prototype])
if test -f $ksourcedir/include/linux/netfilter/x_tables.h && \
$GREP -q 'bool .\*checkentry.' $ksourcedir/include/linux/netfilter/x_tables.h; then
diff --git a/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in b/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
index 5f12ad8..f4d7acc 100644
--- a/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
+++ b/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
@@ -50,6 +50,7 @@
#@HAVE_STRSCPY@ HAVE_STRSCPY
#@HAVE_SYNCHRONIZE_RCU_BH@ HAVE_SYNCHRONIZE_RCU_BH
#@HAVE_LOCKDEP_NFNL_IS_HELD@ HAVE_LOCKDEP_NFNL_IS_HELD
+#@HAVE_COND_RESCHED_RCU@ HAVE_COND_RESCHED_RCU
#ifdef HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H
#include <linux/module.h>
@@ -148,6 +149,17 @@ do { \
#endif
#endif
+#ifndef HAVE_COND_RESCHED_RCU
+static inline void cond_resched_rcu(void)
+{
+#if defined(CONFIG_DEBUG_ATOMIC_SLEEP) || !defined(CONFIG_PREEMPT_RCU)
+ rcu_read_unlock();
+ cond_resched();
+ rcu_read_lock();
+#endif
+}
+#endif
+
#if defined(CONFIG_NETFILTER_NETLINK) || defined(CONFIG_NETFILTER_NETLINK_MODULE)
#else
#error "NETFILTER_NETLINK must be enabled: select NFACCT/NFQUEUE/LOG over NFNETLINK"