Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp402976pxf; Wed, 10 Mar 2021 08:31:20 -0800 (PST) X-Google-Smtp-Source: ABdhPJz6VTlCfJG3faEYGBAqOMZAORxTvx7mTVTJW6ar3pWTO7X+rormJT6bglztdWM1lpNPUDDU X-Received: by 2002:aa7:db51:: with SMTP id n17mr4410155edt.259.1615393880792; Wed, 10 Mar 2021 08:31:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615393880; cv=none; d=google.com; s=arc-20160816; b=m0VRIMjxNRjVMDtb/LaDVNR1SX36DohajbDvAZ3CSMQOPJaxP14KVmpg5/ZLrstjex nZVWmJgMeNZBUdVxlz2uEqWxORtcKe5QzBC5dSWUZfb/1l4HbUyks9I+8tb/uqCKTnZn 26df3yMSwyJH/FkOxLOU+t+RHQyU6sNQW4c0ocubIkyIB7jesvvyUiqcQsK+Rq/Qr+Em My7cVk6TdwrJ4zYzw9jbrj5ckiBBd/q8rA+I9ACC3CZNngy3npUTQf43j1wW+m2WKJGg hSV+qcAjENnXmYOiqSgo+v1TH7I/6k3k0rORZ3ri6UydHaeVfhHFX8QjvUyeIFcSqRR8 Adsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:user-agent:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date; bh=c81v2THceRGokjPIz+RoBzuQJLtbecZy5yuAPXcXdeo=; b=oJ4UeiA9RfFD6DjGIN5saiQKEkG87FlYaOI9GVwllVaAk15i1uh8UKYwjG597abxzC 2EMWPRwgvjTNMSSPfWpXc2DKW5xngnN/cjYKyf73F9wU2cegWPq/HPkWDUqqMMZQFdYT k/HhRqj86Av5p41iWMWGho4K++bOA4nd+in2TxarqJwyyUxYpq47Z/R0t2Pq55bCuNkk EMTV7fXPhiZjGNDWAWb/4TkBDUE7GJ1R/P/V+HeseJsOufOFxmvzZQSKkLmyaSlMtOef pRYmlU8yTNgE+8MPZpNg+aYIAwhIMoOr1HCiJ5Dq7WCYwGup4gjzXpnngLNBdhNn7uTr Vpog== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r3si1505650eja.625.2021.03.10.08.30.55; Wed, 10 Mar 2021 08:31:20 -0800 (PST) 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230488AbhCJQ1u (ORCPT + 99 others); Wed, 10 Mar 2021 11:27:50 -0500 Received: from netrider.rowland.org ([192.131.102.5]:39555 "HELO netrider.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S229851AbhCJQ1c (ORCPT ); Wed, 10 Mar 2021 11:27:32 -0500 Received: (qmail 223764 invoked by uid 1000); 10 Mar 2021 11:27:30 -0500 Date: Wed, 10 Mar 2021 11:27:30 -0500 From: Alan Stern To: "Asutosh Das \(asd\)" Cc: Bart Van Assche , Adrian Hunter , "Rafael J. Wysocki" , cang@codeaurora.org, "Martin K. Petersen" , "open list:TARGET SUBSYSTEM" , linux-arm-msm , Alim Akhtar , Avri Altman , "James E.J. Bottomley" , Krzysztof Kozlowski , Stanley Chu , Andy Gross , Bjorn Andersson , Steven Rostedt , Ingo Molnar , Matthias Brugger , Kiwoong Kim , Bean Huo , Lee Jones , Wei Yongjun , Dinghao Liu , "Gustavo A. R. Silva" , Tomas Winkler , Jaegeuk Kim , Satya Tangirala , open list , "moderated list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES" , "open list:ARM/SAMSUNG S3C, S5P AND EXYNOS ARM ARCHITECTURES" , "moderated list:UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER..." , Linux-PM mailing list Subject: Re: [PATCH v10 1/2] scsi: ufs: Enable power management for wlun Message-ID: <20210310162730.GB221857@rowland.harvard.edu> References: <0576d6eae15486740c25767e2d8805f7e94eb79d.1614725302.git.asutoshd@codeaurora.org> <85086647-7292-b0a2-d842-290818bd2858@intel.com> <6e98724d-2e75-d1fe-188f-a7010f86c509@codeaurora.org> <20210306161616.GC74411@rowland.harvard.edu> <2bd90336-18a9-9acd-5abb-5b52b27fc535@codeaurora.org> <20210310031438.GB203516@rowland.harvard.edu> <6b985880-f23a-adb3-8b7a-7ee1b56e6fa7@codeaurora.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6b985880-f23a-adb3-8b7a-7ee1b56e6fa7@codeaurora.org> User-Agent: Mutt/1.10.1 (2018-07-13) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Mar 09, 2021 at 08:04:53PM -0800, Asutosh Das (asd) wrote: > On 3/9/2021 7:14 PM, Alan Stern wrote: > > On Tue, Mar 09, 2021 at 07:04:34PM -0800, Asutosh Das (asd) wrote: > > > Hello > > > I & Can (thanks CanG) debugged this further: > > > > > > Looks like this issue can occur if the sd probe is asynchronous. > > > > > > Essentially, the sd_probe() is done asynchronously and driver_probe_device() > > > invokes pm_runtime_get_suppliers() before invoking sd_probe(). > > > > > > But scsi_probe_and_add_lun() runs in a separate context. > > > So the scsi_autopm_put_device() invoked from scsi_scan_host() context > > > reduces the link->rpm_active to 1. And sd_probe() invokes > > > scsi_autopm_put_device() and starts a timer. And then driver_probe_device() > > > invoked from __device_attach_async_helper context reduces the > > > link->rpm_active to 1 thus enabling the supplier to suspend before the > > > consumer suspends. > > > > > I don't see a way around this. Please let me know if you > > > (@Alan/@Bart/@Adrian) have any thoughts on this. > > > > How about changing the SCSI core so that it does a runtime_get before > > starting an async probe, and the async probe routine does a > > runtime_put when it is finished? In other words, don't allow a device > > to go into runtime suspend while it is waiting to be probed. > > > > I don't think that would be too intrusive. > > > > Alan Stern > > > > Hi Alan > Thanks for the suggestion. > > Am trying to understand: > > Do you mean something like this: > > int scsi_sysfs_add_sdev(struct scsi_device *sdev) > { > > scsi_autopm_get_device(sdev); > pm_runtime_get_noresume(&sdev->sdev_gendev); > [...] > scsi_autopm_put_device(sdev); > [...] > } > > static int sd_probe(struct device *dev) > { > [...] > pm_runtime_put_noidle(dev); > scsi_autopm_put_device(sdp); > [...] > } > > This may work (I'm limited by my imagination in scsi layer :) ). I'm not sure about this. To be honest, I did not read the entirety of your last message; it had way too much detail. THere's a time and place for that, but when you're brainstorming to figure out the underlying cause of a problem and come up with a strategy to fix it, you want to concentrate on the overall picture, not the details. As I understand the situation, you've get a SCSI target with multiple logical units, let's say A and B, and you need to make sure that A never goes into runtime suspend unless B is already suspended. In other words, B always has to suspend before A and resume after A. To do this, you register a device link with A as the supplier and B as the consumer. Then the PM core takes care of the ordering for you. But I don't understand when you set up the device link. If the timing is wrong then, thanks to async SCSI probing, you may have a situation where A is registered before B and before the link is set up. Then there's temporarily nothing to stop A from suspending before B. You also need to prevent each device from suspending before it is probed. That's the easy part I was trying to address before (although it may not be so easy if the drivers are in loadable modules and not present in the kernel). You need to think through these issues before proposing actual changes. > But the pm_runtime_put_noidle() would have to be added to all registered > scsi_driver{}, perhaps? Or may be I can check for sdp->type? Like this; it's too early to worry about this sort of thing. Alan Stern