Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp2982302ybt; Mon, 29 Jun 2020 12:04:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxaIzB/A9QU2vmMVuh5pzhXZRJbwIs0PDPSsUw98ncoBWvvYnIRiRInmeYYOxNjYamo00fX X-Received: by 2002:a05:6402:1c86:: with SMTP id cy6mr6169808edb.30.1593457494466; Mon, 29 Jun 2020 12:04:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593457494; cv=none; d=google.com; s=arc-20160816; b=t8tItOF2wugmebguf5mdcLYhAhSqh7FSvcU+DstaDg62pOj8D4y2buFzxwM0OtbE3W a0T1/3iR+z/MjkzDnMiuYjNKlYZpnNALhwUwVcqSwLb5twpgjcVMvTdZ0bYB4+AI8mOk Wbo6xco9BUnL91PjuK5Ym4GZWfPx9QfqNLA37uU09Eau598V8Bi1/lv+AdcM31WxkkXB 4k3nKrTGnKKWoO/4mwqihNU92jS5RTmkrlOfVeokXPNi7LYdSj93l9qq2xh5irkFPID5 o1Rk8Yt2qm99BwqoNTniSXfFSVpsvDEWRmMecz9DExIW2IcuKshSrHgH9hEcCjGk99TO maiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=sNdIAJ5g81rJhkCbzIoj0+0d+LWfg+ejf8xVnuYhdio=; b=k+iJzLVyWpmacc6IuPD7m50m5DGNK0IZPRBG/CcOxsI5kFhIwU7MCji511oMHNFNSf OouglBazYsKsNbvy5YpAySsox3aveHidFDXOupjgchTIXZxhXSYVu2evKTxeN7g+c8Pi c5ZqAN4aF/aOYBWAD5XzYTdm2hJonjJJSVKQeLzQLeMX0h8nx40Qpwwncm5TboigdUS+ 63lzm621kv7NQ7wGyeZ5pQiGivfkXjAC3gqbarTf8e7bfmyev4+nyYSzw04vWkJuDoyq OEfXXT69daqkn6Wm4a8/gxzO++9W8hyv/o9kj8IqClFBXiNW/qxuakGz2JGoiGa6RXS2 wExw== 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 bj4si315519ejb.540.2020.06.29.12.04.31; Mon, 29 Jun 2020 12:04:54 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730502AbgF2TCW (ORCPT + 99 others); Mon, 29 Jun 2020 15:02:22 -0400 Received: from netrider.rowland.org ([192.131.102.5]:38783 "HELO netrider.rowland.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1730499AbgF2TCT (ORCPT ); Mon, 29 Jun 2020 15:02:19 -0400 Received: (qmail 406595 invoked by uid 1000); 29 Jun 2020 12:15:36 -0400 Date: Mon, 29 Jun 2020 12:15:36 -0400 From: Alan Stern To: Martin Kepplinger Cc: Bart Van Assche , jejb@linux.ibm.com, Can Guo , martin.petersen@oracle.com, linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, kernel@puri.sm Subject: Re: [PATCH] scsi: sd: add runtime pm to open / release Message-ID: <20200629161536.GA405175@rowland.harvard.edu> References: <20200623111018.31954-1-martin.kepplinger@puri.sm> <1379e21d-c51a-3710-e185-c2d7a9681fb7@acm.org> <20200626154441.GA296771@rowland.harvard.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Jun 29, 2020 at 11:42:59AM +0200, Martin Kepplinger wrote: > > > On 26.06.20 17:44, Alan Stern wrote: > > Martin's best approach would be to add some debugging code to find out why > > blk_queue_enter() isn't calling bkl_pm_request_resume(), or why that call > > doesn't lead to pm_request_resume(). > > > > Alan Stern > > > > Hi Alan, > > blk_queue_enter() always - especially when sd is runtime suspended and I > try to mount as above - sets success to be true for me, so never > continues down to bkl_pm_request_resume(). All I see is "PM: Removing > info for No Bus:sda1". Aha. Looking at this more closely, it's apparent that the code in blk-core.c contains a logic bug: It assumes that if the BLK_MQ_REQ_PREEMPT flag is set then the request can be issued regardless of the queue's runtime status. That is not correct when the queue is suspended. Below is my attempt to fix this up. I'm not sure that the patch is entirely correct, but it should fix this logic bug. I would appreciate a critical review. Martin, does this fix the problem? Alan Stern Index: usb-devel/block/blk-core.c =================================================================== --- usb-devel.orig/block/blk-core.c +++ usb-devel/block/blk-core.c @@ -423,7 +423,8 @@ int blk_queue_enter(struct request_queue * responsible for ensuring that that counter is * globally visible before the queue is unfrozen. */ - if (pm || !blk_queue_pm_only(q)) { + if ((pm && q->rpm_status != RPM_SUSPENDED) || + !blk_queue_pm_only(q)) { success = true; } else { percpu_ref_put(&q->q_usage_counter); @@ -448,8 +449,7 @@ int blk_queue_enter(struct request_queue wait_event(q->mq_freeze_wq, (!q->mq_freeze_depth && - (pm || (blk_pm_request_resume(q), - !blk_queue_pm_only(q)))) || + blk_pm_resume_queue(pm, q)) || blk_queue_dying(q)); if (blk_queue_dying(q)) return -ENODEV; Index: usb-devel/block/blk-pm.h =================================================================== --- usb-devel.orig/block/blk-pm.h +++ usb-devel/block/blk-pm.h @@ -6,11 +6,14 @@ #include #ifdef CONFIG_PM -static inline void blk_pm_request_resume(struct request_queue *q) +static inline int blk_pm_resume_queue(const bool pm, struct request_queue *q) { - if (q->dev && (q->rpm_status == RPM_SUSPENDED || - q->rpm_status == RPM_SUSPENDING)) - pm_request_resume(q->dev); + if (!q->dev || !blk_queue_pm_only(q)) + return 1; /* Nothing to do */ + if (pm && q->rpm_status != RPM_SUSPENDED) + return 1; /* Request allowed */ + pm_request_resume(q->dev); + return 0; } static inline void blk_pm_mark_last_busy(struct request *rq) @@ -44,8 +47,9 @@ static inline void blk_pm_put_request(st --rq->q->nr_pending; } #else -static inline void blk_pm_request_resume(struct request_queue *q) +static inline int blk_pm_resume_queue(const bool pm, struct request_queue *q) { + return 1; } static inline void blk_pm_mark_last_busy(struct request *rq)