From: Sasha Levin <sashal@kernel.org> To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Frederic Barrat <fbarrat@linux.ibm.com>, Andrew Donnellan <ajd@linux.ibm.com>, Michael Ellerman <mpe@ellerman.id.au>, Sasha Levin <sashal@kernel.org>, linuxppc-dev@lists.ozlabs.org Subject: [PATCH AUTOSEL 4.19 41/47] powerpc/powernv/ioda: Fix ref count for devices with their own PE Date: Sat, 18 Apr 2020 10:42:21 -0400 [thread overview] Message-ID: <20200418144227.9802-41-sashal@kernel.org> (raw) In-Reply-To: <20200418144227.9802-1-sashal@kernel.org> From: Frederic Barrat <fbarrat@linux.ibm.com> [ 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 <fbarrat@linux.ibm.com> Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20191121134918.7155-2-fbarrat@linux.ibm.com Signed-off-by: Sasha Levin <sashal@kernel.org> --- 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 ecd211c5f24a5..19cd6affdd5fb 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -1071,14 +1071,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; @@ -1093,7 +1092,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; } @@ -1213,6 +1211,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 @@ -1236,7 +1242,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
WARNING: multiple messages have this Message-ID (diff)
From: Sasha Levin <sashal@kernel.org> To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Frederic Barrat <fbarrat@linux.ibm.com>, linuxppc-dev@lists.ozlabs.org, Andrew Donnellan <ajd@linux.ibm.com>, Sasha Levin <sashal@kernel.org> Subject: [PATCH AUTOSEL 4.19 41/47] powerpc/powernv/ioda: Fix ref count for devices with their own PE Date: Sat, 18 Apr 2020 10:42:21 -0400 [thread overview] Message-ID: <20200418144227.9802-41-sashal@kernel.org> (raw) In-Reply-To: <20200418144227.9802-1-sashal@kernel.org> From: Frederic Barrat <fbarrat@linux.ibm.com> [ 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 <fbarrat@linux.ibm.com> Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20191121134918.7155-2-fbarrat@linux.ibm.com Signed-off-by: Sasha Levin <sashal@kernel.org> --- 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 ecd211c5f24a5..19cd6affdd5fb 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -1071,14 +1071,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; @@ -1093,7 +1092,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; } @@ -1213,6 +1211,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 @@ -1236,7 +1242,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
next prev parent reply other threads:[~2020-04-18 14:49 UTC|newest] Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-18 14:41 [PATCH AUTOSEL 4.19 01/47] iommu/amd: Fix the configuration of GCR3 table root pointer Sasha Levin 2020-04-18 14:41 ` Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 02/47] watchdog: reset last_hw_keepalive time at start Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 03/47] ovl: fix value of i_ino for lower hardlink corner case Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 04/47] iommu/vt-d: Fix mm reference leak Sasha Levin 2020-04-18 14:41 ` Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 05/47] scsi: lpfc: Fix kasan slab-out-of-bounds error in lpfc_unreg_login Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 06/47] scsi: lpfc: Fix crash in target side cable pulls hitting WAIT_FOR_UNREG Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 07/47] ceph: return ceph_mdsc_do_request() errors from __get_parent() Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 08/47] ceph: don't skip updating wanted caps when cap is stale Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 09/47] pwm: rcar: Fix late Runtime PM enablement Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 10/47] ASoC: dpcm: allow start or stop during pause for backend Sasha Levin 2020-04-18 14:41 ` Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 11/47] scsi: iscsi: Report unbind session event when the target has been removed Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 12/47] ASoC: Intel: atom: Take the drv->lock mutex before calling sst_send_slot_map() Sasha Levin 2020-04-18 14:41 ` Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 13/47] nvme: fix deadlock caused by ANA update wrong locking Sasha Levin 2020-04-18 14:41 ` Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 14/47] kernel/gcov/fs.c: gcov_seq_next() should increase position index Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 15/47] selftests: kmod: fix handling test numbers above 9 Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 16/47] ipc/util.c: sysvipc_find_ipc() should increase position index Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 17/47] kconfig: qconf: Fix a few alignment issues Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 18/47] KVM: s390: vsie: Fix possible race when shadowing region 3 tables Sasha Levin 2020-04-18 14:41 ` [PATCH AUTOSEL 4.19 19/47] s390/cio: avoid duplicated 'ADD' uevents Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 20/47] loop: Better discard support for block devices Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 21/47] pwm: pca9685: Fix PWM/GPIO inter-operation Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 22/47] Revert "powerpc/64: irq_work avoid interrupt when called with hardware irqs enabled" Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 23/47] drm/amdkfd: kfree the wrong pointer Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 24/47] pwm: renesas-tpu: Fix late Runtime PM enablement Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 25/47] pwm: bcm2835: Dynamically allocate base Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 26/47] drm/vc4: Fix HDMI mode validation Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 27/47] libnvdimm: Out of bounds read in __nd_ioctl() Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 28/47] ocfs2: no need try to truncate file beyond i_size Sasha Levin 2020-04-18 14:42 ` [Ocfs2-devel] " Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 29/47] hfsplus: fix crash and filesystem corruption when deleting files Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 30/47] ALSA: hda/realtek - Add quirk for MSI GL63 Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 31/47] perf/core: Disable page faults when getting phys address Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 32/47] libata: Return correct status in sata_pmp_eh_recover_pm() when ATA_DFLAG_DETACH is set Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 33/47] ALSA: ice1724: Fix invalid access for enumerated ctl items Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 34/47] ALSA: hda: Fix potential access overflow in beep helper Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 35/47] KVM: s390: vsie: Fix delivery of addressing exceptions Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 36/47] ASoC: Intel: bytcr_rt5640: Add quirk for MPMAN MPWIN895CL tablet Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 37/47] ipmi: fix hung processes in __get_guid() Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 38/47] scsi: mpt3sas: Fix kernel panic observed on soft HBA unplug Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 39/47] xhci: Ensure link state is U3 after setting USB_SS_PORT_LS_U3 Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 40/47] drm/amd/display: Not doing optimize bandwidth if flip pending Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` Sasha Levin [this message] 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 41/47] powerpc/powernv/ioda: Fix ref count for devices with their own PE Sasha Levin 2020-04-21 11:06 ` Frederic Barrat 2020-04-21 11:06 ` Frederic Barrat 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 42/47] pci/hotplug/pnv-php: Remove erroneous warning Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 43/47] ocxl: Add PCI hotplug dependency to Kconfig Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 44/47] tracing/selftests: Turn off timeout setting Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 45/47] virtio-blk: improve virtqueue error to BLK_STS Sasha Levin 2020-04-18 14:42 ` Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 46/47] scsi: smartpqi: fix call trace in device discovery Sasha Levin 2020-04-18 14:42 ` [PATCH AUTOSEL 4.19 47/47] PCI/ASPM: Allow re-enabling Clock PM Sasha Levin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200418144227.9802-41-sashal@kernel.org \ --to=sashal@kernel.org \ --cc=ajd@linux.ibm.com \ --cc=fbarrat@linux.ibm.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.org \ --cc=mpe@ellerman.id.au \ --cc=stable@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.