]> git.ipfire.org Git - thirdparty/ipset.git/commitdiff
Compatibility: check for kvzalloc() and GFP_KERNEL_ACCOUNT
authorJozsef Kadlecsik <kadlec@netfilter.org>
Thu, 19 Nov 2020 14:01:37 +0000 (15:01 +0100)
committerJozsef Kadlecsik <kadlec@netfilter.org>
Thu, 19 Nov 2020 14:50:45 +0000 (15:50 +0100)
Signed-off-by: Jozsef Kadlecsik <kadlec@netfilter.org>
configure.ac
kernel/include/linux/netfilter/ipset/ip_set_compat.h.in

index 1ee4abd82a72b93d44e715a46a0bd5fc2146ca7e..c10f9f685ef5e8fd1ce64efd67ea67f9299d89d2 100644 (file)
@@ -776,6 +776,26 @@ else
        AC_SUBST(HAVE_NLA_POLICY_EXACT_LEN, undef)
 fi
 
+AC_MSG_CHECKING([kernel source for kvzalloc() in mm.h])
+if test -f $ksourcedir/include/linux/mm.h && \
+   $GREP -q 'static inline void \*kvzalloc(' $ksourcedir/include/linux/mm.h; then
+       AC_MSG_RESULT(yes)
+       AC_SUBST(HAVE_KVZALLOC, define)
+else
+       AC_MSG_RESULT(no)
+       AC_SUBST(HAVE_KVZALLOC, undef)
+fi
+
+AC_MSG_CHECKING([kernel source for GFP_KERNEL_ACCOUNT in gfp.h])
+if test -f $ksourcedir/include/linux/gfp.h && \
+   $GREP -q 'define GFP_KERNEL_ACCOUNT' $ksourcedir/include/linux/gfp.h; then
+       AC_MSG_RESULT(yes)
+       AC_SUBST(HAVE_GFP_KERNEL_ACCOUNT, define)
+else
+       AC_MSG_RESULT(no)
+       AC_SUBST(HAVE_GFP_KERNEL_ACCOUNT, undef)
+fi
+
 AC_MSG_CHECKING([kernel source for struct net_generic])
 if test -f $ksourcedir/include/net/netns/generic.h && \
    $GREP -q 'struct net_generic' $ksourcedir/include/net/netns/generic.h; then
index 24acc5f3017f51963e5be2bc0fa9e00aee230dd7..8f00e6a280b93c827fe4c5248e3fbf655c8d21ef 100644 (file)
@@ -59,6 +59,8 @@
 #@HAVE_LIST_FOR_EACH_ENTRY_RCU_FOUR_ARGS@ HAVE_LIST_FOR_EACH_ENTRY_RCU_FOUR_ARGS
 #@HAVE_SKB_PROTOCOL@ HAVE_SKB_PROTOCOL
 #@HAVE_NLA_POLICY_EXACT_LEN@ HAVE_NLA_POLICY_EXACT_LEN
+#@HAVE_KVZALLOC@ HAVE_KVZALLOC
+#@HAVE_GFP_KERNEL_ACCOUNT@ HAVE_GFP_KERNEL_ACCOUNT
 
 #ifdef HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H
 #include <linux/module.h>
@@ -485,12 +487,39 @@ static inline u16 nfnl_msg_type(u8 subsys, u8 msg_type)
 #endif
 
 #ifndef HAVE_NLA_POLICY_EXACT_LEN
-#define HAVE_NLA_POLICY_EXACT_LEN(_len) {      \
+#define NLA_POLICY_EXACT_LEN(_len) {           \
        .type = NLA_UNSPEC,                     \
        .len = _len                             \
 }
 #endif
 
+#ifndef HAVE_KVZALLOC
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#ifndef GFP_KERNEL_ACCOUNT
+#define GFP_KERNEL_ACCOUNT GFP_KERNEL
+#endif
+static inline void *kvzalloc(size_t size, gfp_t flags)
+{
+       void *members = NULL;
+
+       if (size < KMALLOC_MAX_SIZE)
+               members = kzalloc(size, GFP_KERNEL | __GFP_NOWARN);
+
+       if (members) {
+               pr_debug("%p: allocated with kmalloc\n", members);
+               return members;
+       }
+
+       members = vzalloc(size);
+       if (!members)
+               return NULL;
+       pr_debug("%p: allocated with vmalloc\n", members);
+
+       return members;
+}
+#endif
+
 /* Compiler attributes */
 #ifndef __has_attribute
 # define __has_attribute(x) __GCC4_has_attribute_##x