@@ -178,7 +178,10 @@ struct xfrm_state {
178178 struct hlist_node gclist ;
179179 struct hlist_node bydst ;
180180 };
181- struct hlist_node bysrc ;
181+ union {
182+ struct hlist_node dev_gclist ;
183+ struct hlist_node bysrc ;
184+ };
182185 struct hlist_node byspi ;
183186 struct hlist_node byseq ;
184187
@@ -1592,7 +1595,7 @@ void xfrm_state_update_stats(struct net *net);
15921595static inline void xfrm_dev_state_update_stats (struct xfrm_state * x )
15931596{
15941597 struct xfrm_dev_offload * xdo = & x -> xso ;
1595- struct net_device * dev = xdo -> dev ;
1598+ struct net_device * dev = READ_ONCE ( xdo -> dev ) ;
15961599
15971600 if (dev && dev -> xfrmdev_ops &&
15981601 dev -> xfrmdev_ops -> xdo_dev_state_update_stats )
@@ -1950,13 +1953,16 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp,
19501953 struct xfrm_user_offload * xuo , u8 dir ,
19511954 struct netlink_ext_ack * extack );
19521955bool 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 );
19531958
19541959static inline void xfrm_dev_state_advance_esn (struct xfrm_state * x )
19551960{
19561961 struct xfrm_dev_offload * xso = & x -> xso ;
1962+ struct net_device * dev = READ_ONCE (xso -> dev );
19571963
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 );
19601966}
19611967
19621968static 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)
19771983 return false;
19781984}
19791985
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-
20021986static inline void xfrm_dev_policy_delete (struct xfrm_policy * x )
20031987{
20041988 struct xfrm_dev_offload * xdo = & x -> xdo ;
0 commit comments