From 0a81ab50306539788e2dd0471f3b1ed5b9dcc5ef Mon Sep 17 00:00:00 2001 From: Jozsef Kadlecsik Date: Wed, 3 Jan 2018 10:57:31 +0100 Subject: Backport patch: netfilter: ipset: Convert timers to use timer_setup() --- configure.ac | 10 ++++++++++ kernel/include/linux/netfilter/ipset/ip_set_compat.h.in | 15 +++++++++++++++ kernel/net/netfilter/ipset/ip_set_bitmap_gen.h | 9 ++++----- kernel/net/netfilter/ipset/ip_set_bitmap_ip.c | 6 ++++++ kernel/net/netfilter/ipset/ip_set_bitmap_ipmac.c | 6 ++++++ kernel/net/netfilter/ipset/ip_set_bitmap_port.c | 6 ++++++ kernel/net/netfilter/ipset/ip_set_hash_gen.h | 15 ++++++++++----- kernel/net/netfilter/ipset/ip_set_list_set.c | 15 ++++++++++----- 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 @@ -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; -- cgit v1.2.3