From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754168AbbLJS5l (ORCPT ); Thu, 10 Dec 2015 13:57:41 -0500 Received: from p3plsmtps2ded02.prod.phx3.secureserver.net ([208.109.80.59]:59349 "EHLO p3plsmtps2ded02.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752599AbbLJS5i (ORCPT ); Thu, 10 Dec 2015 13:57:38 -0500 X-Greylist: delayed 676 seconds by postgrey-1.27 at vger.kernel.org; Thu, 10 Dec 2015 13:57:38 EST x-originating-ip: 72.167.245.219 From: Haiyang Zhang To: davem@davemloft.net, netdev@vger.kernel.org Cc: haiyangz@microsoft.com, kys@microsoft.com, olaf@aepfle.de, jasowang@redhat.com, linux-kernel@vger.kernel.org, driverdev-devel@linuxdriverproject.org Subject: [PATCH net-next] hv_netvsc: Fix race condition on Multi-Send Data field Date: Thu, 10 Dec 2015 12:19:35 -0800 Message-Id: <1449778775-14404-1-git-send-email-haiyangz@microsoft.com> X-Mailer: git-send-email 1.7.4.1 X-CMAE-Envelope: MS4wfDtwea6lRokVia5FiybY7oLhJCYiilpeVgMTZ0TbvPPW0bB0kN/0zQnbp6MEyyQHiIfi7Ng38Ahon0dKm894iS6uD7zwQ3e5450pda5ezjdXY/4Ub0K2 vh7ftlFwDK7/zaOVEqILx5P073zBiMnCeUHwg9ZIwFBiM86CRFbSnq0Gr6hcSydMD0SwcYc8mEDk8L40j9iq7cq5xGzgPLZd3ZKC3P98dpNz9yxcvOM1VQ1n cq8YOCL90ZT+HhujX0ft5LHeYfgJmnqd9q9fgJzt4NmQkLvnez8pg721LKpCJezBfruf4R6lerK8ZMNM3NY/04TQdDmWyElMWZKA5KVuTpTGZP1dowSOiXYF X7rwXHoQ/6rVH4kM5mS0bQJOjtqskj1Nqmlp0m9r7PlZ90z/UWowZqy/9xpyvdeeXEewPRfER+ZyQ2GoyYCCtcRKhgYulA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In commit 2a04ae8acb14 ("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 Reviewed-by: K. Y. Srinivasan --- drivers/net/hyperv/netvsc.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 02bab9a..059fc52 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -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); -- 1.7.4.1