From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756720AbcCWUSQ (ORCPT ); Wed, 23 Mar 2016 16:18:16 -0400 Received: from p3plsmtps2ded03.prod.phx3.secureserver.net ([208.109.80.60]:37768 "EHLO p3plsmtps2ded03.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752770AbcCWUSP (ORCPT ); Wed, 23 Mar 2016 16:18:15 -0400 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, vkuznets@redhat.com, linux-kernel@vger.kernel.org, driverdev-devel@linuxdriverproject.org Subject: [PATCH net-next] hv_netvsc: Fix the order of num_sc_offered decrement Date: Wed, 23 Mar 2016 14:54:48 -0700 Message-Id: <1458770088-923-1-git-send-email-haiyangz@microsoft.com> X-Mailer: git-send-email 1.7.4.1 X-CMAE-Envelope: MS4wfLX7KO6C7FE3Ze0CjrxdUmnIU8wn1HwnbvGNdZnbsOKVABoGAIhJhkEd37M6VKdI0UFpcUvZOZ0rTg3SNdVN6Lg0cSHjKzQssSHN3qePOJsKzpeYZgQs bhI13qM+lG488NzuTZ8JL0TIzPVJskW0uxedWokA6RBxGbKO8mZm8jhHKzAT4nlgpAbYH69gPuRAxt8p87KNDJWgVYBNR1dEpXF/w8L8mu0JG1C6CqIc/XCh pa6vbwdDSgKn6EZdk3h77S0TTP0k5O1DUluV77gsUmATKdZI3J02+IdIBNdYrDS4bRvmCbFjKyQzqiJXyV1JYLFKhhY8Gu9+Y031cOFse4Gb5qyow4ISSezA rjVCCXXvarRJpZkWeGCRC2sSigx0q8jy7Dq7liOwbPfI7+OZTs6uQy36S+n/ZhIdYWOZZYjSYcFgBtvJSFBuigi/DNin7w== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Reorder the code in netvsc_sc_open(), so num_sc_offered is only decremented after vmbus_open() is called. This avoid pontential race of removing device before all channels are setup. Signed-off-by: Haiyang Zhang Reviewed-by: K. Y. Srinivasan --- drivers/net/hyperv/rndis_filter.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index d5a54da..c4e1e04 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c @@ -986,12 +986,6 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc) nvscdev = hv_get_drvdata(new_sc->primary_channel->device_obj); - spin_lock_irqsave(&nvscdev->sc_lock, flags); - nvscdev->num_sc_offered--; - spin_unlock_irqrestore(&nvscdev->sc_lock, flags); - if (nvscdev->num_sc_offered == 0) - complete(&nvscdev->channel_init_wait); - if (chn_index >= nvscdev->num_chn) return; @@ -1004,6 +998,12 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc) if (ret == 0) nvscdev->chn_table[chn_index] = new_sc; + + spin_lock_irqsave(&nvscdev->sc_lock, flags); + nvscdev->num_sc_offered--; + spin_unlock_irqrestore(&nvscdev->sc_lock, flags); + if (nvscdev->num_sc_offered == 0) + complete(&nvscdev->channel_init_wait); } int rndis_filter_device_add(struct hv_device *dev, -- 1.7.4.1