linux-block.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Josef Bacik <josef@toxicpanda.com>
To: axboe@kernel.dk, kernel-team@fb.com, linux-block@vger.kernel.org,
	peterz@infradead.org, oleg@redhat.com
Subject: [PATCH 2/5] rq-qos: fix missed wake-ups in rq_qos_throttle
Date: Tue, 16 Jul 2019 16:19:26 -0400	[thread overview]
Message-ID: <20190716201929.79142-3-josef@toxicpanda.com> (raw)
In-Reply-To: <20190716201929.79142-1-josef@toxicpanda.com>

We saw a hang in production with WBT where there was only one waiter in
the throttle path and no outstanding IO.  This is because of the
has_sleepers optimization that is used to make sure we don't steal an
inflight counter for new submitters when there are people already on the
list.

We can race with our check to see if the waitqueue has any waiters (this
is done locklessly) and the time we actually add ourselves to the
waitqueue.  If this happens we'll go to sleep and never be woken up
because nobody is doing IO to wake us up.

Fix this by checking if the waitqueue has a single sleeper on the list
after we add ourselves, that way we have an uptodate view of the list.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
 block/blk-rq-qos.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/block/blk-rq-qos.c b/block/blk-rq-qos.c
index 659ccb8b693f..67a0a4c07060 100644
--- a/block/blk-rq-qos.c
+++ b/block/blk-rq-qos.c
@@ -244,6 +244,7 @@ void rq_qos_wait(struct rq_wait *rqw, void *private_data,
 		return;
 
 	prepare_to_wait_exclusive(&rqw->wait, &data.wq, TASK_UNINTERRUPTIBLE);
+	has_sleeper = !wq_has_single_sleeper(&rqw->wait);
 	do {
 		if (data.got_token)
 			break;
-- 
2.17.1


  parent reply	other threads:[~2019-07-16 20:19 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-16 20:19 [PATCH 0/5][v3] rq-qos memory barrier shenanigans Josef Bacik
2019-07-16 20:19 ` [PATCH 1/5] wait: add wq_has_single_sleeper helper Josef Bacik
2019-07-16 20:19 ` Josef Bacik [this message]
2019-07-16 20:19 ` [PATCH 3/5] rq-qos: don't reset has_sleepers on spurious wakeups Josef Bacik
2019-07-16 20:19 ` [PATCH 4/5] rq-qos: set ourself TASK_UNINTERRUPTIBLE after we schedule Josef Bacik
2019-07-16 20:19 ` [PATCH 5/5] rq-qos: use a mb for got_token Josef Bacik
2019-07-18 15:56 ` [PATCH 0/5][v3] rq-qos memory barrier shenanigans Oleg Nesterov
2019-07-18 16:20 ` Jens Axboe

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=20190716201929.79142-3-josef@toxicpanda.com \
    --to=josef@toxicpanda.com \
    --cc=axboe@kernel.dk \
    --cc=kernel-team@fb.com \
    --cc=linux-block@vger.kernel.org \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).