Received: by 2002:a05:6a10:c604:0:0:0:0 with SMTP id y4csp181094pxt; Wed, 4 Aug 2021 08:34:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxmnhbPnmiATqwxM6UM0rraxVGLZC8iNfTxRo4MwvGHfqwYR739ujn7ZRVyKecOwnlyHMAm X-Received: by 2002:aa7:c816:: with SMTP id a22mr395814edt.202.1628091297602; Wed, 04 Aug 2021 08:34:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628091297; cv=none; d=google.com; s=arc-20160816; b=wYX89dywABbQOkFpT1p0/Aztteg3SPII2da2U842fDGFDopNcjUaWu41UlPDzKyQZO a4Ib0yl0JJeGby0vPyUMhw8ztU1lyLQ4xrvDBBLg7Jt0Ezi4FkRtGFbBLVn18Hh8VPzu 1iP1sqA/9OkGf80TJKTVIiZvBqlP/e62b0B9c971xWhm9WbnxuRlbfb5E3k1gQFly9Ua vB5S60Qkcd2je+65su2mLuL4oCQylEQpM6YpUccF642p9fh3DzFv2OjouhcWGPy+90HT tZaO/L2GLU6I+MgNLhhjGwg7L0b1Go6SP4/7TXnJmuqEVk+KM8ckTzp9uTXFwUIp9h7B 6EDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:organization :references:cc:to:from:subject; bh=Uynt4oSYW/IHZ9n7oQg7u0t4+n5NpGlTCiWFMX5n2HU=; b=LoCqGXtc8ZKxTS8yO27htuP5BqnW/GhDBt3260IRklazZuUmzRqqvRE9m0ZNAeg0EE fy9rzLWGSRqS+rpdLiHjQLK26SZaAPBsZfgdc9YyfOXxHXt8TW61F0B+2thk9CfQYgFX aZivIfRV7lSyyWf0HOipuyFi6H5kLlpqaNmFvqWAtE1of+78rt9JTEKy/j60PDChqgjB GaaeC0/jTL5liBIMuGuFug8YIg6VYyqOJtDeUDSfTVRcPLY1SFjc2lb/7MJ0w39IelFJ h4VGwswM4D3IsRazpIUF/9WuJUJ5bGzVnbYg0ICf3HL8DgOW7Ftqc4KwQdq6PdCusJXf fmHg== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gv17si2377180ejb.1.2021.08.04.08.34.32; Wed, 04 Aug 2021 08:34:57 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239064AbhHDPdR (ORCPT + 99 others); Wed, 4 Aug 2021 11:33:17 -0400 Received: from mga03.intel.com ([134.134.136.65]:43712 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239087AbhHDPdN (ORCPT ); Wed, 4 Aug 2021 11:33:13 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10065"; a="213973803" X-IronPort-AV: E=Sophos;i="5.84,294,1620716400"; d="scan'208";a="213973803" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Aug 2021 08:32:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,294,1620716400"; d="scan'208";a="480219774" Received: from ahunter-desktop.fi.intel.com (HELO [10.237.72.174]) ([10.237.72.174]) by fmsmga008.fm.intel.com with ESMTP; 04 Aug 2021 08:32:54 -0700 Subject: Re: [PATCH V4 2/2] scsi: ufshcd: Fix device links when BOOT WLUN fails to probe From: Adrian Hunter To: "Martin K . Petersen" Cc: Greg Kroah-Hartman , Saravana Kannan , "James E . J . Bottomley" , linux-scsi@vger.kernel.org, Avri Altman , Bean Huo , Can Guo , Asutosh Das , Bart Van Assche , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, "Rafael J . Wysocki" References: <20210716114408.17320-1-adrian.hunter@intel.com> <20210716114408.17320-3-adrian.hunter@intel.com> Organization: Intel Finland Oy, Registered Address: PL 281, 00181 Helsinki, Business Identity Code: 0357606 - 4, Domiciled in Helsinki Message-ID: Date: Wed, 4 Aug 2021 18:33:27 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 Thunderbird/78.12.0 MIME-Version: 1.0 In-Reply-To: <20210716114408.17320-3-adrian.hunter@intel.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Martin, perhaps you could consider picking up this patch if no one objects? On 16/07/21 2:44 pm, Adrian Hunter wrote: > Managed device links are deleted by device_del(). However it is possible to > add a device link to a consumer before device_add(), and then discovering > an error prevents the device from being used. In that case normally > references to the device would be dropped and the device would be deleted. > However the device link holds a reference to the device, so the device link > and device remain indefinitely (unless the supplier is deleted). > > For UFSHCD, if a LUN fails to probe (e.g. absent BOOT WLUN), the device > will not have been registered but can still have a device link holding a > reference to the device. The unwanted device link will prevent runtime > suspend indefinitely. > > Amend device link removal to accept removal of a link with an unregistered > consumer device (suggested by Rafael), and fix UFSHCD by explicitly > deleting the device link when SCSI destroys the SCSI device. > > Fixes: b294ff3e34490 ("scsi: ufs: core: Enable power management for wlun") > Signed-off-by: Adrian Hunter > Reviewed-by: Rafael J. Wysocki > --- > drivers/base/core.c | 2 ++ > drivers/scsi/ufs/ufshcd.c | 23 +++++++++++++++++++++-- > 2 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/drivers/base/core.c b/drivers/base/core.c > index 2de8f7d8cf54..983e895d4ced 100644 > --- a/drivers/base/core.c > +++ b/drivers/base/core.c > @@ -887,6 +887,8 @@ static void device_link_put_kref(struct device_link *link) > { > if (link->flags & DL_FLAG_STATELESS) > kref_put(&link->kref, __device_link_del); > + else if (!device_is_registered(link->consumer)) > + __device_link_del(&link->kref); > else > WARN(1, "Unable to drop a managed device link reference\n"); > } > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c > index 708b3b62fc4d..9864a8ee0263 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -5020,15 +5020,34 @@ static int ufshcd_slave_configure(struct scsi_device *sdev) > static void ufshcd_slave_destroy(struct scsi_device *sdev) > { > struct ufs_hba *hba; > + unsigned long flags; > > hba = shost_priv(sdev->host); > /* Drop the reference as it won't be needed anymore */ > if (ufshcd_scsi_to_upiu_lun(sdev->lun) == UFS_UPIU_UFS_DEVICE_WLUN) { > - unsigned long flags; > - > spin_lock_irqsave(hba->host->host_lock, flags); > hba->sdev_ufs_device = NULL; > spin_unlock_irqrestore(hba->host->host_lock, flags); > + } else if (hba->sdev_ufs_device) { > + struct device *supplier = NULL; > + > + /* Ensure UFS Device WLUN exists and does not disappear */ > + spin_lock_irqsave(hba->host->host_lock, flags); > + if (hba->sdev_ufs_device) { > + supplier = &hba->sdev_ufs_device->sdev_gendev; > + get_device(supplier); > + } > + spin_unlock_irqrestore(hba->host->host_lock, flags); > + > + if (supplier) { > + /* > + * If a LUN fails to probe (e.g. absent BOOT WLUN), the > + * device will not have been registered but can still > + * have a device link holding a reference to the device. > + */ > + device_link_remove(&sdev->sdev_gendev, supplier); > + put_device(supplier); > + } > } > } > >