@@ -224,6 +224,68 @@ void mlx5e_remove_sqs_fwd_rules(struct mlx5e_priv *priv)
224
224
mlx5_eswitch_sqs2vport_stop (esw , rep );
225
225
}
226
226
227
+ static const struct rhashtable_params mlx5e_neigh_ht_params = {
228
+ .head_offset = offsetof(struct mlx5e_neigh_hash_entry , rhash_node ),
229
+ .key_offset = offsetof(struct mlx5e_neigh_hash_entry , m_neigh ),
230
+ .key_len = sizeof (struct mlx5e_neigh ),
231
+ .automatic_shrinking = true,
232
+ };
233
+
234
+ static int mlx5e_rep_neigh_init (struct mlx5e_rep_priv * rpriv )
235
+ {
236
+ struct mlx5e_neigh_update_table * neigh_update = & rpriv -> neigh_update ;
237
+
238
+ INIT_LIST_HEAD (& neigh_update -> neigh_list );
239
+ return rhashtable_init (& neigh_update -> neigh_ht , & mlx5e_neigh_ht_params );
240
+ }
241
+
242
+ static void mlx5e_rep_neigh_cleanup (struct mlx5e_rep_priv * rpriv )
243
+ {
244
+ struct mlx5e_neigh_update_table * neigh_update = & rpriv -> neigh_update ;
245
+
246
+ rhashtable_destroy (& neigh_update -> neigh_ht );
247
+ }
248
+
249
+ static int mlx5e_rep_neigh_entry_insert (struct mlx5e_priv * priv ,
250
+ struct mlx5e_neigh_hash_entry * nhe )
251
+ {
252
+ struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
253
+ int err ;
254
+
255
+ err = rhashtable_insert_fast (& rpriv -> neigh_update .neigh_ht ,
256
+ & nhe -> rhash_node ,
257
+ mlx5e_neigh_ht_params );
258
+ if (err )
259
+ return err ;
260
+
261
+ list_add (& nhe -> neigh_list , & rpriv -> neigh_update .neigh_list );
262
+
263
+ return err ;
264
+ }
265
+
266
+ static void mlx5e_rep_neigh_entry_remove (struct mlx5e_priv * priv ,
267
+ struct mlx5e_neigh_hash_entry * nhe )
268
+ {
269
+ struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
270
+
271
+ list_del (& nhe -> neigh_list );
272
+
273
+ rhashtable_remove_fast (& rpriv -> neigh_update .neigh_ht ,
274
+ & nhe -> rhash_node ,
275
+ mlx5e_neigh_ht_params );
276
+ }
277
+
278
+ static struct mlx5e_neigh_hash_entry *
279
+ mlx5e_rep_neigh_entry_lookup (struct mlx5e_priv * priv ,
280
+ struct mlx5e_neigh * m_neigh )
281
+ {
282
+ struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
283
+ struct mlx5e_neigh_update_table * neigh_update = & rpriv -> neigh_update ;
284
+
285
+ return rhashtable_lookup_fast (& neigh_update -> neigh_ht , m_neigh ,
286
+ mlx5e_neigh_ht_params );
287
+ }
288
+
227
289
static int mlx5e_rep_open (struct net_device * dev )
228
290
{
229
291
struct mlx5e_priv * priv = netdev_priv (dev );
@@ -540,26 +602,42 @@ static struct mlx5e_profile mlx5e_rep_profile = {
540
602
static int
541
603
mlx5e_nic_rep_load (struct mlx5_eswitch * esw , struct mlx5_eswitch_rep * rep )
542
604
{
543
- struct net_device * netdev = rep -> netdev ;
544
- struct mlx5e_priv * priv = netdev_priv (netdev );
605
+ struct mlx5e_priv * priv = netdev_priv (rep -> netdev );
606
+ struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
607
+
608
+ int err ;
609
+
610
+ if (test_bit (MLX5E_STATE_OPENED , & priv -> state )) {
611
+ err = mlx5e_add_sqs_fwd_rules (priv );
612
+ if (err )
613
+ return err ;
614
+ }
615
+
616
+ err = mlx5e_rep_neigh_init (rpriv );
617
+ if (err )
618
+ goto err_remove_sqs ;
545
619
546
- if (test_bit (MLX5E_STATE_OPENED , & priv -> state ))
547
- return mlx5e_add_sqs_fwd_rules (priv );
548
620
return 0 ;
621
+
622
+ err_remove_sqs :
623
+ mlx5e_remove_sqs_fwd_rules (priv );
624
+ return err ;
549
625
}
550
626
551
627
static void
552
628
mlx5e_nic_rep_unload (struct mlx5_eswitch * esw , struct mlx5_eswitch_rep * rep )
553
629
{
554
- struct net_device * netdev = rep -> netdev ;
555
- struct mlx5e_priv * priv = netdev_priv ( netdev ) ;
630
+ struct mlx5e_priv * priv = netdev_priv ( rep -> netdev ) ;
631
+ struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
556
632
557
633
if (test_bit (MLX5E_STATE_OPENED , & priv -> state ))
558
634
mlx5e_remove_sqs_fwd_rules (priv );
559
635
560
636
/* clean (and re-init) existing uplink offloaded TC rules */
561
637
mlx5e_tc_cleanup (priv );
562
638
mlx5e_tc_init (priv );
639
+
640
+ mlx5e_rep_neigh_cleanup (rpriv );
563
641
}
564
642
565
643
static int
@@ -591,15 +669,25 @@ mlx5e_vport_rep_load(struct mlx5_eswitch *esw, struct mlx5_eswitch_rep *rep)
591
669
goto err_destroy_netdev ;
592
670
}
593
671
672
+ err = mlx5e_rep_neigh_init (rpriv );
673
+ if (err ) {
674
+ pr_warn ("Failed to initialized neighbours handling for vport %d\n" ,
675
+ rep -> vport );
676
+ goto err_detach_netdev ;
677
+ }
678
+
594
679
err = register_netdev (netdev );
595
680
if (err ) {
596
681
pr_warn ("Failed to register representor netdev for vport %d\n" ,
597
682
rep -> vport );
598
- goto err_detach_netdev ;
683
+ goto err_neigh_cleanup ;
599
684
}
600
685
601
686
return 0 ;
602
687
688
+ err_neigh_cleanup :
689
+ mlx5e_rep_neigh_cleanup (rpriv );
690
+
603
691
err_detach_netdev :
604
692
mlx5e_detach_netdev (netdev_priv (netdev ));
605
693
@@ -615,9 +703,12 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch *esw, struct mlx5_eswitch_rep *rep)
615
703
{
616
704
struct net_device * netdev = rep -> netdev ;
617
705
struct mlx5e_priv * priv = netdev_priv (netdev );
706
+ struct mlx5e_rep_priv * rpriv = priv -> ppriv ;
618
707
void * ppriv = priv -> ppriv ;
619
708
620
- unregister_netdev (netdev );
709
+ unregister_netdev (rep -> netdev );
710
+
711
+ mlx5e_rep_neigh_cleanup (rpriv );
621
712
mlx5e_detach_netdev (priv );
622
713
mlx5e_destroy_netdev (priv );
623
714
kfree (ppriv ); /* mlx5e_rep_priv */
0 commit comments