Skip to content

Commit 89a2aef

Browse files
Jianbo Liuklassert
authored andcommitted
xfrm: call xfrm_dev_policy_delete when kill policy
xfrm_policy_kill() is called at different places to delete xfrm policy. It will call xfrm_pol_put(). But xfrm_dev_policy_delete() is not called to free the policy offloaded to hardware. The three commits cited here are to handle this issue by calling xfrm_dev_policy_delete() outside xfrm_get_policy(). But they didn't cover all the cases. An example, which is not handled for now, is xfrm_policy_insert(). It is called when XFRM_MSG_UPDPOLICY request is received. Old policy is replaced by new one, but the offloaded policy is not deleted, so driver doesn't have the chance to release hardware resources. To resolve this issue for all cases, move xfrm_dev_policy_delete() into xfrm_policy_kill(), so the offloaded policy can be deleted from hardware when it is called, which avoids hardware resources leakage. Fixes: 919e43f ("xfrm: add an interface to offload policy") Fixes: bf06fcf ("xfrm: add missed call to delete offloaded policies") Fixes: 982c3ac ("xfrm: delete offloaded policy") Signed-off-by: Jianbo Liu <[email protected]> Reviewed-by: Cosmin Ratiu <[email protected]> Signed-off-by: Leon Romanovsky <[email protected]> Signed-off-by: Steffen Klassert <[email protected]>
1 parent 9199b91 commit 89a2aef

File tree

2 files changed

+2
-4
lines changed

2 files changed

+2
-4
lines changed

net/xfrm/xfrm_policy.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,8 @@ EXPORT_SYMBOL(xfrm_policy_destroy);
452452

453453
static void xfrm_policy_kill(struct xfrm_policy *policy)
454454
{
455+
xfrm_dev_policy_delete(policy);
456+
455457
write_lock_bh(&policy->lock);
456458
policy->walk.dead = 1;
457459
write_unlock_bh(&policy->lock);
@@ -1850,7 +1852,6 @@ int xfrm_policy_flush(struct net *net, u8 type, bool task_valid)
18501852

18511853
__xfrm_policy_unlink(pol, dir);
18521854
spin_unlock_bh(&net->xfrm.xfrm_policy_lock);
1853-
xfrm_dev_policy_delete(pol);
18541855
cnt++;
18551856
xfrm_audit_policy_delete(pol, 1, task_valid);
18561857
xfrm_policy_kill(pol);
@@ -1891,7 +1892,6 @@ int xfrm_dev_policy_flush(struct net *net, struct net_device *dev,
18911892

18921893
__xfrm_policy_unlink(pol, dir);
18931894
spin_unlock_bh(&net->xfrm.xfrm_policy_lock);
1894-
xfrm_dev_policy_delete(pol);
18951895
cnt++;
18961896
xfrm_audit_policy_delete(pol, 1, task_valid);
18971897
xfrm_policy_kill(pol);
@@ -2342,7 +2342,6 @@ int xfrm_policy_delete(struct xfrm_policy *pol, int dir)
23422342
pol = __xfrm_policy_unlink(pol, dir);
23432343
spin_unlock_bh(&net->xfrm.xfrm_policy_lock);
23442344
if (pol) {
2345-
xfrm_dev_policy_delete(pol);
23462345
xfrm_policy_kill(pol);
23472346
return 0;
23482347
}

net/xfrm/xfrm_user.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2455,7 +2455,6 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
24552455
NETLINK_CB(skb).portid);
24562456
}
24572457
} else {
2458-
xfrm_dev_policy_delete(xp);
24592458
xfrm_audit_policy_delete(xp, err ? 0 : 1, true);
24602459

24612460
if (err != 0)

0 commit comments

Comments
 (0)