35
35
#include <linux/slab.h>
36
36
#include <linux/rtnetlink.h>
37
37
#include <linux/netpoll.h>
38
+ #include <linux/reciprocal_div.h>
38
39
39
40
#include <net/arp.h>
40
41
#include <net/route.h>
54
55
#define LINKCHANGE_INT (2 * HZ)
55
56
#define VF_TAKEOVER_INT (HZ / 10)
56
57
57
- static int ring_size = 128 ;
58
- module_param (ring_size , int , S_IRUGO );
58
+ static unsigned int ring_size __ro_after_init = 128 ;
59
+ module_param (ring_size , uint , S_IRUGO );
59
60
MODULE_PARM_DESC (ring_size , "Ring buffer size (# of pages)" );
61
+ unsigned int netvsc_ring_bytes __ro_after_init ;
62
+ struct reciprocal_value netvsc_ring_reciprocal __ro_after_init ;
60
63
61
64
static const u32 default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE |
62
65
NETIF_MSG_LINK | NETIF_MSG_IFUP |
@@ -174,25 +177,23 @@ static int netvsc_close(struct net_device *net)
174
177
return ret ;
175
178
}
176
179
177
- static void * init_ppi_data (struct rndis_message * msg , u32 ppi_size ,
178
- int pkt_type )
180
+ static inline void * init_ppi_data (struct rndis_message * msg ,
181
+ u32 ppi_size , u32 pkt_type )
179
182
{
180
- struct rndis_packet * rndis_pkt ;
183
+ struct rndis_packet * rndis_pkt = & msg -> msg . pkt ;
181
184
struct rndis_per_packet_info * ppi ;
182
185
183
- rndis_pkt = & msg -> msg .pkt ;
184
186
rndis_pkt -> data_offset += ppi_size ;
185
-
186
- ppi = (struct rndis_per_packet_info * )((void * )rndis_pkt +
187
- rndis_pkt -> per_pkt_info_offset + rndis_pkt -> per_pkt_info_len );
187
+ ppi = (void * )rndis_pkt + rndis_pkt -> per_pkt_info_offset
188
+ + rndis_pkt -> per_pkt_info_len ;
188
189
189
190
ppi -> size = ppi_size ;
190
191
ppi -> type = pkt_type ;
191
192
ppi -> ppi_offset = sizeof (struct rndis_per_packet_info );
192
193
193
194
rndis_pkt -> per_pkt_info_len += ppi_size ;
194
195
195
- return ppi ;
196
+ return ppi + 1 ;
196
197
}
197
198
198
199
/* Azure hosts don't support non-TCP port numbers in hashing for fragmented
@@ -469,10 +470,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
469
470
int ret ;
470
471
unsigned int num_data_pgs ;
471
472
struct rndis_message * rndis_msg ;
472
- struct rndis_packet * rndis_pkt ;
473
473
struct net_device * vf_netdev ;
474
474
u32 rndis_msg_size ;
475
- struct rndis_per_packet_info * ppi ;
476
475
u32 hash ;
477
476
struct hv_page_buffer pb [MAX_PAGE_BUFFER_COUNT ];
478
477
@@ -527,34 +526,36 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
527
526
528
527
rndis_msg = (struct rndis_message * )skb -> head ;
529
528
530
- memset (rndis_msg , 0 , RNDIS_AND_PPI_SIZE );
531
-
532
529
/* Add the rndis header */
533
530
rndis_msg -> ndis_msg_type = RNDIS_MSG_PACKET ;
534
531
rndis_msg -> msg_len = packet -> total_data_buflen ;
535
- rndis_pkt = & rndis_msg -> msg .pkt ;
536
- rndis_pkt -> data_offset = sizeof (struct rndis_packet );
537
- rndis_pkt -> data_len = packet -> total_data_buflen ;
538
- rndis_pkt -> per_pkt_info_offset = sizeof (struct rndis_packet );
532
+
533
+ rndis_msg -> msg .pkt = (struct rndis_packet ) {
534
+ .data_offset = sizeof (struct rndis_packet ),
535
+ .data_len = packet -> total_data_buflen ,
536
+ .per_pkt_info_offset = sizeof (struct rndis_packet ),
537
+ };
539
538
540
539
rndis_msg_size = RNDIS_MESSAGE_SIZE (struct rndis_packet );
541
540
542
541
hash = skb_get_hash_raw (skb );
543
542
if (hash != 0 && net -> real_num_tx_queues > 1 ) {
543
+ u32 * hash_info ;
544
+
544
545
rndis_msg_size += NDIS_HASH_PPI_SIZE ;
545
- ppi = init_ppi_data (rndis_msg , NDIS_HASH_PPI_SIZE ,
546
- NBL_HASH_VALUE );
547
- * ( u32 * )(( void * ) ppi + ppi -> ppi_offset ) = hash ;
546
+ hash_info = init_ppi_data (rndis_msg , NDIS_HASH_PPI_SIZE ,
547
+ NBL_HASH_VALUE );
548
+ * hash_info = hash ;
548
549
}
549
550
550
551
if (skb_vlan_tag_present (skb )) {
551
552
struct ndis_pkt_8021q_info * vlan ;
552
553
553
554
rndis_msg_size += NDIS_VLAN_PPI_SIZE ;
554
- ppi = init_ppi_data (rndis_msg , NDIS_VLAN_PPI_SIZE ,
555
- IEEE_8021Q_INFO );
555
+ vlan = init_ppi_data (rndis_msg , NDIS_VLAN_PPI_SIZE ,
556
+ IEEE_8021Q_INFO );
556
557
557
- vlan = ( void * ) ppi + ppi -> ppi_offset ;
558
+ vlan -> value = 0 ;
558
559
vlan -> vlanid = skb -> vlan_tci & VLAN_VID_MASK ;
559
560
vlan -> pri = (skb -> vlan_tci & VLAN_PRIO_MASK ) >>
560
561
VLAN_PRIO_SHIFT ;
@@ -564,11 +565,10 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
564
565
struct ndis_tcp_lso_info * lso_info ;
565
566
566
567
rndis_msg_size += NDIS_LSO_PPI_SIZE ;
567
- ppi = init_ppi_data (rndis_msg , NDIS_LSO_PPI_SIZE ,
568
- TCP_LARGESEND_PKTINFO );
569
-
570
- lso_info = (void * )ppi + ppi -> ppi_offset ;
568
+ lso_info = init_ppi_data (rndis_msg , NDIS_LSO_PPI_SIZE ,
569
+ TCP_LARGESEND_PKTINFO );
571
570
571
+ lso_info -> value = 0 ;
572
572
lso_info -> lso_v2_transmit .type = NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE ;
573
573
if (skb -> protocol == htons (ETH_P_IP )) {
574
574
lso_info -> lso_v2_transmit .ip_version =
@@ -593,12 +593,10 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
593
593
struct ndis_tcp_ip_checksum_info * csum_info ;
594
594
595
595
rndis_msg_size += NDIS_CSUM_PPI_SIZE ;
596
- ppi = init_ppi_data (rndis_msg , NDIS_CSUM_PPI_SIZE ,
597
- TCPIP_CHKSUM_PKTINFO );
598
-
599
- csum_info = (struct ndis_tcp_ip_checksum_info * )((void * )ppi +
600
- ppi -> ppi_offset );
596
+ csum_info = init_ppi_data (rndis_msg , NDIS_CSUM_PPI_SIZE ,
597
+ TCPIP_CHKSUM_PKTINFO );
601
598
599
+ csum_info -> value = 0 ;
602
600
csum_info -> transmit .tcp_header_offset = skb_transport_offset (skb );
603
601
604
602
if (skb -> protocol == htons (ETH_P_IP )) {
@@ -860,7 +858,6 @@ static int netvsc_set_channels(struct net_device *net,
860
858
861
859
memset (& device_info , 0 , sizeof (device_info ));
862
860
device_info .num_chn = count ;
863
- device_info .ring_size = ring_size ;
864
861
device_info .send_sections = nvdev -> send_section_cnt ;
865
862
device_info .send_section_size = nvdev -> send_section_size ;
866
863
device_info .recv_sections = nvdev -> recv_section_cnt ;
@@ -975,7 +972,6 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
975
972
rndis_filter_close (nvdev );
976
973
977
974
memset (& device_info , 0 , sizeof (device_info ));
978
- device_info .ring_size = ring_size ;
979
975
device_info .num_chn = nvdev -> num_chn ;
980
976
device_info .send_sections = nvdev -> send_section_cnt ;
981
977
device_info .send_section_size = nvdev -> send_section_size ;
@@ -1539,7 +1535,6 @@ static int netvsc_set_ringparam(struct net_device *ndev,
1539
1535
1540
1536
memset (& device_info , 0 , sizeof (device_info ));
1541
1537
device_info .num_chn = nvdev -> num_chn ;
1542
- device_info .ring_size = ring_size ;
1543
1538
device_info .send_sections = new_tx ;
1544
1539
device_info .send_section_size = nvdev -> send_section_size ;
1545
1540
device_info .recv_sections = new_rx ;
@@ -1995,7 +1990,6 @@ static int netvsc_probe(struct hv_device *dev,
1995
1990
1996
1991
/* Notify the netvsc driver of the new device */
1997
1992
memset (& device_info , 0 , sizeof (device_info ));
1998
- device_info .ring_size = ring_size ;
1999
1993
device_info .num_chn = VRSS_CHANNEL_DEFAULT ;
2000
1994
device_info .send_sections = NETVSC_DEFAULT_TX ;
2001
1995
device_info .send_section_size = NETVSC_SEND_SECTION_SIZE ;
@@ -2158,11 +2152,13 @@ static int __init netvsc_drv_init(void)
2158
2152
2159
2153
if (ring_size < RING_SIZE_MIN ) {
2160
2154
ring_size = RING_SIZE_MIN ;
2161
- pr_info ("Increased ring_size to %d (min allowed)\n" ,
2155
+ pr_info ("Increased ring_size to %u (min allowed)\n" ,
2162
2156
ring_size );
2163
2157
}
2164
- ret = vmbus_driver_register (& netvsc_drv );
2158
+ netvsc_ring_bytes = ring_size * PAGE_SIZE ;
2159
+ netvsc_ring_reciprocal = reciprocal_value (netvsc_ring_bytes );
2165
2160
2161
+ ret = vmbus_driver_register (& netvsc_drv );
2166
2162
if (ret )
2167
2163
return ret ;
2168
2164
0 commit comments