xfrm: state: remove per-netns gc task
After commit 5b8ef3415a
("xfrm: Remove ancient sleeping when the SA is in acquire state")
gc does not need any per-netns data anymore.
As far as gc is concerned all state structs are the same, so we
can use a global work struct for it.
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
4141b36ab1
commit
35db57bbc4
|
@ -44,8 +44,6 @@ struct netns_xfrm {
|
||||||
unsigned int state_hmask;
|
unsigned int state_hmask;
|
||||||
unsigned int state_num;
|
unsigned int state_num;
|
||||||
struct work_struct state_hash_work;
|
struct work_struct state_hash_work;
|
||||||
struct hlist_head state_gc_list;
|
|
||||||
struct work_struct state_gc_work;
|
|
||||||
|
|
||||||
struct list_head policy_all;
|
struct list_head policy_all;
|
||||||
struct hlist_head *policy_byidx;
|
struct hlist_head *policy_byidx;
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
#define xfrm_state_deref_prot(table, net) \
|
#define xfrm_state_deref_prot(table, net) \
|
||||||
rcu_dereference_protected((table), lockdep_is_held(&(net)->xfrm.xfrm_state_lock))
|
rcu_dereference_protected((table), lockdep_is_held(&(net)->xfrm.xfrm_state_lock))
|
||||||
|
|
||||||
|
static void xfrm_state_gc_task(struct work_struct *work);
|
||||||
|
|
||||||
/* Each xfrm_state may be linked to two tables:
|
/* Each xfrm_state may be linked to two tables:
|
||||||
|
|
||||||
1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl)
|
1. Hash table by (spi,daddr,ah/esp) to find SA by SPI. (input,ctl)
|
||||||
|
@ -41,6 +43,9 @@
|
||||||
static unsigned int xfrm_state_hashmax __read_mostly = 1 * 1024 * 1024;
|
static unsigned int xfrm_state_hashmax __read_mostly = 1 * 1024 * 1024;
|
||||||
static __read_mostly seqcount_t xfrm_state_hash_generation = SEQCNT_ZERO(xfrm_state_hash_generation);
|
static __read_mostly seqcount_t xfrm_state_hash_generation = SEQCNT_ZERO(xfrm_state_hash_generation);
|
||||||
|
|
||||||
|
static DECLARE_WORK(xfrm_state_gc_work, xfrm_state_gc_task);
|
||||||
|
static HLIST_HEAD(xfrm_state_gc_list);
|
||||||
|
|
||||||
static inline bool xfrm_state_hold_rcu(struct xfrm_state __rcu *x)
|
static inline bool xfrm_state_hold_rcu(struct xfrm_state __rcu *x)
|
||||||
{
|
{
|
||||||
return atomic_inc_not_zero(&x->refcnt);
|
return atomic_inc_not_zero(&x->refcnt);
|
||||||
|
@ -368,13 +373,12 @@ static void xfrm_state_gc_destroy(struct xfrm_state *x)
|
||||||
|
|
||||||
static void xfrm_state_gc_task(struct work_struct *work)
|
static void xfrm_state_gc_task(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct net *net = container_of(work, struct net, xfrm.state_gc_work);
|
|
||||||
struct xfrm_state *x;
|
struct xfrm_state *x;
|
||||||
struct hlist_node *tmp;
|
struct hlist_node *tmp;
|
||||||
struct hlist_head gc_list;
|
struct hlist_head gc_list;
|
||||||
|
|
||||||
spin_lock_bh(&xfrm_state_gc_lock);
|
spin_lock_bh(&xfrm_state_gc_lock);
|
||||||
hlist_move_list(&net->xfrm.state_gc_list, &gc_list);
|
hlist_move_list(&xfrm_state_gc_list, &gc_list);
|
||||||
spin_unlock_bh(&xfrm_state_gc_lock);
|
spin_unlock_bh(&xfrm_state_gc_lock);
|
||||||
|
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
|
@ -515,14 +519,12 @@ EXPORT_SYMBOL(xfrm_state_alloc);
|
||||||
|
|
||||||
void __xfrm_state_destroy(struct xfrm_state *x)
|
void __xfrm_state_destroy(struct xfrm_state *x)
|
||||||
{
|
{
|
||||||
struct net *net = xs_net(x);
|
|
||||||
|
|
||||||
WARN_ON(x->km.state != XFRM_STATE_DEAD);
|
WARN_ON(x->km.state != XFRM_STATE_DEAD);
|
||||||
|
|
||||||
spin_lock_bh(&xfrm_state_gc_lock);
|
spin_lock_bh(&xfrm_state_gc_lock);
|
||||||
hlist_add_head(&x->gclist, &net->xfrm.state_gc_list);
|
hlist_add_head(&x->gclist, &xfrm_state_gc_list);
|
||||||
spin_unlock_bh(&xfrm_state_gc_lock);
|
spin_unlock_bh(&xfrm_state_gc_lock);
|
||||||
schedule_work(&net->xfrm.state_gc_work);
|
schedule_work(&xfrm_state_gc_work);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__xfrm_state_destroy);
|
EXPORT_SYMBOL(__xfrm_state_destroy);
|
||||||
|
|
||||||
|
@ -2134,8 +2136,6 @@ int __net_init xfrm_state_init(struct net *net)
|
||||||
|
|
||||||
net->xfrm.state_num = 0;
|
net->xfrm.state_num = 0;
|
||||||
INIT_WORK(&net->xfrm.state_hash_work, xfrm_hash_resize);
|
INIT_WORK(&net->xfrm.state_hash_work, xfrm_hash_resize);
|
||||||
INIT_HLIST_HEAD(&net->xfrm.state_gc_list);
|
|
||||||
INIT_WORK(&net->xfrm.state_gc_work, xfrm_state_gc_task);
|
|
||||||
spin_lock_init(&net->xfrm.xfrm_state_lock);
|
spin_lock_init(&net->xfrm.xfrm_state_lock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -2153,7 +2153,7 @@ void xfrm_state_fini(struct net *net)
|
||||||
|
|
||||||
flush_work(&net->xfrm.state_hash_work);
|
flush_work(&net->xfrm.state_hash_work);
|
||||||
xfrm_state_flush(net, IPSEC_PROTO_ANY, false);
|
xfrm_state_flush(net, IPSEC_PROTO_ANY, false);
|
||||||
flush_work(&net->xfrm.state_gc_work);
|
flush_work(&xfrm_state_gc_work);
|
||||||
|
|
||||||
WARN_ON(!list_empty(&net->xfrm.state_all));
|
WARN_ON(!list_empty(&net->xfrm.state_all));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue