@@ -2042,6 +2042,8 @@ static void mlx4_en_free_resources(struct mlx4_en_priv *priv)
2042
2042
if (priv -> tx_cq [t ] && priv -> tx_cq [t ][i ])
2043
2043
mlx4_en_destroy_cq (priv , & priv -> tx_cq [t ][i ]);
2044
2044
}
2045
+ kfree (priv -> tx_ring [t ]);
2046
+ kfree (priv -> tx_cq [t ]);
2045
2047
}
2046
2048
2047
2049
for (i = 0 ; i < priv -> rx_ring_num ; i ++ ) {
@@ -2184,9 +2186,11 @@ static void mlx4_en_update_priv(struct mlx4_en_priv *dst,
2184
2186
2185
2187
int mlx4_en_try_alloc_resources (struct mlx4_en_priv * priv ,
2186
2188
struct mlx4_en_priv * tmp ,
2187
- struct mlx4_en_port_profile * prof )
2189
+ struct mlx4_en_port_profile * prof ,
2190
+ bool carry_xdp_prog )
2188
2191
{
2189
- int t ;
2192
+ struct bpf_prog * xdp_prog ;
2193
+ int i , t ;
2190
2194
2191
2195
mlx4_en_copy_priv (tmp , priv , prof );
2192
2196
@@ -2200,6 +2204,23 @@ int mlx4_en_try_alloc_resources(struct mlx4_en_priv *priv,
2200
2204
}
2201
2205
return - ENOMEM ;
2202
2206
}
2207
+
2208
+ /* All rx_rings has the same xdp_prog. Pick the first one. */
2209
+ xdp_prog = rcu_dereference_protected (
2210
+ priv -> rx_ring [0 ]-> xdp_prog ,
2211
+ lockdep_is_held (& priv -> mdev -> state_lock ));
2212
+
2213
+ if (xdp_prog && carry_xdp_prog ) {
2214
+ xdp_prog = bpf_prog_add (xdp_prog , tmp -> rx_ring_num );
2215
+ if (IS_ERR (xdp_prog )) {
2216
+ mlx4_en_free_resources (tmp );
2217
+ return PTR_ERR (xdp_prog );
2218
+ }
2219
+ for (i = 0 ; i < tmp -> rx_ring_num ; i ++ )
2220
+ rcu_assign_pointer (tmp -> rx_ring [i ]-> xdp_prog ,
2221
+ xdp_prog );
2222
+ }
2223
+
2203
2224
return 0 ;
2204
2225
}
2205
2226
@@ -2214,7 +2235,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
2214
2235
{
2215
2236
struct mlx4_en_priv * priv = netdev_priv (dev );
2216
2237
struct mlx4_en_dev * mdev = priv -> mdev ;
2217
- int t ;
2218
2238
2219
2239
en_dbg (DRV , priv , "Destroying netdev on port:%d\n" , priv -> port );
2220
2240
@@ -2248,11 +2268,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
2248
2268
mlx4_en_free_resources (priv );
2249
2269
mutex_unlock (& mdev -> state_lock );
2250
2270
2251
- for (t = 0 ; t < MLX4_EN_NUM_TX_TYPES ; t ++ ) {
2252
- kfree (priv -> tx_ring [t ]);
2253
- kfree (priv -> tx_cq [t ]);
2254
- }
2255
-
2256
2271
free_netdev (dev );
2257
2272
}
2258
2273
@@ -2755,7 +2770,7 @@ static int mlx4_xdp_set(struct net_device *dev, struct bpf_prog *prog)
2755
2770
en_warn (priv , "Reducing the number of TX rings, to not exceed the max total rings number.\n" );
2756
2771
}
2757
2772
2758
- err = mlx4_en_try_alloc_resources (priv , tmp , & new_prof );
2773
+ err = mlx4_en_try_alloc_resources (priv , tmp , & new_prof , false );
2759
2774
if (err ) {
2760
2775
if (prog )
2761
2776
bpf_prog_sub (prog , priv -> rx_ring_num - 1 );
@@ -3499,7 +3514,7 @@ int mlx4_en_reset_config(struct net_device *dev,
3499
3514
memcpy (& new_prof , priv -> prof , sizeof (struct mlx4_en_port_profile ));
3500
3515
memcpy (& new_prof .hwtstamp_config , & ts_config , sizeof (ts_config ));
3501
3516
3502
- err = mlx4_en_try_alloc_resources (priv , tmp , & new_prof );
3517
+ err = mlx4_en_try_alloc_resources (priv , tmp , & new_prof , true );
3503
3518
if (err )
3504
3519
goto out ;
3505
3520
0 commit comments