mirror of https://gitee.com/openkylin/linux.git
xfrm: state: do not acquire lock in get_mtu helpers
Once flow cache gets removed the mtu initialisation happens for every skb that gets an xfrm attached, so this lock starts to show up in perf. It is not obvious why this lock is required -- the caller holds reference on the state struct, type->destructor is only called from the state gc worker (all state structs on gc list must have refcount 0). xfrm_init_state already has been called (else private data accessed by type->get_mtu() would not be set up). So just remove the lock -- the race on the state (DEAD?) doesn't matter (could change right after dropping the lock too). Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
1365e547c6
commit
b3b73b8e6d
|
@ -2000,16 +2000,13 @@ EXPORT_SYMBOL(xfrm_state_delete_tunnel);
|
||||||
|
|
||||||
int xfrm_state_mtu(struct xfrm_state *x, int mtu)
|
int xfrm_state_mtu(struct xfrm_state *x, int mtu)
|
||||||
{
|
{
|
||||||
int res;
|
const struct xfrm_type *type = READ_ONCE(x->type);
|
||||||
|
|
||||||
spin_lock_bh(&x->lock);
|
|
||||||
if (x->km.state == XFRM_STATE_VALID &&
|
if (x->km.state == XFRM_STATE_VALID &&
|
||||||
x->type && x->type->get_mtu)
|
type && type->get_mtu)
|
||||||
res = x->type->get_mtu(x, mtu);
|
return type->get_mtu(x, mtu);
|
||||||
else
|
|
||||||
res = mtu - x->props.header_len;
|
return mtu - x->props.header_len;
|
||||||
spin_unlock_bh(&x->lock);
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int __xfrm_init_state(struct xfrm_state *x, bool init_replay)
|
int __xfrm_init_state(struct xfrm_state *x, bool init_replay)
|
||||||
|
|
Loading…
Reference in New Issue