hv_netvsc: Fix race condition on Multi-Send Data field
[linux-drm-fsl-dcu.git] / drivers / net / hyperv / netvsc.c
index 02bab9a7c9ff6e292e1c68856a8a34e860267b1b..059fc523160107239d72080cadb1f2e7c0d246df 100644 (file)
@@ -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);