mirror of https://gitee.com/openkylin/linux.git
[XFRM]: Purge dst references to deleted SAs passively.
Just let GC and other normal mechanisms take care of getting rid of DST cache references to deleted xfrm_state objects instead of walking all the policy bundles. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c7f5ea3a4d
commit
1c09539975
|
@ -995,7 +995,6 @@ struct xfrm_state * xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
|
||||||
int create, unsigned short family);
|
int create, unsigned short family);
|
||||||
extern void xfrm_policy_flush(u8 type);
|
extern void xfrm_policy_flush(u8 type);
|
||||||
extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
|
extern int xfrm_sk_policy_insert(struct sock *sk, int dir, struct xfrm_policy *pol);
|
||||||
extern int xfrm_flush_bundles(void);
|
|
||||||
extern int xfrm_bundle_ok(struct xfrm_dst *xdst, struct flowi *fl, int family, int strict);
|
extern int xfrm_bundle_ok(struct xfrm_dst *xdst, struct flowi *fl, int family, int strict);
|
||||||
extern void xfrm_init_pmtu(struct dst_entry *dst);
|
extern void xfrm_init_pmtu(struct dst_entry *dst);
|
||||||
|
|
||||||
|
|
|
@ -1472,7 +1472,7 @@ static void __xfrm_garbage_collect(void)
|
||||||
xfrm_prune_bundles(unused_bundle);
|
xfrm_prune_bundles(unused_bundle);
|
||||||
}
|
}
|
||||||
|
|
||||||
int xfrm_flush_bundles(void)
|
static int xfrm_flush_bundles(void)
|
||||||
{
|
{
|
||||||
xfrm_prune_bundles(stale_bundle);
|
xfrm_prune_bundles(stale_bundle);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -256,8 +256,6 @@ static struct work_struct xfrm_state_gc_work;
|
||||||
static HLIST_HEAD(xfrm_state_gc_list);
|
static HLIST_HEAD(xfrm_state_gc_list);
|
||||||
static DEFINE_SPINLOCK(xfrm_state_gc_lock);
|
static DEFINE_SPINLOCK(xfrm_state_gc_lock);
|
||||||
|
|
||||||
static int xfrm_state_gc_flush_bundles;
|
|
||||||
|
|
||||||
int __xfrm_state_delete(struct xfrm_state *x);
|
int __xfrm_state_delete(struct xfrm_state *x);
|
||||||
|
|
||||||
static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family);
|
static struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned short family);
|
||||||
|
@ -293,11 +291,6 @@ static void xfrm_state_gc_task(void *data)
|
||||||
struct hlist_node *entry, *tmp;
|
struct hlist_node *entry, *tmp;
|
||||||
struct hlist_head gc_list;
|
struct hlist_head gc_list;
|
||||||
|
|
||||||
if (xfrm_state_gc_flush_bundles) {
|
|
||||||
xfrm_state_gc_flush_bundles = 0;
|
|
||||||
xfrm_flush_bundles();
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock_bh(&xfrm_state_gc_lock);
|
spin_lock_bh(&xfrm_state_gc_lock);
|
||||||
gc_list.first = xfrm_state_gc_list.first;
|
gc_list.first = xfrm_state_gc_list.first;
|
||||||
INIT_HLIST_HEAD(&xfrm_state_gc_list);
|
INIT_HLIST_HEAD(&xfrm_state_gc_list);
|
||||||
|
@ -454,16 +447,6 @@ int __xfrm_state_delete(struct xfrm_state *x)
|
||||||
if (del_timer(&x->rtimer))
|
if (del_timer(&x->rtimer))
|
||||||
__xfrm_state_put(x);
|
__xfrm_state_put(x);
|
||||||
|
|
||||||
/* The number two in this test is the reference
|
|
||||||
* mentioned in the comment below plus the reference
|
|
||||||
* our caller holds. A larger value means that
|
|
||||||
* there are DSTs attached to this xfrm_state.
|
|
||||||
*/
|
|
||||||
if (atomic_read(&x->refcnt) > 2) {
|
|
||||||
xfrm_state_gc_flush_bundles = 1;
|
|
||||||
schedule_work(&xfrm_state_gc_work);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* All xfrm_state objects are created by xfrm_state_alloc.
|
/* All xfrm_state objects are created by xfrm_state_alloc.
|
||||||
* The xfrm_state_alloc call gives a reference, and that
|
* The xfrm_state_alloc call gives a reference, and that
|
||||||
* is what we are dropping here.
|
* is what we are dropping here.
|
||||||
|
|
Loading…
Reference in New Issue