Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4677068pxj; Wed, 12 May 2021 10:39:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwB/mC80QKE5lYc1SAbykigG+35BRl/eHIIA/AWtBJ5nlvyA1Sf+dfIkwV0yhJbPsSD7Lmn X-Received: by 2002:a05:6830:1ac7:: with SMTP id r7mr25896734otc.167.1620841179992; Wed, 12 May 2021 10:39:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620841179; cv=none; d=google.com; s=arc-20160816; b=FYlDapiE0Sf81H0LR10zaJYKVX1uXSVXN7qxUzy64hjCi5MUljiiEXojMXmN7jBrvk kZRLzlg+jWB/aSEfucLYtcaFTQ0/dzzaz2b0E+3sFWqBAZMi/kf22hWs/hk31MBGTfbu +l1rN55i5tSTGqZ8RlheuSP0xGVpKZyR+LI7voqxGVPiwPG8QrGuELys/l2/wu+S0Lx7 GUa3Gf/fM6g8GxSEgMNAh042+P0YK7eLWamfj705IzZhYY8yZNtvuc0tg3xD5p9259CI OMKZ5B25Vw/HG8/DHTXdH34yozu2xCnSlf3vLuBVs5JZXI9GWXj9LPz5rI8KVb90YNlm V22Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=AZLgNyQOMTP9bgAyw/CAO1sQH4XGSIe6A2JgoDUu0qQ=; b=u9pb7FZQHT+7gRP3SacAP03hXYPQMIndYl9c8vI0zjE2+1LFs/0Ez7F3Oc2RUzAlTj 5zTvDFmGDQsqnLT8COv05r/5d9AIyxpmCYAcIXcx3qP7iZ/GpIFky56CHbdNlLba8qZU MTNfoai/nTBbOkfS05erTTRaIfKNKdnrp6inkaod0bbL2JOxyE9/1GCxw4MzcQe6XueP agr92m7ZX2J/1d8ZdjDFdifwDstL8j8bmPWOoxVZ1nwK/IOz3IqwTb31DtR37CqEdgXB a22fUrYrISkOoQxcfcvdTyGr1zikWn7gKLzL2eeZW3EoocAZbsGw21BiSFXpMCtYlHsj GhcQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=c09xVk3Y; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id k11si505601otf.301.2021.05.12.10.39.24; Wed, 12 May 2021 10:39:39 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=c09xVk3Y; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240641AbhELRd5 (ORCPT + 99 others); Wed, 12 May 2021 13:33:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:34834 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233346AbhELQIP (ORCPT ); Wed, 12 May 2021 12:08:15 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 70D0C61997; Wed, 12 May 2021 15:39:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620833955; bh=IctrLuusrI9vVJ9a28zso74mmzrptNV6lJ3aTrhRA5Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c09xVk3Yw9Vtf9xGzyXbSt5uS+7tzbjCMf5lLhT/HdWlHTBZhaiBkJJ/3VAXUvS4a JDuAh1kM7sQ65r0ZtAmZH+LtnFL6ExAi8Ry/5cGzIZw5I8zbFW+Hkb2MGfRyUJGAmg d3ivFJsYpjngcPzfD7vvWOGkdDetfHdp0xq00E+w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Christoph Hellwig , Max Gurtovoy , Kevin Tian , Cornelia Huck , Eric Auger , Jason Gunthorpe , Alex Williamson , Sasha Levin Subject: [PATCH 5.11 353/601] vfio/pci: Re-order vfio_pci_probe() Date: Wed, 12 May 2021 16:47:10 +0200 Message-Id: <20210512144839.416834070@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210512144827.811958675@linuxfoundation.org> References: <20210512144827.811958675@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jason Gunthorpe [ Upstream commit 4aeec3984ddc853f7c65903bde472ffdef738bae ] vfio_add_group_dev() must be called only after all of the private data in vdev is fully setup and ready, otherwise there could be races with user space instantiating a device file descriptor and starting to call ops. For instance vfio_pci_reflck_attach() sets vdev->reflck and vfio_pci_open(), called by fops open, unconditionally derefs it, which will crash if things get out of order. Fixes: cc20d7999000 ("vfio/pci: Introduce VF token") Fixes: e309df5b0c9e ("vfio/pci: Parallelize device open and release") Fixes: 6eb7018705de ("vfio-pci: Move idle devices to D3hot power state") Fixes: ecaa1f6a0154 ("vfio-pci: Add VGA arbiter client") Reviewed-by: Christoph Hellwig Reviewed-by: Max Gurtovoy Reviewed-by: Kevin Tian Reviewed-by: Cornelia Huck Reviewed-by: Eric Auger Signed-off-by: Jason Gunthorpe Message-Id: <8-v3-225de1400dfc+4e074-vfio1_jgg@nvidia.com> Signed-off-by: Alex Williamson Signed-off-by: Sasha Levin --- drivers/vfio/pci/vfio_pci.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index f31aa25f361c..48b048edf1ee 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c @@ -2034,13 +2034,9 @@ static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) INIT_LIST_HEAD(&vdev->vma_list); init_rwsem(&vdev->memory_lock); - ret = vfio_add_group_dev(&pdev->dev, &vfio_pci_ops, vdev); - if (ret) - goto out_free; - ret = vfio_pci_reflck_attach(vdev); if (ret) - goto out_del_group_dev; + goto out_free; ret = vfio_pci_vf_init(vdev); if (ret) goto out_reflck; @@ -2064,15 +2060,20 @@ static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) vfio_pci_set_power_state(vdev, PCI_D3hot); } - return ret; + ret = vfio_add_group_dev(&pdev->dev, &vfio_pci_ops, vdev); + if (ret) + goto out_power; + return 0; +out_power: + if (!disable_idle_d3) + vfio_pci_set_power_state(vdev, PCI_D0); out_vf: vfio_pci_vf_uninit(vdev); out_reflck: vfio_pci_reflck_put(vdev->reflck); -out_del_group_dev: - vfio_del_group_dev(&pdev->dev); out_free: + kfree(vdev->pm_save); kfree(vdev); out_group_put: vfio_iommu_group_put(group, &pdev->dev); -- 2.30.2