summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2018-01-03 10:57:31 +0100
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2018-01-03 10:57:31 +0100
commit0a81ab50306539788e2dd0471f3b1ed5b9dcc5ef (patch)
tree995fcac0cdf514dcd941da9a10d0ab580e74871b
parentd71dd93599b932693f045301424c2276cd25a87e (diff)
Backport patch: netfilter: ipset: Convert timers to use timer_setup()
-rw-r--r--configure.ac10
-rw-r--r--kernel/include/linux/netfilter/ipset/ip_set_compat.h.in15
-rw-r--r--kernel/net/netfilter/ipset/ip_set_bitmap_gen.h9
-rw-r--r--kernel/net/netfilter/ipset/ip_set_bitmap_ip.c6
-rw-r--r--kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c6
-rw-r--r--kernel/net/netfilter/ipset/ip_set_bitmap_port.c6
-rw-r--r--kernel/net/netfilter/ipset/ip_set_hash_gen.h15
-rw-r--r--kernel/net/netfilter/ipset/ip_set_list_set.c15
8 files changed, 67 insertions, 15 deletions
diff --git a/configure.ac b/configure.ac
index 0c01680..9b6c907 100644
--- a/configure.ac
+++ b/configure.ac
@@ -589,6 +589,16 @@ else
AC_SUBST(HAVE_TYPEDEF_SCTP_SCTPHDR_T, undef)
fi
+AC_MSG_CHECKING([kernel source for timer_setup in timer.h])
+if test -f $ksourcedir/include/linux/timer.h && \
+ $GREP -q ' timer_setup' $ksourcedir/include/linux/timer.h; then
+ AC_MSG_RESULT(yes)
+ AC_SUBST(HAVE_TIMER_SETUP, define)
+else
+ AC_MSG_RESULT(no)
+ AC_SUBST(HAVE_TIMER_SETUP, 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
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 2630600..e1caa68 100644
--- a/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
+++ b/kernel/include/linux/netfilter/ipset/ip_set_compat.h.in
@@ -43,6 +43,7 @@
#@HAVE_PASSING_EXTENDED_ACK_TO_PARSERS@ HAVE_PASSING_EXTENDED_ACK_TO_PARSERS
#@HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS@ HAVE_PASSING_EXTENDED_ACK_TO_CALLBACKS
#@HAVE_TYPEDEF_SCTP_SCTPHDR_T@ HAVE_TYPEDEF_SCTP_SCTPHDR_T
+#@HAVE_TIMER_SETUP@ HAVE_TIMER_SETUP
#ifdef HAVE_EXPORT_SYMBOL_GPL_IN_MODULE_H
#include <linux/module.h>
@@ -337,6 +338,20 @@ static inline u16 nfnl_msg_type(u8 subsys, u8 msg_type)
#define XT_FAMILY(par) (par)->family
#endif
+#ifdef HAVE_TIMER_SETUP
+#define GC_ARG struct timer_list *t
+#define TIMER_SETUP(a, b) timer_setup(a, b, 0)
+#define INIT_GC_VARS(type, var) \
+ struct type *var = from_timer(var, t, gc); \
+ struct ip_set *set = var->set
+#else
+#define GC_ARG unsigned long ul_set
+#define TIMER_SETUP(a, b) setup_timer(a, b, (unsigned long)set)
+#define INIT_GC_VARS(type, var) \
+ struct ip_set *set = (struct ip_set *)ul_set; \
+ struct type *var = set->data
+#endif
+
#ifndef smp_mb__before_atomic
#define smp_mb__before_atomic() smp_mb()
#define smp_mb__after_atomic() smp_mb()
diff --git a/kernel/net/netfilter/ipset/ip_set_bitmap_gen.h b/kernel/net/netfilter/ipset/ip_set_bitmap_gen.h
index 856cc26..aa3dbb1 100644
--- a/kernel/net/netfilter/ipset/ip_set_bitmap_gen.h
+++ b/kernel/net/netfilter/ipset/ip_set_bitmap_gen.h
@@ -37,11 +37,11 @@
#define get_ext(set, map, id) ((map)->extensions + ((set)->dsize * (id)))
static void
-mtype_gc_init(struct ip_set *set, void (*gc)(unsigned long ul_set))
+mtype_gc_init(struct ip_set *set, void (*gc)(GC_ARG))
{
struct mtype *map = set->data;
- setup_timer(&map->gc, gc, (unsigned long)set);
+ TIMER_SETUP(&map->gc, gc);
mod_timer(&map->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ);
}
@@ -274,10 +274,9 @@ out:
}
static void
-mtype_gc(unsigned long ul_set)
+mtype_gc(GC_ARG)
{
- struct ip_set *set = (struct ip_set *)ul_set;
- struct mtype *map = set->data;
+ INIT_GC_VARS(mtype, map);
void *x;
u32 id;
diff --git a/kernel/net/netfilter/ipset/ip_set_bitmap_ip.c b/kernel/net/netfilter/ipset/ip_set_bitmap_ip.c
index 9f4f28d..d3e0174 100644
--- a/kernel/net/netfilter/ipset/ip_set_bitmap_ip.c
+++ b/kernel/net/netfilter/ipset/ip_set_bitmap_ip.c
@@ -48,6 +48,9 @@ struct bitmap_ip {
size_t memsize; /* members size */
u8 netmask; /* subnet netmask */
struct timer_list gc; /* garbage collection */
+#ifdef HAVE_TIMER_SETUP
+ struct ip_set *set; /* attached to this ip_set */
+#endif
unsigned char extensions[0] /* data extensions */
__aligned(__alignof__(u64));
};
@@ -232,6 +235,9 @@ init_map_ip(struct ip_set *set, struct bitmap_ip *map,
map->netmask = netmask;
set->timeout = IPSET_NO_TIMEOUT;
+#ifdef HAVE_TIMER_SETUP
+ map->set = set;
+#endif
set->data = map;
set->family = NFPROTO_IPV4;
diff --git a/kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c b/kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c
index f7415d4..319600a 100644
--- a/kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c
+++ b/kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c
@@ -52,6 +52,9 @@ struct bitmap_ipmac {
u32 elements; /* number of max elements in the set */
size_t memsize; /* members size */
struct timer_list gc; /* garbage collector */
+#ifdef HAVE_TIMER_SETUP
+ struct ip_set *set; /* attached to this ip_set */
+#endif
unsigned char extensions[0] /* MAC + data extensions */
__aligned(__alignof__(u64));
};
@@ -307,6 +310,9 @@ init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map,
map->elements = elements;
set->timeout = IPSET_NO_TIMEOUT;
+#ifdef HAVE_TIMER_SETUP
+ map->set = set;
+#endif
set->data = map;
set->family = NFPROTO_IPV4;
diff --git a/kernel/net/netfilter/ipset/ip_set_bitmap_port.c b/kernel/net/netfilter/ipset/ip_set_bitmap_port.c
index c6e1ebf..99edaac 100644
--- a/kernel/net/netfilter/ipset/ip_set_bitmap_port.c
+++ b/kernel/net/netfilter/ipset/ip_set_bitmap_port.c
@@ -40,6 +40,9 @@ struct bitmap_port {
u32 elements; /* number of max elements in the set */
size_t memsize; /* members size */
struct timer_list gc; /* garbage collection */
+#ifdef HAVE_TIMER_SETUP
+ struct ip_set *set; /* attached to this ip_set */
+#endif
unsigned char extensions[0] /* data extensions */
__aligned(__alignof__(u64));
};
@@ -214,6 +217,9 @@ init_map_port(struct ip_set *set, struct bitmap_port *map,
map->last_port = last_port;
set->timeout = IPSET_NO_TIMEOUT;
+#ifdef HAVE_TIMER_SETUP
+ map->set = set;
+#endif
set->data = map;
set->family = NFPROTO_UNSPEC;
diff --git a/kernel/net/netfilter/ipset/ip_set_hash_gen.h b/kernel/net/netfilter/ipset/ip_set_hash_gen.h
index 7cc0784..d24ee3c 100644
--- a/kernel/net/netfilter/ipset/ip_set_hash_gen.h
+++ b/kernel/net/netfilter/ipset/ip_set_hash_gen.h
@@ -280,6 +280,9 @@ htable_bits(u32 hashsize)
struct htype {
struct htable __rcu *table; /* the hash table */
struct timer_list gc; /* garbage collection when timeout enabled */
+#ifdef HAVE_TIMER_SETUP
+ struct ip_set *set; /* attached to this ip_set */
+#endif
u32 maxelem; /* max elements in the hash */
u32 initval; /* random jhash init value */
#ifdef IP_SET_HASH_WITH_MARKMASK
@@ -429,11 +432,11 @@ mtype_destroy(struct ip_set *set)
}
static void
-mtype_gc_init(struct ip_set *set, void (*gc)(unsigned long ul_set))
+mtype_gc_init(struct ip_set *set, void (*gc)(GC_ARG))
{
struct htype *h = set->data;
- setup_timer(&h->gc, gc, (unsigned long)set);
+ TIMER_SETUP(&h->gc, gc);
mod_timer(&h->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ);
pr_debug("gc initialized, run in every %u\n",
IPSET_GC_PERIOD(set->timeout));
@@ -527,10 +530,9 @@ mtype_expire(struct ip_set *set, struct htype *h)
}
static void
-mtype_gc(unsigned long ul_set)
+mtype_gc(GC_ARG)
{
- struct ip_set *set = (struct ip_set *)ul_set;
- struct htype *h = set->data;
+ INIT_GC_VARS(htype, h);
pr_debug("called\n");
spin_lock_bh(&set->lock);
@@ -1315,6 +1317,9 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set,
t->htable_bits = hbits;
RCU_INIT_POINTER(h->table, t);
+#ifdef HAVE_TIMER_SETUP
+ h->set = set;
+#endif
set->data = h;
#ifndef IP_SET_PROTO_UNDEF
if (set->family == NFPROTO_IPV4) {
diff --git a/kernel/net/netfilter/ipset/ip_set_list_set.c b/kernel/net/netfilter/ipset/ip_set_list_set.c
index 2fff6b5..55ecea2 100644
--- a/kernel/net/netfilter/ipset/ip_set_list_set.c
+++ b/kernel/net/netfilter/ipset/ip_set_list_set.c
@@ -44,6 +44,9 @@ struct set_adt_elem {
struct list_set {
u32 size; /* size of set list array */
struct timer_list gc; /* garbage collection */
+#ifdef HAVE_TIMER_SETUP
+ struct ip_set *set; /* attached to this ip_set */
+#endif
struct net *net; /* namespace */
struct list_head members; /* the set members */
};
@@ -568,10 +571,9 @@ static const struct ip_set_type_variant set_variant = {
};
static void
-list_set_gc(unsigned long ul_set)
+list_set_gc(GC_ARG)
{
- struct ip_set *set = (struct ip_set *)ul_set;
- struct list_set *map = set->data;
+ INIT_GC_VARS(list_set, map);
spin_lock_bh(&set->lock);
set_cleanup_entries(set);
@@ -582,11 +584,11 @@ list_set_gc(unsigned long ul_set)
}
static void
-list_set_gc_init(struct ip_set *set, void (*gc)(unsigned long ul_set))
+list_set_gc_init(struct ip_set *set, void (*gc)(GC_ARG))
{
struct list_set *map = set->data;
- setup_timer(&map->gc, gc, (unsigned long)set);
+ TIMER_SETUP(&map->gc, gc);
mod_timer(&map->gc, jiffies + IPSET_GC_PERIOD(set->timeout) * HZ);
}
@@ -603,6 +605,9 @@ init_list_set(struct net *net, struct ip_set *set, u32 size)
map->size = size;
map->net = net;
+#ifdef HAVE_TIMER_SETUP
+ map->set = set;
+#endif
INIT_LIST_HEAD(&map->members);
set->data = map;