Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp639058pxj; Thu, 10 Jun 2021 09:08:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxA6C/W7nM2waRV/3UTN55OixaA/CP/bMk4YwlOWKseHcfvLqsXBHgOBkniM2RnC+5CjpxY X-Received: by 2002:a05:6402:51d1:: with SMTP id r17mr186708edd.91.1623341323866; Thu, 10 Jun 2021 09:08:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623341323; cv=none; d=google.com; s=arc-20160816; b=XFoBVI/tLYgyR+BkQx+VHqHzZwEl70bYgX44BTCQE3ZX9MzvVxZq+ooNdGI5vwH51y 4FjcRTM/RUJacYimoRiQ4fc39WYK/c0gaGTcAUYRAjCtGcPhKASIbUt8bX1XZwqfDCLV tAYBVcWcuaBhkexlY8V2gg7/vm3nl+bsLFUlAR2bs5+TC1WkShwzMquGc4dZFIWmLJJ5 6vLcX7xZh4YTI4qvAT4hvq+T9EhfCMuxYIn1QrBWnMh0oxShtDJOcQ8qC6H+ISqQUn7k F+oYf7IjQbgF3zVoapNK/5EGQdsWnhuB+R/aFf4gSBKxXK/DlizwNZeBhDmyiyHzmFfg qCEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:subject:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:cc:to:from:dkim-signature; bh=V8wti9Rbd9gM9W3eLoa9VESkzHe3fDUB5qnOwryji5s=; b=r+ZRfGTUK1BiC3kyBw9JqSIvp1EGoBVwngno5IG2kHBlPLf+GKvEADQJwIOis33R11 zNCWz2GpBru+IIGEkftpnQ+qwfrKQk4/Ha6/bDylOmpd2aA12EmEJRfpFloXwjbVQHqM GravcPJguh+s58WgleGs3dwXw1aitbKxWqN076Amj8ZxI2xZNY7SWTMc+uAsqzpgItxa /CM26bQ4QbhM9mH545l4UWpTzPqvjqxZhw02XzRl6BJcWhlu3af/uUm656JSAOv9SY29 Q70LjJ+BgW8V4aDrQx8d4Pm6fWTzKezXUl2P14Q7HyZfmKBHC597AuTVt8MMpKUJbpGs lMjA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@deltatee.com header.s=20200525 header.b=EAuVPPWY; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h19si2465599ede.378.2021.06.10.09.08.18; Thu, 10 Jun 2021 09:08:43 -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=@deltatee.com header.s=20200525 header.b=EAuVPPWY; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230184AbhFJQIY (ORCPT + 99 others); Thu, 10 Jun 2021 12:08:24 -0400 Received: from ale.deltatee.com ([204.191.154.188]:60178 "EHLO ale.deltatee.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230364AbhFJQIR (ORCPT ); Thu, 10 Jun 2021 12:08:17 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=deltatee.com; s=20200525; h=Subject:MIME-Version:References:In-Reply-To: Message-Id:Date:Cc:To:From:content-disposition; bh=V8wti9Rbd9gM9W3eLoa9VESkzHe3fDUB5qnOwryji5s=; b=EAuVPPWYpAgnjMxfy/hj2I32Vf +JJFwEARwbnRG5My05BB39xig5RZb2TkrRO/y6baz7GKBIBum7fQfTLr2U0FfrsCfGplHwlGLCJNu cUwO6t6TatP3R079/lBIDjf+R4/jlOCfw22/+SNgsAj8wp7/gQcYwcWb6lMZHZrcNtriQ0+b9//cL S8yWhNy9ben89b71mxXeWBNxWLui0q/5CGQPSzNj8GTAcIavnE0PGNiUKLqnvx0mScCGQ7TefpsHy pi2h0NaP3HfO1b6dWH0gNYdVLrD84Z392tJVZGHmqK/Mysyq9GnGH5gBjIHSagY8Za+JD3uwJcgnq 5K0o9iyQ==; Received: from cgy1-donard.priv.deltatee.com ([172.16.1.31]) by ale.deltatee.com with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lrNCD-0000Jj-G9; Thu, 10 Jun 2021 10:06:21 -0600 Received: from gunthorp by cgy1-donard.priv.deltatee.com with local (Exim 4.92) (envelope-from ) id 1lrNC9-0007Pv-20; Thu, 10 Jun 2021 10:06:13 -0600 From: Logan Gunthorpe To: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, Bjorn Helgaas Cc: Stephen Bates , Christoph Hellwig , Dan Williams , Jason Gunthorpe , =?UTF-8?q?Christian=20K=C3=B6nig?= , John Hubbard , Don Dutile , Logan Gunthorpe Date: Thu, 10 Jun 2021 10:06:09 -0600 Message-Id: <20210610160609.28447-7-logang@deltatee.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210610160609.28447-1-logang@deltatee.com> References: <20210610160609.28447-1-logang@deltatee.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 172.16.1.31 X-SA-Exim-Rcpt-To: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, helgaas@kernel.org, sbates@raithlin.com, hch@lst.de, dan.j.williams@intel.com, jgg@ziepe.ca, christian.koenig@amd.com, jhubbard@nvidia.com, ddutile@redhat.com, logang@deltatee.com X-SA-Exim-Mail-From: gunthorp@deltatee.com X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on ale.deltatee.com X-Spam-Level: X-Spam-Status: No, score=-6.5 required=5.0 tests=ALL_TRUSTED,BAYES_00, MYRULES_FREE,MYRULES_NO_TEXT autolearn=no autolearn_force=no version=3.4.2 Subject: [PATCH v1 6/6] PCI/P2PDMA: Avoid pci_get_slot() which sleeps X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on ale.deltatee.com) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In order to use upstream_bridge_distance_warn() from a dma_map function, it must not sleep. However, pci_get_slot() takes the pci_bus_sem so it might sleep. In order to avoid this, try to get the host bridge's device from the first element in the device list. It should be impossible for the host bridge's device to go away while references are held on child devices, so the first element should not be able to change and, thus, this should be safe. Introduce a static function called pci_host_bridge_dev() to obtain the host bridge's root device. Signed-off-by: Logan Gunthorpe --- drivers/pci/p2pdma.c | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index 5dc1f9f62a93..c7ecd0196102 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c @@ -308,10 +308,41 @@ static const struct pci_p2pdma_whitelist_entry { {} }; +/* + * This lookup function tries to find the PCI device corresponding to a given + * host bridge. + * + * It assumes the host bridge device is the first PCI device in the + * bus->devices list and that the devfn is 00.0. These assumptions should hold + * for all the devices in the whitelist above. + * + * This function is equivalent to pci_get_slot(host->bus, 0), however it does + * not take the pci_bus_sem lock seeing __host_bridge_whitelist() must not + * sleep. + * + * For this to be safe, the caller should hold a reference to a device on the + * bridge, which should ensure the host_bridge device will not be freed + * or removed from the head of the devices list. + */ +static struct pci_dev *pci_host_bridge_dev(struct pci_host_bridge *host) +{ + struct pci_dev *root; + + root = list_first_entry_or_null(&host->bus->devices, + struct pci_dev, bus_list); + + if (!root) + return NULL; + if (root->devfn != PCI_DEVFN(0, 0)) + return NULL; + + return root; +} + static bool __host_bridge_whitelist(struct pci_host_bridge *host, bool same_host_bridge, bool warn) { - struct pci_dev *root = pci_get_slot(host->bus, PCI_DEVFN(0, 0)); + struct pci_dev *root = pci_host_bridge_dev(host); const struct pci_p2pdma_whitelist_entry *entry; unsigned short vendor, device; @@ -320,7 +351,6 @@ static bool __host_bridge_whitelist(struct pci_host_bridge *host, vendor = root->vendor; device = root->device; - pci_dev_put(root); for (entry = pci_p2pdma_whitelist; entry->vendor; entry++) { if (vendor != entry->vendor || device != entry->device) -- 2.20.1