|
|
@@ -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);
|
|
|
|