@@ -1485,21 +1485,18 @@ static enum skb_drop_reason vxlan_snoop(struct net_device *dev,
1485
1485
1486
1486
static bool __vxlan_sock_release_prep (struct vxlan_sock * vs )
1487
1487
{
1488
- struct vxlan_net * vn ;
1488
+ ASSERT_RTNL () ;
1489
1489
1490
1490
if (!vs )
1491
1491
return false;
1492
1492
if (!refcount_dec_and_test (& vs -> refcnt ))
1493
1493
return false;
1494
1494
1495
- vn = net_generic (sock_net (vs -> sock -> sk ), vxlan_net_id );
1496
- spin_lock (& vn -> sock_lock );
1497
1495
hlist_del_rcu (& vs -> hlist );
1498
1496
udp_tunnel_notify_del_rx_port (vs -> sock ,
1499
1497
(vs -> flags & VXLAN_F_GPE ) ?
1500
1498
UDP_TUNNEL_TYPE_VXLAN_GPE :
1501
1499
UDP_TUNNEL_TYPE_VXLAN );
1502
- spin_unlock (& vn -> sock_lock );
1503
1500
1504
1501
return true;
1505
1502
}
@@ -2857,26 +2854,23 @@ static void vxlan_cleanup(struct timer_list *t)
2857
2854
2858
2855
static void vxlan_vs_del_dev (struct vxlan_dev * vxlan )
2859
2856
{
2860
- struct vxlan_net * vn = net_generic ( vxlan -> net , vxlan_net_id );
2857
+ ASSERT_RTNL ( );
2861
2858
2862
- spin_lock (& vn -> sock_lock );
2863
2859
hlist_del_init_rcu (& vxlan -> hlist4 .hlist );
2864
2860
#if IS_ENABLED (CONFIG_IPV6 )
2865
2861
hlist_del_init_rcu (& vxlan -> hlist6 .hlist );
2866
2862
#endif
2867
- spin_unlock (& vn -> sock_lock );
2868
2863
}
2869
2864
2870
2865
static void vxlan_vs_add_dev (struct vxlan_sock * vs , struct vxlan_dev * vxlan ,
2871
2866
struct vxlan_dev_node * node )
2872
2867
{
2873
- struct vxlan_net * vn = net_generic (vxlan -> net , vxlan_net_id );
2874
2868
__be32 vni = vxlan -> default_dst .remote_vni ;
2875
2869
2870
+ ASSERT_RTNL ();
2871
+
2876
2872
node -> vxlan = vxlan ;
2877
- spin_lock (& vn -> sock_lock );
2878
2873
hlist_add_head_rcu (& node -> hlist , vni_head (vs , vni ));
2879
- spin_unlock (& vn -> sock_lock );
2880
2874
}
2881
2875
2882
2876
/* Setup stats when device is created */
@@ -3301,9 +3295,10 @@ static void vxlan_offload_rx_ports(struct net_device *dev, bool push)
3301
3295
struct vxlan_net * vn = net_generic (net , vxlan_net_id );
3302
3296
unsigned int i ;
3303
3297
3304
- spin_lock (& vn -> sock_lock );
3298
+ ASSERT_RTNL ();
3299
+
3305
3300
for (i = 0 ; i < PORT_HASH_SIZE ; ++ i ) {
3306
- hlist_for_each_entry_rcu (vs , & vn -> sock_list [i ], hlist ) {
3301
+ hlist_for_each_entry (vs , & vn -> sock_list [i ], hlist ) {
3307
3302
unsigned short type ;
3308
3303
3309
3304
if (vs -> flags & VXLAN_F_GPE )
@@ -3317,7 +3312,6 @@ static void vxlan_offload_rx_ports(struct net_device *dev, bool push)
3317
3312
udp_tunnel_drop_rx_port (dev , vs -> sock , type );
3318
3313
}
3319
3314
}
3320
- spin_unlock (& vn -> sock_lock );
3321
3315
}
3322
3316
3323
3317
/* Initialize the device structure. */
@@ -3548,12 +3542,13 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6,
3548
3542
__be16 port , u32 flags ,
3549
3543
int ifindex )
3550
3544
{
3551
- struct vxlan_net * vn = net_generic (net , vxlan_net_id );
3552
3545
struct vxlan_sock * vs ;
3553
3546
struct socket * sock ;
3554
3547
unsigned int h ;
3555
3548
struct udp_tunnel_sock_cfg tunnel_cfg ;
3556
3549
3550
+ ASSERT_RTNL ();
3551
+
3557
3552
vs = kzalloc (sizeof (* vs ), GFP_KERNEL );
3558
3553
if (!vs )
3559
3554
return ERR_PTR (- ENOMEM );
@@ -3571,13 +3566,11 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6,
3571
3566
refcount_set (& vs -> refcnt , 1 );
3572
3567
vs -> flags = (flags & VXLAN_F_RCV_FLAGS );
3573
3568
3574
- spin_lock (& vn -> sock_lock );
3575
3569
hlist_add_head_rcu (& vs -> hlist , vs_head (net , port ));
3576
3570
udp_tunnel_notify_add_rx_port (sock ,
3577
3571
(vs -> flags & VXLAN_F_GPE ) ?
3578
3572
UDP_TUNNEL_TYPE_VXLAN_GPE :
3579
3573
UDP_TUNNEL_TYPE_VXLAN );
3580
- spin_unlock (& vn -> sock_lock );
3581
3574
3582
3575
/* Mark socket as an encapsulation socket. */
3583
3576
memset (& tunnel_cfg , 0 , sizeof (tunnel_cfg ));
@@ -3601,26 +3594,27 @@ static struct vxlan_sock *vxlan_socket_create(struct net *net, bool ipv6,
3601
3594
3602
3595
static int __vxlan_sock_add (struct vxlan_dev * vxlan , bool ipv6 )
3603
3596
{
3604
- struct vxlan_net * vn = net_generic (vxlan -> net , vxlan_net_id );
3605
3597
bool metadata = vxlan -> cfg .flags & VXLAN_F_COLLECT_METADATA ;
3606
3598
struct vxlan_sock * vs = NULL ;
3607
3599
struct vxlan_dev_node * node ;
3608
3600
int l3mdev_index = 0 ;
3609
3601
3602
+ ASSERT_RTNL ();
3603
+
3610
3604
if (vxlan -> cfg .remote_ifindex )
3611
3605
l3mdev_index = l3mdev_master_upper_ifindex_by_index (
3612
3606
vxlan -> net , vxlan -> cfg .remote_ifindex );
3613
3607
3614
3608
if (!vxlan -> cfg .no_share ) {
3615
- spin_lock ( & vn -> sock_lock );
3609
+ rcu_read_lock ( );
3616
3610
vs = vxlan_find_sock (vxlan -> net , ipv6 ? AF_INET6 : AF_INET ,
3617
3611
vxlan -> cfg .dst_port , vxlan -> cfg .flags ,
3618
3612
l3mdev_index );
3619
3613
if (vs && !refcount_inc_not_zero (& vs -> refcnt )) {
3620
- spin_unlock ( & vn -> sock_lock );
3614
+ rcu_read_unlock ( );
3621
3615
return - EBUSY ;
3622
3616
}
3623
- spin_unlock ( & vn -> sock_lock );
3617
+ rcu_read_unlock ( );
3624
3618
}
3625
3619
if (!vs )
3626
3620
vs = vxlan_socket_create (vxlan -> net , ipv6 ,
@@ -4894,7 +4888,6 @@ static __net_init int vxlan_init_net(struct net *net)
4894
4888
unsigned int h ;
4895
4889
4896
4890
INIT_LIST_HEAD (& vn -> vxlan_list );
4897
- spin_lock_init (& vn -> sock_lock );
4898
4891
vn -> nexthop_notifier_block .notifier_call = vxlan_nexthop_event ;
4899
4892
4900
4893
for (h = 0 ; h < PORT_HASH_SIZE ; ++ h )
0 commit comments