All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alan Stern <stern@rowland.harvard.edu>
To: Bart Van Assche <bvanassche@acm.org>
Cc: Stanley Chu <stanley.chu@mediatek.com>,
	Jens Axboe <axboe@kernel.dk>,
	linux-block@vger.kernel.org, Christoph Hellwig <hch@lst.de>,
	Ming Lei <ming.lei@redhat.com>, stable <stable@vger.kernel.org>,
	Can Guo <cang@codeaurora.org>,
	"Martin K. Petersen" <martin.petersen@oracle.com>
Subject: Re: [PATCH] block: Fix a race in the runtime power management code
Date: Thu, 27 Aug 2020 16:33:21 -0400	[thread overview]
Message-ID: <20200827203321.GB449067@rowland.harvard.edu> (raw)
In-Reply-To: <af1b1f57-59ff-0133-8108-0f3d1e1254e1@acm.org>

On Wed, Aug 26, 2020 at 08:35:42PM -0700, Bart Van Assche wrote:
> On 2020-08-25 18:51, Alan Stern wrote:
> > Ah, perfect.  So in blk_queue_enter(), pm should be defined in terms of 
> > RQF_PM rather than BLK_MQ_REQ_PREEMPT.
> > 
> > The difficulty is that the flags argument is the wrong type; RQF_PM is 
> > defined as req_flags_t, not blk_mq_req_flags_t.  It is associated with a 
> > particular request after the request has been created, so after 
> > blk_queue_enter() has been called.
> > 
> > How can we solve this?
> 
> The current code looks a bit weird because my focus when modifying the PM
> code has been on not breaking any existing code.
> 
> scsi_device_quiesce() relies on blk_queue_enter() processing all PREEMPT
> requests. A difficulty is that scsi_device_quiesce() is used for two
> separate purposes:
> * Runtime power management.
> * SCSI domain validation. See e.g. https://lwn.net/Articles/75917/.
> 
> I think that modifying blk_queue_enter() such that it only accepts PM
> requests will require to split scsi_device_quiesce() into two functions:
> one function that is used by the runtime power management code and another
> function that is used by the SCSI domain validation code. This may require
> to introduce new SCSI device states. If new SCSI device states are
> introduced, that should be done without modifying the state that is
> reported to user space. See also sdev_states[] and show_state_field in
> scsi_sysfs.c.

It may not need to be that complicated.  what about something like this?

Alan Stern


Index: usb-devel/block/blk-core.c
===================================================================
--- usb-devel.orig/block/blk-core.c
+++ usb-devel/block/blk-core.c
@@ -420,11 +420,11 @@ EXPORT_SYMBOL(blk_cleanup_queue);
 /**
  * blk_queue_enter() - try to increase q->q_usage_counter
  * @q: request queue pointer
- * @flags: BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PREEMPT
+ * @flags: BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PM
  */
 int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)
 {
-	const bool pm = flags & BLK_MQ_REQ_PREEMPT;
+	const bool pm = flags & BLK_MQ_REQ_PM;
 
 	while (true) {
 		bool success = false;
@@ -626,7 +626,8 @@ struct request *blk_get_request(struct r
 	struct request *req;
 
 	WARN_ON_ONCE(op & REQ_NOWAIT);
-	WARN_ON_ONCE(flags & ~(BLK_MQ_REQ_NOWAIT | BLK_MQ_REQ_PREEMPT));
+	WARN_ON_ONCE(flags & ~(BLK_MQ_REQ_NOWAIT | BLK_MQ_REQ_PREEMPT |
+			BLK_MQ_REQ_PM));
 
 	req = blk_mq_alloc_request(q, op, flags);
 	if (!IS_ERR(req) && q->mq_ops->initialize_rq_fn)
Index: usb-devel/drivers/scsi/scsi_lib.c
===================================================================
--- usb-devel.orig/drivers/scsi/scsi_lib.c
+++ usb-devel/drivers/scsi/scsi_lib.c
@@ -245,11 +245,15 @@ int __scsi_execute(struct scsi_device *s
 {
 	struct request *req;
 	struct scsi_request *rq;
+	blk_mq_req_flags_t mq_req_flags;
 	int ret = DRIVER_ERROR << 24;
 
+	mq_req_flags = BLK_MQ_REQ_PREEMPT;
+	if (rq_flags & RQF_PM)
+		mq_req_flags |= BLK_MQ_REQ_PM;
 	req = blk_get_request(sdev->request_queue,
 			data_direction == DMA_TO_DEVICE ?
-			REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN, BLK_MQ_REQ_PREEMPT);
+			REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN, mq_req_flags);
 	if (IS_ERR(req))
 		return ret;
 	rq = scsi_req(req);
Index: usb-devel/include/linux/blk-mq.h
===================================================================
--- usb-devel.orig/include/linux/blk-mq.h
+++ usb-devel/include/linux/blk-mq.h
@@ -435,6 +435,8 @@ enum {
 	BLK_MQ_REQ_RESERVED	= (__force blk_mq_req_flags_t)(1 << 1),
 	/* set RQF_PREEMPT */
 	BLK_MQ_REQ_PREEMPT	= (__force blk_mq_req_flags_t)(1 << 3),
+	/* used for power management */
+	BLK_MQ_REQ_PM		= (__force blk_mq_req_flags_t)(1 << 4),
 };
 
 struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,


  reply	other threads:[~2020-08-27 20:33 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-24  3:06 [PATCH] block: Fix a race in the runtime power management code Bart Van Assche
2020-08-24 14:47 ` Alan Stern
2020-08-25  9:01 ` Stanley Chu
2020-08-25  9:11 ` Stanley Chu
2020-08-25 18:24   ` Alan Stern
2020-08-25 22:22     ` Bart Van Assche
2020-08-26  1:51       ` Alan Stern
2020-08-27  3:35         ` Bart Van Assche
2020-08-27 20:33           ` Alan Stern [this message]
2020-08-28  3:27             ` Bart Van Assche
2020-08-28 15:37               ` Alan Stern
2020-08-29  0:51                 ` Bart Van Assche
2020-08-29  1:12                   ` Alan Stern
2020-08-29  2:57                     ` Bart Van Assche
2020-08-26  2:58   ` Bart Van Assche
2020-08-26  4:00     ` Stanley Chu

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=20200827203321.GB449067@rowland.harvard.edu \
    --to=stern@rowland.harvard.edu \
    --cc=axboe@kernel.dk \
    --cc=bvanassche@acm.org \
    --cc=cang@codeaurora.org \
    --cc=hch@lst.de \
    --cc=linux-block@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=ming.lei@redhat.com \
    --cc=stable@vger.kernel.org \
    --cc=stanley.chu@mediatek.com \
    /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 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.