From patchwork Tue Mar 7 17:30:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 736304 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 3vd3bd36NGz9s8V; Wed, 8 Mar 2017 04:31:09 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical-com.20150623.gappssmtp.com header.i=@canonical-com.20150623.gappssmtp.com header.b="Wiq9XLMv"; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1clIx0-0004G6-7D; Tue, 07 Mar 2017 17:31:06 +0000 Received: from mail-it0-f44.google.com ([209.85.214.44]) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1clIwr-0004Dh-SH for kernel-team@lists.ubuntu.com; Tue, 07 Mar 2017 17:30:57 +0000 Received: by mail-it0-f44.google.com with SMTP id g138so9718864itb.0 for ; Tue, 07 Mar 2017 09:30:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=RNy5hxLBKmYw8TCEJgM7NP6sPhHnyq4XB/dC4Jxt7KU=; b=Wiq9XLMvMmj5y/ZFcDxBUqj0n+R8rMQXgrCQySpbvCPlV524PYF3XBiN2gwDdR/L+7 B3R2QAGp5Ot+giS7llRCzN/eDnTyx+FVa4SxTSfBAYNHjw3U1A1XZfyHaxCR4wkfEkXT YWFpgGZ9HXVriBbPRH/cmY9Wz2lTTnjVnIDF1wDB+76YTeyLlqfwEkhgQmidZ4OzBHD/ BjsRHKU949OcGjFCIVgcTkMRqu3nuYlXQbxXeJ/BZ6nwazP0SFkdAL7MulnSMeIDn+CV d9HOAGNaC1KR/VHnXf3vQyuBuNNCAINN16aRF4qgZ2NeD1L570euozZXzf1mjBOEukBp y2hQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=RNy5hxLBKmYw8TCEJgM7NP6sPhHnyq4XB/dC4Jxt7KU=; b=KswgkrHupfyqdt/Ebr06It4uSjRt3PvrlB0hSEVpsu0vRNoaBCNDNwmET6M9rUWJNt kywyOFUhEvl6AgC4vIA0s8bUiFZL/jiFm+SHu7RT2s3GzhvYgF9ddPZdOkp4bOlSRNuT Kk3LpibddjDlIzMX32opW6lK7cqKvrgCBjQmLiDsMehsNfDWQJYeZnL+ivXctqfzdkqo O04GAU+NK3WL/L9MTrY/Unulbse+cbQDtUYsfy7L+V+BNnV1uvLScXS9vgB5ABO+PNek wKeLMtY6I8UYiIj/sSeHrySIy2X8tVidOLIkKz2/pQRE7JX255eV9VtOJAr9EWFljaCv 9vmg== X-Gm-Message-State: AMke39mZmpiRm2w3eLtNYSOPk6b3vaftOEIkOnmrZTb5JC29ItjxoOHk3pBxfAUaKKcOy5Ss X-Received: by 10.36.47.213 with SMTP id j204mr21226797itj.7.1488907856327; Tue, 07 Mar 2017 09:30:56 -0800 (PST) Received: from localhost.localdomain (host-98-127-250-84.bln-mt.client.bresnan.net. [98.127.250.84]) by smtp.gmail.com with ESMTPSA id a21sm6521285itc.28.2017.03.07.09.30.55 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 07 Mar 2017 09:30:55 -0800 (PST) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 2/4] PCI: hv: Delete the device earlier from hbus->children for hot-remove Date: Tue, 7 Mar 2017 10:30:46 -0700 Message-Id: <1488907848-1872-3-git-send-email-tim.gardner@canonical.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1488907848-1872-1-git-send-email-tim.gardner@canonical.com> References: <1488907848-1872-1-git-send-email-tim.gardner@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Dexuan Cui BugLink: http://bugs.launchpad.net/bugs/1670518 After we send a PCI_EJECTION_COMPLETE message to the host, the host will immediately send us a PCI_BUS_RELATIONS message with relations->device_count == 0, so pci_devices_present_work(), running on another thread, can find the being-ejected device, mark the hpdev->reported_missing to true, and run list_move_tail()/list_del() for the device -- this races hv_eject_device_work() -> list_del(). Move the list_del() in hv_eject_device_work() to an earlier place, i.e., before we send PCI_EJECTION_COMPLETE, so later the pci_devices_present_work() can't see the device. Signed-off-by: Dexuan Cui Signed-off-by: Bjorn Helgaas Reviewed-by: Jake Oshins Acked-by: K. Y. Srinivasan CC: Haiyang Zhang CC: Vitaly Kuznetsov (cherry picked from commit e74d2ebdda33b3bdd1826b5b92e9aa45bdf92bb3) Signed-off-by: Tim Gardner --- drivers/pci/host/pci-hyperv.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c index c968330..87ecdf0 100644 --- a/drivers/pci/host/pci-hyperv.c +++ b/drivers/pci/host/pci-hyperv.c @@ -1582,6 +1582,10 @@ static void hv_eject_device_work(struct work_struct *work) pci_dev_put(pdev); } + spin_lock_irqsave(&hpdev->hbus->device_list_lock, flags); + list_del(&hpdev->list_entry); + spin_unlock_irqrestore(&hpdev->hbus->device_list_lock, flags); + memset(&ctxt, 0, sizeof(ctxt)); ejct_pkt = (struct pci_eject_response *)&ctxt.pkt.message; ejct_pkt->message_type.type = PCI_EJECTION_COMPLETE; @@ -1590,10 +1594,6 @@ static void hv_eject_device_work(struct work_struct *work) sizeof(*ejct_pkt), (unsigned long)&ctxt.pkt, VM_PKT_DATA_INBAND, 0); - spin_lock_irqsave(&hpdev->hbus->device_list_lock, flags); - list_del(&hpdev->list_entry); - spin_unlock_irqrestore(&hpdev->hbus->device_list_lock, flags); - put_pcichild(hpdev, hv_pcidev_ref_childlist); put_pcichild(hpdev, hv_pcidev_ref_pnp); put_hvpcibus(hpdev->hbus);