Commit cf8190e4 authored by Haiyang Zhang's avatar Haiyang Zhang Committed by David S. Miller

hv_netvsc: Fix race condition on Multi-Send Data field

In commit 2a04ae8a ("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: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent abe492b4
...@@ -867,6 +867,14 @@ int netvsc_send(struct hv_device *device, ...@@ -867,6 +867,14 @@ int netvsc_send(struct hv_device *device,
packet->send_buf_index = NETVSC_INVALID_INDEX; packet->send_buf_index = NETVSC_INVALID_INDEX;
packet->cp_partial = false; 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]; msdp = &net_device->msd[q_idx];
/* batch packets in send buffer if possible */ /* batch packets in send buffer if possible */
...@@ -939,6 +947,7 @@ int netvsc_send(struct hv_device *device, ...@@ -939,6 +947,7 @@ int netvsc_send(struct hv_device *device,
} }
} }
send_now:
if (cur_send) if (cur_send)
ret = netvsc_send_pkt(cur_send, net_device, pb, skb); ret = netvsc_send_pkt(cur_send, net_device, pb, skb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment