xfrm: add rcu grace period in xfrm_policy_destroy()
We will soon switch sk->sk_policy[] to RCU protection, as SYNACK packets are sent while listener socket is not locked. This patch simply adds RCU grace period before struct xfrm_policy freeing, and the corresponding rcu_head in struct xfrm_policy. Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b0a8d1a0b6
commit
56f047305d
|
@ -548,6 +548,7 @@ struct xfrm_policy {
|
|||
u16 family;
|
||||
struct xfrm_sec_ctx *security;
|
||||
struct xfrm_tmpl xfrm_vec[XFRM_MAX_DEPTH];
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
static inline struct net *xp_net(const struct xfrm_policy *xp)
|
||||
|
|
|
@ -303,6 +303,14 @@ struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp)
|
|||
}
|
||||
EXPORT_SYMBOL(xfrm_policy_alloc);
|
||||
|
||||
static void xfrm_policy_destroy_rcu(struct rcu_head *head)
|
||||
{
|
||||
struct xfrm_policy *policy = container_of(head, struct xfrm_policy, rcu);
|
||||
|
||||
security_xfrm_policy_free(policy->security);
|
||||
kfree(policy);
|
||||
}
|
||||
|
||||
/* Destroy xfrm_policy: descendant resources must be released to this moment. */
|
||||
|
||||
void xfrm_policy_destroy(struct xfrm_policy *policy)
|
||||
|
@ -312,8 +320,7 @@ void xfrm_policy_destroy(struct xfrm_policy *policy)
|
|||
if (del_timer(&policy->timer) || del_timer(&policy->polq.hold_timer))
|
||||
BUG();
|
||||
|
||||
security_xfrm_policy_free(policy->security);
|
||||
kfree(policy);
|
||||
call_rcu(&policy->rcu, xfrm_policy_destroy_rcu);
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_policy_destroy);
|
||||
|
||||
|
|
Loading…
Reference in New Issue