diff options
author | Sven Wegener <sven.wegener@stealer.net> | 2008-08-14 00:47:16 +0200 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2008-08-15 09:26:15 +1000 |
commit | a919cf4b6b499416b6e2247dbc79196c4325f2e6 (patch) | |
tree | 07125d10469cb9d2779280a0f389848b5e045b5a /net/ipv4/ipvs/ip_vs_est.c | |
parent | 82dfb6f32219d8e6cf6b979a520cb2b11d977d4e (diff) | |
download | op-kernel-dev-a919cf4b6b499416b6e2247dbc79196c4325f2e6.zip op-kernel-dev-a919cf4b6b499416b6e2247dbc79196c4325f2e6.tar.gz |
ipvs: Create init functions for estimator code
Commit 8ab19ea36c5c5340ff598e4d15fc084eb65671dc ("ipvs: Fix possible deadlock
in estimator code") fixed a deadlock condition, but that condition can only
happen during unload of IPVS, because during normal operation there is at least
our global stats structure in the estimator list. The mod_timer() and
del_timer_sync() calls are actually initialization and cleanup code in
disguise. Let's make it explicit and move them to their own init and cleanup
function.
Signed-off-by: Sven Wegener <sven.wegener@stealer.net>
Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'net/ipv4/ipvs/ip_vs_est.c')
-rw-r--r-- | net/ipv4/ipvs/ip_vs_est.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/net/ipv4/ipvs/ip_vs_est.c b/net/ipv4/ipvs/ip_vs_est.c index 5a20f93..4fb620e 100644 --- a/net/ipv4/ipvs/ip_vs_est.c +++ b/net/ipv4/ipvs/ip_vs_est.c @@ -124,8 +124,6 @@ void ip_vs_new_estimator(struct ip_vs_stats *stats) est->outbps = stats->outbps<<5; spin_lock_bh(&est_lock); - if (list_empty(&est_list)) - mod_timer(&est_timer, jiffies + 2 * HZ); list_add(&est->list, &est_list); spin_unlock_bh(&est_lock); } @@ -136,11 +134,6 @@ void ip_vs_kill_estimator(struct ip_vs_stats *stats) spin_lock_bh(&est_lock); list_del(&est->list); - while (list_empty(&est_list) && try_to_del_timer_sync(&est_timer) < 0) { - spin_unlock_bh(&est_lock); - cpu_relax(); - spin_lock_bh(&est_lock); - } spin_unlock_bh(&est_lock); } @@ -160,3 +153,14 @@ void ip_vs_zero_estimator(struct ip_vs_stats *stats) est->inbps = 0; est->outbps = 0; } + +int __init ip_vs_estimator_init(void) +{ + mod_timer(&est_timer, jiffies + 2 * HZ); + return 0; +} + +void ip_vs_estimator_cleanup(void) +{ + del_timer_sync(&est_timer); +} |