mirror of
https://github.com/fail0verflow/switch-linux.git
synced 2025-05-04 02:34:21 -04:00
hv_netvsc: Fix race condition on Multi-Send Data field
In commit 2a04ae8acb
("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>
This commit is contained in:
parent
abe492b4f5
commit
cf8190e4c2
1 changed files with 9 additions and 0 deletions
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue