xfrm: remove policy garbage collection
Policies are now properly reference counted and destroyed from all code paths. The delayed gc is just an overhead now and can be removed. Signed-off-by: Timo Teras <timo.teras@iki.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
80c802f307
commit
285ead175c
|
@ -46,9 +46,6 @@ static struct xfrm_policy_afinfo *xfrm_policy_afinfo[NPROTO];
|
||||||
|
|
||||||
static struct kmem_cache *xfrm_dst_cache __read_mostly;
|
static struct kmem_cache *xfrm_dst_cache __read_mostly;
|
||||||
|
|
||||||
static HLIST_HEAD(xfrm_policy_gc_list);
|
|
||||||
static DEFINE_SPINLOCK(xfrm_policy_gc_lock);
|
|
||||||
|
|
||||||
static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family);
|
static struct xfrm_policy_afinfo *xfrm_policy_get_afinfo(unsigned short family);
|
||||||
static void xfrm_policy_put_afinfo(struct xfrm_policy_afinfo *afinfo);
|
static void xfrm_policy_put_afinfo(struct xfrm_policy_afinfo *afinfo);
|
||||||
static void xfrm_init_pmtu(struct dst_entry *dst);
|
static void xfrm_init_pmtu(struct dst_entry *dst);
|
||||||
|
@ -288,32 +285,6 @@ void xfrm_policy_destroy(struct xfrm_policy *policy)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(xfrm_policy_destroy);
|
EXPORT_SYMBOL(xfrm_policy_destroy);
|
||||||
|
|
||||||
static void xfrm_policy_gc_kill(struct xfrm_policy *policy)
|
|
||||||
{
|
|
||||||
atomic_inc(&policy->genid);
|
|
||||||
|
|
||||||
if (del_timer(&policy->timer))
|
|
||||||
atomic_dec(&policy->refcnt);
|
|
||||||
|
|
||||||
xfrm_pol_put(policy);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xfrm_policy_gc_task(struct work_struct *work)
|
|
||||||
{
|
|
||||||
struct xfrm_policy *policy;
|
|
||||||
struct hlist_node *entry, *tmp;
|
|
||||||
struct hlist_head gc_list;
|
|
||||||
|
|
||||||
spin_lock_bh(&xfrm_policy_gc_lock);
|
|
||||||
gc_list.first = xfrm_policy_gc_list.first;
|
|
||||||
INIT_HLIST_HEAD(&xfrm_policy_gc_list);
|
|
||||||
spin_unlock_bh(&xfrm_policy_gc_lock);
|
|
||||||
|
|
||||||
hlist_for_each_entry_safe(policy, entry, tmp, &gc_list, bydst)
|
|
||||||
xfrm_policy_gc_kill(policy);
|
|
||||||
}
|
|
||||||
static DECLARE_WORK(xfrm_policy_gc_work, xfrm_policy_gc_task);
|
|
||||||
|
|
||||||
/* Rule must be locked. Release descentant resources, announce
|
/* Rule must be locked. Release descentant resources, announce
|
||||||
* entry dead. The rule must be unlinked from lists to the moment.
|
* entry dead. The rule must be unlinked from lists to the moment.
|
||||||
*/
|
*/
|
||||||
|
@ -322,11 +293,12 @@ static void xfrm_policy_kill(struct xfrm_policy *policy)
|
||||||
{
|
{
|
||||||
policy->walk.dead = 1;
|
policy->walk.dead = 1;
|
||||||
|
|
||||||
spin_lock_bh(&xfrm_policy_gc_lock);
|
atomic_inc(&policy->genid);
|
||||||
hlist_add_head(&policy->bydst, &xfrm_policy_gc_list);
|
|
||||||
spin_unlock_bh(&xfrm_policy_gc_lock);
|
|
||||||
|
|
||||||
schedule_work(&xfrm_policy_gc_work);
|
if (del_timer(&policy->timer))
|
||||||
|
xfrm_pol_put(policy);
|
||||||
|
|
||||||
|
xfrm_pol_put(policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int xfrm_policy_hashmax __read_mostly = 1 * 1024 * 1024;
|
static unsigned int xfrm_policy_hashmax __read_mostly = 1 * 1024 * 1024;
|
||||||
|
@ -2599,7 +2571,6 @@ static void xfrm_policy_fini(struct net *net)
|
||||||
audit_info.sessionid = -1;
|
audit_info.sessionid = -1;
|
||||||
audit_info.secid = 0;
|
audit_info.secid = 0;
|
||||||
xfrm_policy_flush(net, XFRM_POLICY_TYPE_MAIN, &audit_info);
|
xfrm_policy_flush(net, XFRM_POLICY_TYPE_MAIN, &audit_info);
|
||||||
flush_work(&xfrm_policy_gc_work);
|
|
||||||
|
|
||||||
WARN_ON(!list_empty(&net->xfrm.policy_all));
|
WARN_ON(!list_empty(&net->xfrm.policy_all));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue