linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Dick Kennedy <dick.kennedy@broadcom.com>,
	James Smart <jsmart2021@gmail.com>,
	"Martin K . Petersen" <martin.petersen@oracle.com>,
	Sasha Levin <sashal@kernel.org>,
	linux-scsi@vger.kernel.org
Subject: [PATCH AUTOSEL 5.8 30/62] scsi: lpfc: Fix shost refcount mismatch when deleting vport
Date: Fri, 21 Aug 2020 12:13:51 -0400	[thread overview]
Message-ID: <20200821161423.347071-30-sashal@kernel.org> (raw)
In-Reply-To: <20200821161423.347071-1-sashal@kernel.org>

From: Dick Kennedy <dick.kennedy@broadcom.com>

[ Upstream commit 03dbfe0668e6692917ac278883e0586cd7f7d753 ]

When vports are deleted, it is observed that there is memory/kthread
leakage as the vport isn't fully being released.

There is a shost reference taken in scsi_add_host_dma that is not released
during scsi_remove_host. It was noticed that other drivers resolve this by
doing a scsi_host_put after calling scsi_remove_host.

The vport_delete routine is taking two references one that corresponds to
an access to the scsi_host in the vport_delete routine and another that is
released after the adapter mailbox command completes that destroys the VPI
that corresponds to the vport.

Remove one of the references taken such that the second reference that is
put will complete the missing scsi_add_host_dma reference and the shost
will be terminated.

Link: https://lore.kernel.org/r/20200630215001.70793-8-jsmart2021@gmail.com
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/scsi/lpfc/lpfc_vport.c | 26 ++++++++------------------
 1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/drivers/scsi/lpfc/lpfc_vport.c b/drivers/scsi/lpfc/lpfc_vport.c
index b766463579800..d0296f7cf45fc 100644
--- a/drivers/scsi/lpfc/lpfc_vport.c
+++ b/drivers/scsi/lpfc/lpfc_vport.c
@@ -642,27 +642,16 @@ lpfc_vport_delete(struct fc_vport *fc_vport)
 		    vport->port_state < LPFC_VPORT_READY)
 			return -EAGAIN;
 	}
+
 	/*
-	 * This is a bit of a mess.  We want to ensure the shost doesn't get
-	 * torn down until we're done with the embedded lpfc_vport structure.
-	 *
-	 * Beyond holding a reference for this function, we also need a
-	 * reference for outstanding I/O requests we schedule during delete
-	 * processing.  But once we scsi_remove_host() we can no longer obtain
-	 * a reference through scsi_host_get().
-	 *
-	 * So we take two references here.  We release one reference at the
-	 * bottom of the function -- after delinking the vport.  And we
-	 * release the other at the completion of the unreg_vpi that get's
-	 * initiated after we've disposed of all other resources associated
-	 * with the port.
+	 * Take early refcount for outstanding I/O requests we schedule during
+	 * delete processing for unreg_vpi.  Always keep this before
+	 * scsi_remove_host() as we can no longer obtain a reference through
+	 * scsi_host_get() after scsi_host_remove as shost is set to SHOST_DEL.
 	 */
 	if (!scsi_host_get(shost))
 		return VPORT_INVAL;
-	if (!scsi_host_get(shost)) {
-		scsi_host_put(shost);
-		return VPORT_INVAL;
-	}
+
 	lpfc_free_sysfs_attr(vport);
 
 	lpfc_debugfs_terminate(vport);
@@ -809,8 +798,9 @@ lpfc_vport_delete(struct fc_vport *fc_vport)
 		if (!(vport->vpi_state & LPFC_VPI_REGISTERED) ||
 				lpfc_mbx_unreg_vpi(vport))
 			scsi_host_put(shost);
-	} else
+	} else {
 		scsi_host_put(shost);
+	}
 
 	lpfc_free_vpi(phba, vport->vpi);
 	vport->work_port_events = 0;
-- 
2.25.1


  parent reply	other threads:[~2020-08-21 16:16 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-21 16:13 [PATCH AUTOSEL 5.8 01/62] ALSA: hda/hdmi: Add quirk to force connectivity Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 02/62] ALSA: pci: delete repeated words in comments Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 03/62] ALSA: hda/realtek: Fix pin default on Intel NUC 8 Rugged Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 04/62] ALSA: hda/hdmi: Use force connectivity quirk on another HP desktop Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 05/62] drm/amdgpu: fix RAS memory leak in error case Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 06/62] EDAC/mc: Call edac_inc_ue_error() before panic Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 07/62] ASoC: img: Fix a reference count leak in img_i2s_in_set_fmt Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 08/62] ASoC: img-parallel-out: Fix a reference count leak Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 09/62] ASoC: tegra: Fix reference count leaks Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 10/62] mfd: intel-lpss: Add Intel Emmitsburg PCH PCI IDs Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 11/62] arm64: dts: qcom: msm8916: Pull down PDM GPIOs during sleep Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 12/62] powerpc/xive: Ignore kmemleak false positives Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 13/62] media: pci: ttpci: av7110: fix possible buffer overflow caused by bad DMA value in debiirq() Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 14/62] gcc-plugins/stackleak: Don't instrument itself Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 15/62] blktrace: ensure our debugfs dir exists Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 16/62] staging: rts5208: fix memleaks on error handling paths in probe Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 17/62] scsi: target: tcmu: Fix crash on ARM during cmd completion Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 18/62] mfd: intel-lpss: Add Intel Tiger Lake PCH-H PCI IDs Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 19/62] iommu/iova: Don't BUG on invalid PFNs Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 20/62] platform/chrome: cros_ec_sensorhub: Fix EC timestamp overflow Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 21/62] drm/amdkfd: Fix reference count leaks Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 22/62] drm/radeon: fix multiple reference count leak Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 23/62] drm/amdgpu: fix ref count leak in amdgpu_driver_open_kms Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 24/62] drm/amd/display: fix ref count leak in amdgpu_drm_ioctl Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 25/62] drm/amdgpu: fix ref count leak in amdgpu_display_crtc_set_config Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 26/62] drm/amdgpu/display: fix ref count leak when pm_runtime_get_sync fails Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 27/62] drm/amdgpu/fence: " Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 28/62] drm/amdkfd: " Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 29/62] drm/amdgpu/pm: " Sasha Levin
2020-08-21 16:13 ` Sasha Levin [this message]
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 31/62] xfs: Don't allow logging of XFS_ISTALE inodes Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 32/62] scsi: target: Fix xcopy sess release leak Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 33/62] selftests/powerpc: Purge extra count_pmc() calls of ebb selftests Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 34/62] f2fs: remove write attribute of main_blkaddr sysfs node Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 35/62] f2fs: fix error path in do_recover_data() Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 36/62] MIPS: KVM: Limit Trap-and-Emulate to MIPS32R2 only Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 37/62] omapfb: fix multiple reference count leaks due to pm_runtime_get_sync Sasha Levin
2020-08-21 16:13 ` [PATCH AUTOSEL 5.8 38/62] PCI: Fix pci_create_slot() reference count leak Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 39/62] ARM: dts: ls1021a: output PPS signal on FIPER2 Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 40/62] rtlwifi: rtl8192cu: Prevent leaking urb Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 41/62] mips/vdso: Fix resource leaks in genvdso.c Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 42/62] ALSA: hda: Add support for Loongson 7A1000 controller Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 43/62] gpu: host1x: Put gather's BO on pinning error Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 44/62] cec-api: prevent leaking memory through hole in structure Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 45/62] ASoC: Intel: sof_sdw_rt711: remove properties in card remove Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 46/62] HID: quirks: add NOGET quirk for Logitech GROUP Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 47/62] f2fs: fix use-after-free issue Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 48/62] drm/nouveau/drm/noveau: fix reference count leak in nouveau_fbcon_open Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 49/62] drm/nouveau: fix reference count leak in nv50_disp_atomic_commit Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 50/62] drm/nouveau: Fix reference count leak in nouveau_connector_detect Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 51/62] locking/lockdep: Fix overflow in presentation of average lock-time Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 52/62] btrfs: file: reserve qgroup space after the hole punch range is locked Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 53/62] btrfs: make btrfs_qgroup_check_reserved_leak take btrfs_inode Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 54/62] scsi: iscsi: Do not put host in iscsi_set_flashnode_param() Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 55/62] RDMA/efa: Add EFA 0xefa1 PCI ID Sasha Levin
2020-08-21 19:40   ` Jason Gunthorpe
2020-08-21 19:53     ` Sasha Levin
2020-08-21 20:19       ` Jason Gunthorpe
2020-08-21 20:34         ` Sasha Levin
2020-08-23  6:43           ` Gal Pressman
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 56/62] netfilter: nf_tables: report EEXIST on overlaps Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 57/62] ceph: fix potential mdsc use-after-free crash Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 58/62] ceph: do not access the kiocb after aio requests Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 59/62] scsi: fcoe: Memory leak fix in fcoe_sysfs_fcf_del() Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 60/62] i2c: i801: Add support for Intel Tiger Lake PCH-H Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 61/62] EDAC/ie31200: Fallback if host bridge device is already initialized Sasha Levin
2020-08-21 16:14 ` [PATCH AUTOSEL 5.8 62/62] hugetlbfs: prevent filesystem stacking of hugetlbfs 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=20200821161423.347071-30-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=dick.kennedy@broadcom.com \
    --cc=jsmart2021@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).