Commit 8ef81c65 authored by Kees Cook's avatar Kees Cook

netfilter: ipvs: Convert timers to use timer_setup()

In preparation for unconditionally passing the struct timer_list pointer to
all timer callbacks, switch to using the new timer_setup() and from_timer()
to pass the timer pointer explicitly.

Cc: Wensong Zhang <wensong@linux-vs.org>
Cc: Simon Horman <horms@verge.net.au>
Cc: Julian Anastasov <ja@ssi.bg>
Cc: Pablo Neira Ayuso <pablo@netfilter.org>
Cc: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Cc: Florian Westphal <fw@strlen.de>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Cc: lvs-devel@vger.kernel.org
Cc: netfilter-devel@vger.kernel.org
Cc: coreteam@netfilter.org
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
Acked-by: default avatarSimon Horman <horms@verge.net.au>
parent 8e5f4ba0
...@@ -104,7 +104,7 @@ static inline void ct_write_unlock_bh(unsigned int key) ...@@ -104,7 +104,7 @@ static inline void ct_write_unlock_bh(unsigned int key)
spin_unlock_bh(&__ip_vs_conntbl_lock_array[key&CT_LOCKARRAY_MASK].l); spin_unlock_bh(&__ip_vs_conntbl_lock_array[key&CT_LOCKARRAY_MASK].l);
} }
static void ip_vs_conn_expire(unsigned long data); static void ip_vs_conn_expire(struct timer_list *t);
/* /*
* Returns hash value for IPVS connection entry * Returns hash value for IPVS connection entry
...@@ -457,7 +457,7 @@ EXPORT_SYMBOL_GPL(ip_vs_conn_out_get_proto); ...@@ -457,7 +457,7 @@ EXPORT_SYMBOL_GPL(ip_vs_conn_out_get_proto);
static void __ip_vs_conn_put_notimer(struct ip_vs_conn *cp) static void __ip_vs_conn_put_notimer(struct ip_vs_conn *cp)
{ {
__ip_vs_conn_put(cp); __ip_vs_conn_put(cp);
ip_vs_conn_expire((unsigned long)cp); ip_vs_conn_expire(&cp->timer);
} }
/* /*
...@@ -817,9 +817,9 @@ static void ip_vs_conn_rcu_free(struct rcu_head *head) ...@@ -817,9 +817,9 @@ static void ip_vs_conn_rcu_free(struct rcu_head *head)
kmem_cache_free(ip_vs_conn_cachep, cp); kmem_cache_free(ip_vs_conn_cachep, cp);
} }
static void ip_vs_conn_expire(unsigned long data) static void ip_vs_conn_expire(struct timer_list *t)
{ {
struct ip_vs_conn *cp = (struct ip_vs_conn *)data; struct ip_vs_conn *cp = from_timer(cp, t, timer);
struct netns_ipvs *ipvs = cp->ipvs; struct netns_ipvs *ipvs = cp->ipvs;
/* /*
...@@ -909,7 +909,7 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, int dest_af, ...@@ -909,7 +909,7 @@ ip_vs_conn_new(const struct ip_vs_conn_param *p, int dest_af,
} }
INIT_HLIST_NODE(&cp->c_list); INIT_HLIST_NODE(&cp->c_list);
setup_timer(&cp->timer, ip_vs_conn_expire, (unsigned long)cp); timer_setup(&cp->timer, ip_vs_conn_expire, 0);
cp->ipvs = ipvs; cp->ipvs = ipvs;
cp->af = p->af; cp->af = p->af;
cp->daf = dest_af; cp->daf = dest_af;
......
...@@ -1146,9 +1146,9 @@ ip_vs_del_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest) ...@@ -1146,9 +1146,9 @@ ip_vs_del_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest)
return 0; return 0;
} }
static void ip_vs_dest_trash_expire(unsigned long data) static void ip_vs_dest_trash_expire(struct timer_list *t)
{ {
struct netns_ipvs *ipvs = (struct netns_ipvs *)data; struct netns_ipvs *ipvs = from_timer(ipvs, t, dest_trash_timer);
struct ip_vs_dest *dest, *next; struct ip_vs_dest *dest, *next;
unsigned long now = jiffies; unsigned long now = jiffies;
...@@ -4019,8 +4019,7 @@ int __net_init ip_vs_control_net_init(struct netns_ipvs *ipvs) ...@@ -4019,8 +4019,7 @@ int __net_init ip_vs_control_net_init(struct netns_ipvs *ipvs)
INIT_LIST_HEAD(&ipvs->dest_trash); INIT_LIST_HEAD(&ipvs->dest_trash);
spin_lock_init(&ipvs->dest_trash_lock); spin_lock_init(&ipvs->dest_trash_lock);
setup_timer(&ipvs->dest_trash_timer, ip_vs_dest_trash_expire, timer_setup(&ipvs->dest_trash_timer, ip_vs_dest_trash_expire, 0);
(unsigned long) ipvs);
atomic_set(&ipvs->ftpsvc_counter, 0); atomic_set(&ipvs->ftpsvc_counter, 0);
atomic_set(&ipvs->nullsvc_counter, 0); atomic_set(&ipvs->nullsvc_counter, 0);
atomic_set(&ipvs->conn_out_counter, 0); atomic_set(&ipvs->conn_out_counter, 0);
......
...@@ -97,12 +97,12 @@ static void ip_vs_read_cpu_stats(struct ip_vs_kstats *sum, ...@@ -97,12 +97,12 @@ static void ip_vs_read_cpu_stats(struct ip_vs_kstats *sum,
} }
static void estimation_timer(unsigned long arg) static void estimation_timer(struct timer_list *t)
{ {
struct ip_vs_estimator *e; struct ip_vs_estimator *e;
struct ip_vs_stats *s; struct ip_vs_stats *s;
u64 rate; u64 rate;
struct netns_ipvs *ipvs = (struct netns_ipvs *)arg; struct netns_ipvs *ipvs = from_timer(ipvs, t, est_timer);
spin_lock(&ipvs->est_lock); spin_lock(&ipvs->est_lock);
list_for_each_entry(e, &ipvs->est_list, list) { list_for_each_entry(e, &ipvs->est_list, list) {
...@@ -192,7 +192,7 @@ int __net_init ip_vs_estimator_net_init(struct netns_ipvs *ipvs) ...@@ -192,7 +192,7 @@ int __net_init ip_vs_estimator_net_init(struct netns_ipvs *ipvs)
{ {
INIT_LIST_HEAD(&ipvs->est_list); INIT_LIST_HEAD(&ipvs->est_list);
spin_lock_init(&ipvs->est_lock); spin_lock_init(&ipvs->est_lock);
setup_timer(&ipvs->est_timer, estimation_timer, (unsigned long)ipvs); timer_setup(&ipvs->est_timer, estimation_timer, 0);
mod_timer(&ipvs->est_timer, jiffies + 2 * HZ); mod_timer(&ipvs->est_timer, jiffies + 2 * HZ);
return 0; return 0;
} }
......
...@@ -106,6 +106,7 @@ struct ip_vs_lblc_table { ...@@ -106,6 +106,7 @@ struct ip_vs_lblc_table {
struct rcu_head rcu_head; struct rcu_head rcu_head;
struct hlist_head bucket[IP_VS_LBLC_TAB_SIZE]; /* hash bucket */ struct hlist_head bucket[IP_VS_LBLC_TAB_SIZE]; /* hash bucket */
struct timer_list periodic_timer; /* collect stale entries */ struct timer_list periodic_timer; /* collect stale entries */
struct ip_vs_service *svc; /* pointer back to service */
atomic_t entries; /* number of entries */ atomic_t entries; /* number of entries */
int max_size; /* maximum size of entries */ int max_size; /* maximum size of entries */
int rover; /* rover for expire check */ int rover; /* rover for expire check */
...@@ -294,10 +295,10 @@ static inline void ip_vs_lblc_full_check(struct ip_vs_service *svc) ...@@ -294,10 +295,10 @@ static inline void ip_vs_lblc_full_check(struct ip_vs_service *svc)
* of the table. * of the table.
* The full expiration check is for this purpose now. * The full expiration check is for this purpose now.
*/ */
static void ip_vs_lblc_check_expire(unsigned long data) static void ip_vs_lblc_check_expire(struct timer_list *t)
{ {
struct ip_vs_service *svc = (struct ip_vs_service *) data; struct ip_vs_lblc_table *tbl = from_timer(tbl, t, periodic_timer);
struct ip_vs_lblc_table *tbl = svc->sched_data; struct ip_vs_service *svc = tbl->svc;
unsigned long now = jiffies; unsigned long now = jiffies;
int goal; int goal;
int i, j; int i, j;
...@@ -369,12 +370,12 @@ static int ip_vs_lblc_init_svc(struct ip_vs_service *svc) ...@@ -369,12 +370,12 @@ static int ip_vs_lblc_init_svc(struct ip_vs_service *svc)
tbl->rover = 0; tbl->rover = 0;
tbl->counter = 1; tbl->counter = 1;
tbl->dead = 0; tbl->dead = 0;
tbl->svc = svc;
/* /*
* Hook periodic timer for garbage collection * Hook periodic timer for garbage collection
*/ */
setup_timer(&tbl->periodic_timer, ip_vs_lblc_check_expire, timer_setup(&tbl->periodic_timer, ip_vs_lblc_check_expire, 0);
(unsigned long)svc);
mod_timer(&tbl->periodic_timer, jiffies + CHECK_EXPIRE_INTERVAL); mod_timer(&tbl->periodic_timer, jiffies + CHECK_EXPIRE_INTERVAL);
return 0; return 0;
......
...@@ -278,6 +278,7 @@ struct ip_vs_lblcr_table { ...@@ -278,6 +278,7 @@ struct ip_vs_lblcr_table {
atomic_t entries; /* number of entries */ atomic_t entries; /* number of entries */
int max_size; /* maximum size of entries */ int max_size; /* maximum size of entries */
struct timer_list periodic_timer; /* collect stale entries */ struct timer_list periodic_timer; /* collect stale entries */
struct ip_vs_service *svc; /* pointer back to service */
int rover; /* rover for expire check */ int rover; /* rover for expire check */
int counter; /* counter for no expire */ int counter; /* counter for no expire */
bool dead; bool dead;
...@@ -458,10 +459,10 @@ static inline void ip_vs_lblcr_full_check(struct ip_vs_service *svc) ...@@ -458,10 +459,10 @@ static inline void ip_vs_lblcr_full_check(struct ip_vs_service *svc)
* of the table. * of the table.
* The full expiration check is for this purpose now. * The full expiration check is for this purpose now.
*/ */
static void ip_vs_lblcr_check_expire(unsigned long data) static void ip_vs_lblcr_check_expire(struct timer_list *t)
{ {
struct ip_vs_service *svc = (struct ip_vs_service *) data; struct ip_vs_lblcr_table *tbl = from_timer(tbl, t, periodic_timer);
struct ip_vs_lblcr_table *tbl = svc->sched_data; struct ip_vs_service *svc = tbl->svc;
unsigned long now = jiffies; unsigned long now = jiffies;
int goal; int goal;
int i, j; int i, j;
...@@ -532,12 +533,12 @@ static int ip_vs_lblcr_init_svc(struct ip_vs_service *svc) ...@@ -532,12 +533,12 @@ static int ip_vs_lblcr_init_svc(struct ip_vs_service *svc)
tbl->rover = 0; tbl->rover = 0;
tbl->counter = 1; tbl->counter = 1;
tbl->dead = 0; tbl->dead = 0;
tbl->svc = svc;
/* /*
* Hook periodic timer for garbage collection * Hook periodic timer for garbage collection
*/ */
setup_timer(&tbl->periodic_timer, ip_vs_lblcr_check_expire, timer_setup(&tbl->periodic_timer, ip_vs_lblcr_check_expire, 0);
(unsigned long)svc);
mod_timer(&tbl->periodic_timer, jiffies + CHECK_EXPIRE_INTERVAL); mod_timer(&tbl->periodic_timer, jiffies + CHECK_EXPIRE_INTERVAL);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment