@@ -396,18 +396,15 @@ static void __vrf_insert_slave(struct slave_queue *queue, struct slave *slave)
396
396
397
397
static int do_vrf_add_slave (struct net_device * dev , struct net_device * port_dev )
398
398
{
399
- struct net_vrf_dev * vrf_ptr = kmalloc (sizeof (* vrf_ptr ), GFP_KERNEL );
400
399
struct slave * slave = kzalloc (sizeof (* slave ), GFP_KERNEL );
401
400
struct net_vrf * vrf = netdev_priv (dev );
402
401
struct slave_queue * queue = & vrf -> queue ;
403
402
int ret = - ENOMEM ;
404
403
405
- if (!slave || ! vrf_ptr )
404
+ if (!slave )
406
405
goto out_fail ;
407
406
408
407
slave -> dev = port_dev ;
409
- vrf_ptr -> ifindex = dev -> ifindex ;
410
- vrf_ptr -> tb_id = vrf -> tb_id ;
411
408
412
409
/* register the packet handler for slave ports */
413
410
ret = netdev_rx_handler_register (port_dev , vrf_handle_frame , dev );
@@ -424,15 +421,13 @@ static int do_vrf_add_slave(struct net_device *dev, struct net_device *port_dev)
424
421
425
422
port_dev -> flags |= IFF_SLAVE ;
426
423
__vrf_insert_slave (queue , slave );
427
- rcu_assign_pointer (port_dev -> vrf_ptr , vrf_ptr );
428
424
cycle_netdev (port_dev );
429
425
430
426
return 0 ;
431
427
432
428
out_unregister :
433
429
netdev_rx_handler_unregister (port_dev );
434
430
out_fail :
435
- kfree (vrf_ptr );
436
431
kfree (slave );
437
432
return ret ;
438
433
}
@@ -448,21 +443,15 @@ static int vrf_add_slave(struct net_device *dev, struct net_device *port_dev)
448
443
/* inverse of do_vrf_add_slave */
449
444
static int do_vrf_del_slave (struct net_device * dev , struct net_device * port_dev )
450
445
{
451
- struct net_vrf_dev * vrf_ptr = rtnl_dereference (port_dev -> vrf_ptr );
452
446
struct net_vrf * vrf = netdev_priv (dev );
453
447
struct slave_queue * queue = & vrf -> queue ;
454
448
struct slave * slave ;
455
449
456
- RCU_INIT_POINTER (port_dev -> vrf_ptr , NULL );
457
-
458
450
netdev_upper_dev_unlink (port_dev , dev );
459
451
port_dev -> flags &= ~IFF_SLAVE ;
460
452
461
453
netdev_rx_handler_unregister (port_dev );
462
454
463
- /* after netdev_rx_handler_unregister for synchronize_rcu */
464
- kfree (vrf_ptr );
465
-
466
455
cycle_netdev (port_dev );
467
456
468
457
slave = __vrf_find_slave_dev (queue , port_dev );
@@ -601,18 +590,13 @@ static int vrf_validate(struct nlattr *tb[], struct nlattr *data[])
601
590
602
591
static void vrf_dellink (struct net_device * dev , struct list_head * head )
603
592
{
604
- struct net_vrf_dev * vrf_ptr = rtnl_dereference (dev -> vrf_ptr );
605
-
606
- RCU_INIT_POINTER (dev -> vrf_ptr , NULL );
607
- kfree_rcu (vrf_ptr , rcu );
608
593
unregister_netdevice_queue (dev , head );
609
594
}
610
595
611
596
static int vrf_newlink (struct net * src_net , struct net_device * dev ,
612
597
struct nlattr * tb [], struct nlattr * data [])
613
598
{
614
599
struct net_vrf * vrf = netdev_priv (dev );
615
- struct net_vrf_dev * vrf_ptr ;
616
600
int err ;
617
601
618
602
if (!data || !data [IFLA_VRF_TABLE ])
@@ -622,24 +606,13 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev,
622
606
623
607
dev -> priv_flags |= IFF_L3MDEV_MASTER ;
624
608
625
- err = - ENOMEM ;
626
- vrf_ptr = kmalloc (sizeof (* dev -> vrf_ptr ), GFP_KERNEL );
627
- if (!vrf_ptr )
628
- goto out_fail ;
629
-
630
- vrf_ptr -> ifindex = dev -> ifindex ;
631
- vrf_ptr -> tb_id = vrf -> tb_id ;
632
-
633
609
err = register_netdevice (dev );
634
610
if (err < 0 )
635
611
goto out_fail ;
636
612
637
- rcu_assign_pointer (dev -> vrf_ptr , vrf_ptr );
638
-
639
613
return 0 ;
640
614
641
615
out_fail :
642
- kfree (vrf_ptr );
643
616
free_netdev (dev );
644
617
return err ;
645
618
}
@@ -683,10 +656,9 @@ static int vrf_device_event(struct notifier_block *unused,
683
656
684
657
/* only care about unregister events to drop slave references */
685
658
if (event == NETDEV_UNREGISTER ) {
686
- struct net_vrf_dev * vrf_ptr = rtnl_dereference (dev -> vrf_ptr );
687
659
struct net_device * vrf_dev ;
688
660
689
- if (! vrf_ptr || netif_is_l3_master (dev ))
661
+ if (netif_is_l3_master (dev ))
690
662
goto out ;
691
663
692
664
vrf_dev = netdev_master_upper_dev_get (dev );
0 commit comments