Skip to content

Commit f5a2255

Browse files
shemmingerdavem330
authored andcommitted
hv_netvsc: optimize initialization of RNDIS header
The memset of the whole maximum possible RNDIS header is unnecessary. For the main part of the header use a structure assignment. No need to memset the whole per packet info. Instead rely on caller to set what it wants. Also get rid of cast to void and signed/unsigned conversion. Now return pointer to per packet data (rather than the header) which simplifies use by code setting up the packet data. Signed-off-by: Stephen Hemminger <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a7f99d0 commit f5a2255

File tree

1 file changed

+26
-31
lines changed

1 file changed

+26
-31
lines changed

drivers/net/hyperv/netvsc_drv.c

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -177,25 +177,23 @@ static int netvsc_close(struct net_device *net)
177177
return ret;
178178
}
179179

180-
static void *init_ppi_data(struct rndis_message *msg, u32 ppi_size,
181-
int pkt_type)
180+
static inline void *init_ppi_data(struct rndis_message *msg,
181+
u32 ppi_size, u32 pkt_type)
182182
{
183-
struct rndis_packet *rndis_pkt;
183+
struct rndis_packet *rndis_pkt = &msg->msg.pkt;
184184
struct rndis_per_packet_info *ppi;
185185

186-
rndis_pkt = &msg->msg.pkt;
187186
rndis_pkt->data_offset += ppi_size;
188-
189-
ppi = (struct rndis_per_packet_info *)((void *)rndis_pkt +
190-
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;
191189

192190
ppi->size = ppi_size;
193191
ppi->type = pkt_type;
194192
ppi->ppi_offset = sizeof(struct rndis_per_packet_info);
195193

196194
rndis_pkt->per_pkt_info_len += ppi_size;
197195

198-
return ppi;
196+
return ppi + 1;
199197
}
200198

201199
/* Azure hosts don't support non-TCP port numbers in hashing for fragmented
@@ -472,10 +470,8 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
472470
int ret;
473471
unsigned int num_data_pgs;
474472
struct rndis_message *rndis_msg;
475-
struct rndis_packet *rndis_pkt;
476473
struct net_device *vf_netdev;
477474
u32 rndis_msg_size;
478-
struct rndis_per_packet_info *ppi;
479475
u32 hash;
480476
struct hv_page_buffer pb[MAX_PAGE_BUFFER_COUNT];
481477

@@ -530,34 +526,36 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
530526

531527
rndis_msg = (struct rndis_message *)skb->head;
532528

533-
memset(rndis_msg, 0, RNDIS_AND_PPI_SIZE);
534-
535529
/* Add the rndis header */
536530
rndis_msg->ndis_msg_type = RNDIS_MSG_PACKET;
537531
rndis_msg->msg_len = packet->total_data_buflen;
538-
rndis_pkt = &rndis_msg->msg.pkt;
539-
rndis_pkt->data_offset = sizeof(struct rndis_packet);
540-
rndis_pkt->data_len = packet->total_data_buflen;
541-
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+
};
542538

543539
rndis_msg_size = RNDIS_MESSAGE_SIZE(struct rndis_packet);
544540

545541
hash = skb_get_hash_raw(skb);
546542
if (hash != 0 && net->real_num_tx_queues > 1) {
543+
u32 *hash_info;
544+
547545
rndis_msg_size += NDIS_HASH_PPI_SIZE;
548-
ppi = init_ppi_data(rndis_msg, NDIS_HASH_PPI_SIZE,
549-
NBL_HASH_VALUE);
550-
*(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;
551549
}
552550

553551
if (skb_vlan_tag_present(skb)) {
554552
struct ndis_pkt_8021q_info *vlan;
555553

556554
rndis_msg_size += NDIS_VLAN_PPI_SIZE;
557-
ppi = init_ppi_data(rndis_msg, NDIS_VLAN_PPI_SIZE,
558-
IEEE_8021Q_INFO);
555+
vlan = init_ppi_data(rndis_msg, NDIS_VLAN_PPI_SIZE,
556+
IEEE_8021Q_INFO);
559557

560-
vlan = (void *)ppi + ppi->ppi_offset;
558+
vlan->value = 0;
561559
vlan->vlanid = skb->vlan_tci & VLAN_VID_MASK;
562560
vlan->pri = (skb->vlan_tci & VLAN_PRIO_MASK) >>
563561
VLAN_PRIO_SHIFT;
@@ -567,11 +565,10 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
567565
struct ndis_tcp_lso_info *lso_info;
568566

569567
rndis_msg_size += NDIS_LSO_PPI_SIZE;
570-
ppi = init_ppi_data(rndis_msg, NDIS_LSO_PPI_SIZE,
571-
TCP_LARGESEND_PKTINFO);
572-
573-
lso_info = (void *)ppi + ppi->ppi_offset;
568+
lso_info = init_ppi_data(rndis_msg, NDIS_LSO_PPI_SIZE,
569+
TCP_LARGESEND_PKTINFO);
574570

571+
lso_info->value = 0;
575572
lso_info->lso_v2_transmit.type = NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE;
576573
if (skb->protocol == htons(ETH_P_IP)) {
577574
lso_info->lso_v2_transmit.ip_version =
@@ -596,12 +593,10 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
596593
struct ndis_tcp_ip_checksum_info *csum_info;
597594

598595
rndis_msg_size += NDIS_CSUM_PPI_SIZE;
599-
ppi = init_ppi_data(rndis_msg, NDIS_CSUM_PPI_SIZE,
600-
TCPIP_CHKSUM_PKTINFO);
601-
602-
csum_info = (struct ndis_tcp_ip_checksum_info *)((void *)ppi +
603-
ppi->ppi_offset);
596+
csum_info = init_ppi_data(rndis_msg, NDIS_CSUM_PPI_SIZE,
597+
TCPIP_CHKSUM_PKTINFO);
604598

599+
csum_info->value = 0;
605600
csum_info->transmit.tcp_header_offset = skb_transport_offset(skb);
606601

607602
if (skb->protocol == htons(ETH_P_IP)) {

0 commit comments

Comments
 (0)