Skip to content

Commit

Permalink
hv_netvsc: Fix race condition on Multi-Send Data field
Browse files Browse the repository at this point in the history
In commit 2a04ae8 ("hv_netvsc: remove locking in netvsc_send()"), the
locking for MSD (Multi-Send Data) field was removed. This could cause a
race condition between RNDIS control messages and data packets processing,
because these two types of traffic are not synchronized.
This patch fixes this issue by sending control messages out directly
without reading MSD field.

Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Haiyang Zhang authored and David S. Miller committed Dec 14, 2015
1 parent abe492b commit cf8190e
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions drivers/net/hyperv/netvsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,14 @@ int netvsc_send(struct hv_device *device,
packet->send_buf_index = NETVSC_INVALID_INDEX;
packet->cp_partial = false;

/* Send control message directly without accessing msd (Multi-Send
* Data) field which may be changed during data packet processing.
*/
if (!skb) {
cur_send = packet;
goto send_now;
}

msdp = &net_device->msd[q_idx];

/* batch packets in send buffer if possible */
Expand Down Expand Up @@ -939,6 +947,7 @@ int netvsc_send(struct hv_device *device,
}
}

send_now:
if (cur_send)
ret = netvsc_send_pkt(cur_send, net_device, pb, skb);

Expand Down

0 comments on commit cf8190e

Please sign in to comment.