@@ -178,7 +178,10 @@ struct xfrm_state {
178
178
struct hlist_node gclist ;
179
179
struct hlist_node bydst ;
180
180
};
181
- struct hlist_node bysrc ;
181
+ union {
182
+ struct hlist_node dev_gclist ;
183
+ struct hlist_node bysrc ;
184
+ };
182
185
struct hlist_node byspi ;
183
186
struct hlist_node byseq ;
184
187
@@ -1592,7 +1595,7 @@ void xfrm_state_update_stats(struct net *net);
1592
1595
static inline void xfrm_dev_state_update_stats (struct xfrm_state * x )
1593
1596
{
1594
1597
struct xfrm_dev_offload * xdo = & x -> xso ;
1595
- struct net_device * dev = xdo -> dev ;
1598
+ struct net_device * dev = READ_ONCE ( xdo -> dev ) ;
1596
1599
1597
1600
if (dev && dev -> xfrmdev_ops &&
1598
1601
dev -> xfrmdev_ops -> xdo_dev_state_update_stats )
@@ -1950,13 +1953,16 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp,
1950
1953
struct xfrm_user_offload * xuo , u8 dir ,
1951
1954
struct netlink_ext_ack * extack );
1952
1955
bool xfrm_dev_offload_ok (struct sk_buff * skb , struct xfrm_state * x );
1956
+ void xfrm_dev_state_delete (struct xfrm_state * x );
1957
+ void xfrm_dev_state_free (struct xfrm_state * x );
1953
1958
1954
1959
static inline void xfrm_dev_state_advance_esn (struct xfrm_state * x )
1955
1960
{
1956
1961
struct xfrm_dev_offload * xso = & x -> xso ;
1962
+ struct net_device * dev = READ_ONCE (xso -> dev );
1957
1963
1958
- if (xso -> dev && xso -> dev -> xfrmdev_ops -> xdo_dev_state_advance_esn )
1959
- xso -> dev -> xfrmdev_ops -> xdo_dev_state_advance_esn (x );
1964
+ if (dev && dev -> xfrmdev_ops -> xdo_dev_state_advance_esn )
1965
+ dev -> xfrmdev_ops -> xdo_dev_state_advance_esn (x );
1960
1966
}
1961
1967
1962
1968
static inline bool xfrm_dst_offload_ok (struct dst_entry * dst )
@@ -1977,28 +1983,6 @@ static inline bool xfrm_dst_offload_ok(struct dst_entry *dst)
1977
1983
return false;
1978
1984
}
1979
1985
1980
- static inline void xfrm_dev_state_delete (struct xfrm_state * x )
1981
- {
1982
- struct xfrm_dev_offload * xso = & x -> xso ;
1983
-
1984
- if (xso -> dev )
1985
- xso -> dev -> xfrmdev_ops -> xdo_dev_state_delete (x );
1986
- }
1987
-
1988
- static inline void xfrm_dev_state_free (struct xfrm_state * x )
1989
- {
1990
- struct xfrm_dev_offload * xso = & x -> xso ;
1991
- struct net_device * dev = xso -> dev ;
1992
-
1993
- if (dev && dev -> xfrmdev_ops ) {
1994
- if (dev -> xfrmdev_ops -> xdo_dev_state_free )
1995
- dev -> xfrmdev_ops -> xdo_dev_state_free (x );
1996
- xso -> dev = NULL ;
1997
- xso -> type = XFRM_DEV_OFFLOAD_UNSPECIFIED ;
1998
- netdev_put (dev , & xso -> dev_tracker );
1999
- }
2000
- }
2001
-
2002
1986
static inline void xfrm_dev_policy_delete (struct xfrm_policy * x )
2003
1987
{
2004
1988
struct xfrm_dev_offload * xdo = & x -> xdo ;
0 commit comments