@@ -77,13 +77,13 @@ static int get_route_and_out_devs(struct mlx5e_priv *priv,
7777 return 0 ;
7878}
7979
80- static int mlx5e_route_lookup_ipv4 (struct mlx5e_priv * priv ,
81- struct net_device * mirred_dev ,
82- struct net_device * * out_dev ,
83- struct net_device * * route_dev ,
84- struct flowi4 * fl4 ,
85- struct neighbour * * out_n ,
86- u8 * out_ttl )
80+ static int mlx5e_route_lookup_ipv4_get (struct mlx5e_priv * priv ,
81+ struct net_device * mirred_dev ,
82+ struct net_device * * out_dev ,
83+ struct net_device * * route_dev ,
84+ struct flowi4 * fl4 ,
85+ struct neighbour * * out_n ,
86+ u8 * out_ttl )
8787{
8888 struct neighbour * n ;
8989 struct rtable * rt ;
@@ -117,18 +117,28 @@ static int mlx5e_route_lookup_ipv4(struct mlx5e_priv *priv,
117117 ip_rt_put (rt );
118118 return ret ;
119119 }
120+ dev_hold (* route_dev );
120121
121122 if (!(* out_ttl ))
122123 * out_ttl = ip4_dst_hoplimit (& rt -> dst );
123124 n = dst_neigh_lookup (& rt -> dst , & fl4 -> daddr );
124125 ip_rt_put (rt );
125- if (!n )
126+ if (!n ) {
127+ dev_put (* route_dev );
126128 return - ENOMEM ;
129+ }
127130
128131 * out_n = n ;
129132 return 0 ;
130133}
131134
135+ static void mlx5e_route_lookup_ipv4_put (struct net_device * route_dev ,
136+ struct neighbour * n )
137+ {
138+ neigh_release (n );
139+ dev_put (route_dev );
140+ }
141+
132142static const char * mlx5e_netdev_kind (struct net_device * dev )
133143{
134144 if (dev -> rtnl_link_ops )
@@ -193,8 +203,8 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
193203 fl4 .saddr = tun_key -> u .ipv4 .src ;
194204 ttl = tun_key -> ttl ;
195205
196- err = mlx5e_route_lookup_ipv4 (priv , mirred_dev , & out_dev , & route_dev ,
197- & fl4 , & n , & ttl );
206+ err = mlx5e_route_lookup_ipv4_get (priv , mirred_dev , & out_dev , & route_dev ,
207+ & fl4 , & n , & ttl );
198208 if (err )
199209 return err ;
200210
@@ -223,7 +233,7 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
223233 e -> m_neigh .family = n -> ops -> family ;
224234 memcpy (& e -> m_neigh .dst_ip , n -> primary_key , n -> tbl -> key_len );
225235 e -> out_dev = out_dev ;
226- e -> route_dev = route_dev ;
236+ e -> route_dev_ifindex = route_dev -> ifindex ;
227237
228238 /* It's important to add the neigh to the hash table before checking
229239 * the neigh validity state. So if we'll get a notification, in case the
@@ -278,26 +288,26 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
278288
279289 e -> flags |= MLX5_ENCAP_ENTRY_VALID ;
280290 mlx5e_rep_queue_neigh_stats_work (netdev_priv (out_dev ));
281- neigh_release ( n );
291+ mlx5e_route_lookup_ipv4_put ( route_dev , n );
282292 return err ;
283293
284294destroy_neigh_entry :
285295 mlx5e_rep_encap_entry_detach (netdev_priv (e -> out_dev ), e );
286296free_encap :
287297 kfree (encap_header );
288298release_neigh :
289- neigh_release ( n );
299+ mlx5e_route_lookup_ipv4_put ( route_dev , n );
290300 return err ;
291301}
292302
293303#if IS_ENABLED (CONFIG_INET ) && IS_ENABLED (CONFIG_IPV6 )
294- static int mlx5e_route_lookup_ipv6 (struct mlx5e_priv * priv ,
295- struct net_device * mirred_dev ,
296- struct net_device * * out_dev ,
297- struct net_device * * route_dev ,
298- struct flowi6 * fl6 ,
299- struct neighbour * * out_n ,
300- u8 * out_ttl )
304+ static int mlx5e_route_lookup_ipv6_get (struct mlx5e_priv * priv ,
305+ struct net_device * mirred_dev ,
306+ struct net_device * * out_dev ,
307+ struct net_device * * route_dev ,
308+ struct flowi6 * fl6 ,
309+ struct neighbour * * out_n ,
310+ u8 * out_ttl )
301311{
302312 struct dst_entry * dst ;
303313 struct neighbour * n ;
@@ -318,15 +328,25 @@ static int mlx5e_route_lookup_ipv6(struct mlx5e_priv *priv,
318328 return ret ;
319329 }
320330
331+ dev_hold (* route_dev );
321332 n = dst_neigh_lookup (dst , & fl6 -> daddr );
322333 dst_release (dst );
323- if (!n )
334+ if (!n ) {
335+ dev_put (* route_dev );
324336 return - ENOMEM ;
337+ }
325338
326339 * out_n = n ;
327340 return 0 ;
328341}
329342
343+ static void mlx5e_route_lookup_ipv6_put (struct net_device * route_dev ,
344+ struct neighbour * n )
345+ {
346+ neigh_release (n );
347+ dev_put (route_dev );
348+ }
349+
330350int mlx5e_tc_tun_create_header_ipv6 (struct mlx5e_priv * priv ,
331351 struct net_device * mirred_dev ,
332352 struct mlx5e_encap_entry * e )
@@ -348,8 +368,8 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
348368 fl6 .daddr = tun_key -> u .ipv6 .dst ;
349369 fl6 .saddr = tun_key -> u .ipv6 .src ;
350370
351- err = mlx5e_route_lookup_ipv6 (priv , mirred_dev , & out_dev , & route_dev ,
352- & fl6 , & n , & ttl );
371+ err = mlx5e_route_lookup_ipv6_get (priv , mirred_dev , & out_dev , & route_dev ,
372+ & fl6 , & n , & ttl );
353373 if (err )
354374 return err ;
355375
@@ -378,7 +398,7 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
378398 e -> m_neigh .family = n -> ops -> family ;
379399 memcpy (& e -> m_neigh .dst_ip , n -> primary_key , n -> tbl -> key_len );
380400 e -> out_dev = out_dev ;
381- e -> route_dev = route_dev ;
401+ e -> route_dev_ifindex = route_dev -> ifindex ;
382402
383403 /* It's importent to add the neigh to the hash table before checking
384404 * the neigh validity state. So if we'll get a notification, in case the
@@ -433,15 +453,15 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
433453
434454 e -> flags |= MLX5_ENCAP_ENTRY_VALID ;
435455 mlx5e_rep_queue_neigh_stats_work (netdev_priv (out_dev ));
436- neigh_release ( n );
456+ mlx5e_route_lookup_ipv6_put ( route_dev , n );
437457 return err ;
438458
439459destroy_neigh_entry :
440460 mlx5e_rep_encap_entry_detach (netdev_priv (e -> out_dev ), e );
441461free_encap :
442462 kfree (encap_header );
443463release_neigh :
444- neigh_release ( n );
464+ mlx5e_route_lookup_ipv6_put ( route_dev , n );
445465 return err ;
446466}
447467#endif
0 commit comments