Received: by 10.213.65.68 with SMTP id h4csp80159imn; Thu, 15 Mar 2018 10:06:56 -0700 (PDT) X-Google-Smtp-Source: AG47ELuXl8p+MOIvMX6d35hhh1+OzFh32OdNijsz20ciu44cdhM2sAht310t9FTmA1xqq/P3MTRM X-Received: by 10.101.96.212 with SMTP id r20mr7255320pgv.139.1521133616079; Thu, 15 Mar 2018 10:06:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521133616; cv=none; d=google.com; s=arc-20160816; b=MQnqpv1qQVTM2DKN/jm3mMv7T0cc18Cv9oeEVv1arKsuviSn5iq2aJqgYamNoWIStp 7r8ORwXiN/QgUnHk696Z8RQwKFuCXvDuN9gBgkvncUQl6rSpH/dNwoemP7d7xUiv97be gZ6p7KVUmjey6UxO6catzDaDTwQG5+9mUNKNv67nlfcEZw4FRx2OIMj4RwN0Ms9WdLf4 qC4ltAfoTXLtZS++Rm8dmym+l+t0aR2+20st0AJSK86XEjjQ5AOPr8gUSwEnTKNCs5hV bCZVSw7dk4FHvOy4DXqTcnjf/fxzYtOfu70EFiSxAT0Ikv5YMxqYoy7f5crrCBxGaLqE qfEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:arc-authentication-results; bh=PmiddDRaC+S6scvrHyPPe8kKjHH50SNaMLWqO/i7gCM=; b=ZwVxz6zIXskQ0WP6KtDa+IeDEI+hKHByYmQsUyvjvsb5TiGSZwPx3EkKt0YN4jnM3R kACZKybgXysCgY+HWYDoOc8o5ayqGAr4rIV3bqQ2PwmpyU05jfsN4a9PVX792UU+yaB/ bBSc5ohC6DR8vyebRtC+fVFBmt8NaoEiNjpMi16WVidD/+okuOwAKB5BAJjMHa3T178k UksAwDt1hfqQgeBD2bYR6lx+u2jddQqeYga02VUNNuHk2LspTPj/G4MHefOqU+9H0UxJ ihBt5EJphr2IQYJ/d4w0ir8IrsnN05F9lQr1YF2yR+1fviKxSLTIzXNynCNfYVAm+VFE AvRw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y4-v6si4279354pll.413.2018.03.15.10.06.11; Thu, 15 Mar 2018 10:06:56 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752216AbeCORBu (ORCPT + 99 others); Thu, 15 Mar 2018 13:01:50 -0400 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:43742 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752152AbeCORBs (ORCPT ); Thu, 15 Mar 2018 13:01:48 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4153F1435; Thu, 15 Mar 2018 10:01:48 -0700 (PDT) Received: from e107981-ln.cambridge.arm.com (e107981-ln.cambridge.arm.com [10.1.207.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DB04B3F487; Thu, 15 Mar 2018 10:01:45 -0700 (PDT) Date: Thu, 15 Mar 2018 17:01:31 +0000 From: Lorenzo Pieralisi To: Dexuan Cui Cc: "bhelgaas@google.com" , "linux-pci@vger.kernel.org" , KY Srinivasan , Stephen Hemminger , "linux-kernel@vger.kernel.org" , "driverdev-devel@linuxdriverproject.org" , Haiyang Zhang , "olaf@aepfle.de" , "apw@canonical.com" , "jasowang@redhat.com" , "vkuznets@redhat.com" , "marcelo.cerri@canonical.com" , "Michael Kelley (EOSG)" Subject: Re: [PATCH v4 1/2] PCI: hv: Serialize the present and eject work items Message-ID: <20180315170131.GA22134@e107981-ln.cambridge.arm.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Mar 15, 2018 at 02:20:53PM +0000, Dexuan Cui wrote: > When we hot-remove the device, we first receive a PCI_EJECT message and > then receive a PCI_BUS_RELATIONS message with bus_rel->device_count == 0. > > The first message is offloaded to hv_eject_device_work(), and the second > is offloaded to pci_devices_present_work(). Both the paths can be running > list_del(&hpdev->list_entry), causing general protection fault, because > system_wq can run them concurrently. > > The patch eliminates the race condition. > > Tested-by: Adrian Suhov > Tested-by: Chris Valean > Signed-off-by: Dexuan Cui > Reviewed-by: Michael Kelley > Acked-by: Haiyang Zhang > Cc: stable@vger.kernel.org I need to know either what commit you are fixing (ie Fixes: tag - which is preferrable) or you tell me which kernel versions we are targeting for the stable backport. Thanks, Lorenzo > Cc: Vitaly Kuznetsov > Cc: Jack Morgenstein > Cc: Stephen Hemminger > Cc: K. Y. Srinivasan > --- > drivers/pci/host/pci-hyperv.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c > index 2faf38eab785..5e67dff779a7 100644 > --- a/drivers/pci/host/pci-hyperv.c > +++ b/drivers/pci/host/pci-hyperv.c > @@ -461,6 +461,8 @@ struct hv_pcibus_device { > struct retarget_msi_interrupt retarget_msi_interrupt_params; > > spinlock_t retarget_msi_interrupt_lock; > + > + struct workqueue_struct *wq; > }; > > /* > @@ -1770,7 +1772,7 @@ static void hv_pci_devices_present(struct hv_pcibus_device *hbus, > spin_unlock_irqrestore(&hbus->device_list_lock, flags); > > get_hvpcibus(hbus); > - schedule_work(&dr_wrk->wrk); > + queue_work(hbus->wq, &dr_wrk->wrk); > } > > /** > @@ -1848,7 +1850,7 @@ static void hv_pci_eject_device(struct hv_pci_dev *hpdev) > get_pcichild(hpdev, hv_pcidev_ref_pnp); > INIT_WORK(&hpdev->wrk, hv_eject_device_work); > get_hvpcibus(hpdev->hbus); > - schedule_work(&hpdev->wrk); > + queue_work(hpdev->hbus->wq, &hpdev->wrk); > } > > /** > @@ -2463,11 +2465,17 @@ static int hv_pci_probe(struct hv_device *hdev, > spin_lock_init(&hbus->retarget_msi_interrupt_lock); > sema_init(&hbus->enum_sem, 1); > init_completion(&hbus->remove_event); > + hbus->wq = alloc_ordered_workqueue("hv_pci_%x", 0, > + hbus->sysdata.domain); > + if (!hbus->wq) { > + ret = -ENOMEM; > + goto free_bus; > + } > > ret = vmbus_open(hdev->channel, pci_ring_size, pci_ring_size, NULL, 0, > hv_pci_onchannelcallback, hbus); > if (ret) > - goto free_bus; > + goto destroy_wq; > > hv_set_drvdata(hdev, hbus); > > @@ -2536,6 +2544,8 @@ static int hv_pci_probe(struct hv_device *hdev, > hv_free_config_window(hbus); > close: > vmbus_close(hdev->channel); > +destroy_wq: > + destroy_workqueue(hbus->wq); > free_bus: > free_page((unsigned long)hbus); > return ret; > @@ -2615,6 +2625,7 @@ static int hv_pci_remove(struct hv_device *hdev) > irq_domain_free_fwnode(hbus->sysdata.fwnode); > put_hvpcibus(hbus); > wait_for_completion(&hbus->remove_event); > + destroy_workqueue(hbus->wq); > free_page((unsigned long)hbus); > return 0; > } > -- > 2.7.4 >