From: Bart Van Assche <bvanassche@acm.org>
To: "Martin K . Petersen" <martin.petersen@oracle.com>
Cc: "James E . J . Bottomley" <jejb@linux.vnet.ibm.com>,
Jens Axboe <axboe@kernel.dk>, Christoph Hellwig <hch@lst.de>,
Hannes Reinecke <hare@suse.de>, Ming Lei <ming.lei@redhat.com>,
linux-scsi@vger.kernel.org, linux-block@vger.kernel.org,
Bart Van Assche <bvanassche@acm.org>,
Alan Stern <stern@rowland.harvard.edu>,
Stanley Chu <stanley.chu@mediatek.com>,
"Rafael J . Wysocki" <rafael.j.wysocki@intel.com>,
stable <stable@vger.kernel.org>, Can Guo <cang@codeaurora.org>
Subject: [PATCH v5 1/8] block: Fix a race in the runtime power management code
Date: Tue, 8 Dec 2020 21:29:44 -0800 [thread overview]
Message-ID: <20201209052951.16136-2-bvanassche@acm.org> (raw)
In-Reply-To: <20201209052951.16136-1-bvanassche@acm.org>
With the current implementation the following race can happen:
* blk_pre_runtime_suspend() calls blk_freeze_queue_start() and
blk_mq_unfreeze_queue().
* blk_queue_enter() calls blk_queue_pm_only() and that function returns
true.
* blk_queue_enter() calls blk_pm_request_resume() and that function does
not call pm_request_resume() because the queue runtime status is
RPM_ACTIVE.
* blk_pre_runtime_suspend() changes the queue status into RPM_SUSPENDING.
Fix this race by changing the queue runtime status into RPM_SUSPENDING
before switching q_usage_counter to atomic mode.
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Cc: Ming Lei <ming.lei@redhat.com>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: stable <stable@vger.kernel.org>
Fixes: 986d413b7c15 ("blk-mq: Enable support for runtime power management")
Signed-off-by: Can Guo <cang@codeaurora.org>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
block/blk-pm.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/block/blk-pm.c b/block/blk-pm.c
index b85234d758f7..17bd020268d4 100644
--- a/block/blk-pm.c
+++ b/block/blk-pm.c
@@ -67,6 +67,10 @@ int blk_pre_runtime_suspend(struct request_queue *q)
WARN_ON_ONCE(q->rpm_status != RPM_ACTIVE);
+ spin_lock_irq(&q->queue_lock);
+ q->rpm_status = RPM_SUSPENDING;
+ spin_unlock_irq(&q->queue_lock);
+
/*
* Increase the pm_only counter before checking whether any
* non-PM blk_queue_enter() calls are in progress to avoid that any
@@ -89,15 +93,14 @@ int blk_pre_runtime_suspend(struct request_queue *q)
/* Switch q_usage_counter back to per-cpu mode. */
blk_mq_unfreeze_queue(q);
- spin_lock_irq(&q->queue_lock);
- if (ret < 0)
+ if (ret < 0) {
+ spin_lock_irq(&q->queue_lock);
+ q->rpm_status = RPM_ACTIVE;
pm_runtime_mark_last_busy(q->dev);
- else
- q->rpm_status = RPM_SUSPENDING;
- spin_unlock_irq(&q->queue_lock);
+ spin_unlock_irq(&q->queue_lock);
- if (ret)
blk_clear_pm_only(q);
+ }
return ret;
}
next prev parent reply other threads:[~2020-12-09 5:31 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-09 5:29 [PATCH v5 0/8] Rework runtime suspend and SPI domain validation Bart Van Assche
2020-12-09 5:29 ` Bart Van Assche [this message]
2020-12-09 5:29 ` [PATCH v5 2/8] block: Introduce BLK_MQ_REQ_PM Bart Van Assche
2020-12-09 6:06 ` Can Guo
2020-12-09 5:29 ` [PATCH v5 3/8] ide: Do not set the RQF_PREEMPT flag for sense requests Bart Van Assche
2020-12-09 5:29 ` [PATCH v5 4/8] ide: Mark power management requests with RQF_PM instead of RQF_PREEMPT Bart Van Assche
2020-12-09 5:29 ` [PATCH v5 5/8] scsi_transport_spi: Set RQF_PM for domain validation commands Bart Van Assche
2020-12-09 7:34 ` Hannes Reinecke
2020-12-09 5:29 ` [PATCH v5 6/8] scsi: Only process PM requests if rpm_status != RPM_ACTIVE Bart Van Assche
2020-12-09 6:06 ` Can Guo
2020-12-09 5:29 ` [PATCH v5 7/8] block: Remove RQF_PREEMPT and BLK_MQ_REQ_PREEMPT Bart Van Assche
2020-12-09 6:05 ` Can Guo
2020-12-09 5:29 ` [PATCH v5 8/8] block: Do not accept any requests while suspended Bart Van Assche
2020-12-09 6:04 ` Can Guo
2020-12-09 7:36 ` Hannes Reinecke
2020-12-09 16:44 ` [PATCH v5 0/8] Rework runtime suspend and SPI domain validation Martin K. Petersen
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=20201209052951.16136-2-bvanassche@acm.org \
--to=bvanassche@acm.org \
--cc=axboe@kernel.dk \
--cc=cang@codeaurora.org \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=jejb@linux.vnet.ibm.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=ming.lei@redhat.com \
--cc=rafael.j.wysocki@intel.com \
--cc=stable@vger.kernel.org \
--cc=stanley.chu@mediatek.com \
--cc=stern@rowland.harvard.edu \
/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.