Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp1725995ybz; Sat, 18 Apr 2020 07:14:46 -0700 (PDT) X-Google-Smtp-Source: APiQypKT9tApn5AQYyKIGUQScS8VEsEs88R8eXrOivdNIbqwvNGtAoz78t3mwP2KGaDIgaX31Cu1 X-Received: by 2002:a05:6402:4ce:: with SMTP id n14mr7940487edw.32.1587219286231; Sat, 18 Apr 2020 07:14:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587219286; cv=none; d=google.com; s=arc-20160816; b=D+iDGULU/XBdFY2E9fIqSyuLV6JMRuCGKMqlpKwjeSBVW/bv+N7mJyqRQxucAZVpNP wfINlhXsRXOfSMCaFCzyHXlHe3xW8DjHLz9MIFMMEmIc/RYp9OYIBnjBCxvIiPwvP973 ceRnHl2r7387JZYRxvFS/PvQhPGqKg4IaBURFqyvhNaskS3UXtRj8p33aGoC8frDTT8h wDp6zmX7UwPAK8xX+ubBjdFIUT8bDUNCIH/w0RqSLvEsZTBvGIEXYgVxhDRQECUedj8x sg5m4AVVgsdnoiXf9870bwKTbVY0Rk2GMomwcIXEz3Gbstv0YAL4PFfSSqtrNBkQUz7h 1nWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=eWjAt8eb7RaAmLJUyzg9dz37QPqaBmEqorLSb3ZC/F4=; b=ytRxIuq9fHt+PaUsdxJ64tPFt9lqpm7M4WWhF3b2kS7EKwveLuQUp0wzzBsMx0tWL0 nIQxJhwMlnwrJMZ2bgNICTU+/wnu3kPdIAfIBzPLlxNZgwLbOJhUJOjbsjEFEyOkLHeR Fh7AH5hAymCBZeSqe1am3IBZ4oCRAexgJehKX6DWzoCWEFUzcFIWfu/9HRwVeusVbQOC PonR8mhQbKL4wDqgnnjdOx/VmRSE+uwgiNPusFWLV1wQ7ZpxpBUZiGq4ILmWqcgJHVSA zG4CWAjjMq1Eb09VvQbQeCYGJlvKZG845xSuSk140878Bm3fCsE7tV+pdx20chC1ksQU wAnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=HpvlM3b3; 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jr16si16004346ejb.374.2020.04.18.07.14.24; Sat, 18 Apr 2020 07:14:46 -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=@kernel.org header.s=default header.b=HpvlM3b3; 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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728003AbgDROKs (ORCPT + 99 others); Sat, 18 Apr 2020 10:10:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:39000 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727918AbgDROKi (ORCPT ); Sat, 18 Apr 2020 10:10:38 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 49F702224F; Sat, 18 Apr 2020 14:10:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1587219038; bh=cjm+5jK9JUTX8l5VP0UQ0cEZ1wmZM5yeytrvD0lGy+8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HpvlM3b3x+Q2c0uw730DMr3137yUtvAfuPupDr245GOY5zEQPRmUyV/upncpXxKW0 izH1aq6xUYaYF2Piqvt0O24fGitd2jMMYCtaaeZMQ1TZyUnyR7yqWJDOUqIACTjdqV cvqzDV3Qjuu+ZMQfBcrxPQm8URYuC/g/3vFi4vy4= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Frederic Barrat , Andrew Donnellan , Michael Ellerman , Sasha Levin , linuxppc-dev@lists.ozlabs.org Subject: [PATCH AUTOSEL 5.5 71/75] powerpc/powernv/ioda: Fix ref count for devices with their own PE Date: Sat, 18 Apr 2020 10:09:06 -0400 Message-Id: <20200418140910.8280-71-sashal@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200418140910.8280-1-sashal@kernel.org> References: <20200418140910.8280-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Frederic Barrat [ Upstream commit 05dd7da76986937fb288b4213b1fa10dbe0d1b33 ] The pci_dn structure used to store a pointer to the struct pci_dev, so taking a reference on the device was required. However, the pci_dev pointer was later removed from the pci_dn structure, but the reference was kept for the npu device. See commit 902bdc57451c ("powerpc/powernv/idoa: Remove unnecessary pcidev from pci_dn"). We don't need to take a reference on the device when assigning the PE as the struct pnv_ioda_pe is cleaned up at the same time as the (physical) device is released. Doing so prevents the device from being released, which is a problem for opencapi devices, since we want to be able to remove them through PCI hotplug. Now the ugly part: nvlink npu devices are not meant to be released. Because of the above, we've always leaked a reference and simply removing it now is dangerous and would likely require more work. There's currently no release device callback for nvlink devices for example. So to be safe, this patch leaks a reference on the npu device, but only for nvlink and not opencapi. Signed-off-by: Frederic Barrat Reviewed-by: Andrew Donnellan Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20191121134918.7155-2-fbarrat@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/platforms/powernv/pci-ioda.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 67e4628dd5274..b4afabe20744a 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -1062,14 +1062,13 @@ static struct pnv_ioda_pe *pnv_ioda_setup_dev_PE(struct pci_dev *dev) return NULL; } - /* NOTE: We get only one ref to the pci_dev for the pdn, not for the - * pointer in the PE data structure, both should be destroyed at the - * same time. However, this needs to be looked at more closely again - * once we actually start removing things (Hotplug, SR-IOV, ...) + /* NOTE: We don't get a reference for the pointer in the PE + * data structure, both the device and PE structures should be + * destroyed at the same time. However, removing nvlink + * devices will need some work. * * At some point we want to remove the PDN completely anyways */ - pci_dev_get(dev); pdn->pe_number = pe->pe_number; pe->flags = PNV_IODA_PE_DEV; pe->pdev = dev; @@ -1084,7 +1083,6 @@ static struct pnv_ioda_pe *pnv_ioda_setup_dev_PE(struct pci_dev *dev) pnv_ioda_free_pe(pe); pdn->pe_number = IODA_INVALID_PE; pe->pdev = NULL; - pci_dev_put(dev); return NULL; } @@ -1205,6 +1203,14 @@ static struct pnv_ioda_pe *pnv_ioda_setup_npu_PE(struct pci_dev *npu_pdev) struct pci_controller *hose = pci_bus_to_host(npu_pdev->bus); struct pnv_phb *phb = hose->private_data; + /* + * Intentionally leak a reference on the npu device (for + * nvlink only; this is not an opencapi path) to make sure it + * never goes away, as it's been the case all along and some + * work is needed otherwise. + */ + pci_dev_get(npu_pdev); + /* * Due to a hardware errata PE#0 on the NPU is reserved for * error handling. This means we only have three PEs remaining @@ -1228,7 +1234,6 @@ static struct pnv_ioda_pe *pnv_ioda_setup_npu_PE(struct pci_dev *npu_pdev) */ dev_info(&npu_pdev->dev, "Associating to existing PE %x\n", pe_num); - pci_dev_get(npu_pdev); npu_pdn = pci_get_pdn(npu_pdev); rid = npu_pdev->bus->number << 8 | npu_pdn->devfn; npu_pdn->pe_number = pe_num; -- 2.20.1