mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Ming Lei <tom.leiming@gmail.com>
To: Jens Axboe <axboe@kernel.dk>, linux-kernel@vger.kernel.org
Cc: Ming Lei <tom.leiming@gmail.com>
Subject: [PATCH 5/5] blk-mq: bitmap tag: fix wait batch for allocation
Date: Sun, 11 May 2014 01:01:52 +0800	[thread overview]
Message-ID: <1399741312-10453-6-git-send-email-tom.leiming@gmail.com> (raw)
In-Reply-To: <1399741312-10453-1-git-send-email-tom.leiming@gmail.com>

One interesting point of bitmap tag allocation is that
it may wait for at least BT_WAIT_BATCH times tag free
for a blocked allocation. Obviously, it may hang allocation
if the depth is smaller than BT_WAIT_BATCH.

This patch simply sets the wait count as 1 if depth is
smaller than BT_WAIT_BATCH to avoid the problem.

Maybe better idea is that it should be set as one ratio
of depth(1/8 or others), but it may need more tests for
verification.

Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
 block/blk-mq-tag.c |   14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c
index 6532aea..8e3a22d 100644
--- a/block/blk-mq-tag.c
+++ b/block/blk-mq-tag.c
@@ -135,6 +135,16 @@ static struct bt_wait_state *bt_wait_ptr(struct blk_mq_bitmap_tags *bt,
 	return bs;
 }
 
+static void bs_reset_wait_cnt(struct blk_mq_bitmap_tags *bt,
+		struct bt_wait_state *bs)
+{
+	int cnt;
+
+	cnt = bt->depth < BT_WAIT_BATCH ? 1 : BT_WAIT_BATCH;
+
+	atomic_set(&bs->wait_cnt, cnt);
+}
+
 static int bt_get(struct blk_mq_bitmap_tags *bt, struct blk_mq_hw_ctx *hctx,
 		  unsigned int *last_tag, gfp_t gfp)
 {
@@ -160,7 +170,7 @@ static int bt_get(struct blk_mq_bitmap_tags *bt, struct blk_mq_hw_ctx *hctx,
 			break;
 
 		if (was_empty)
-			atomic_set(&bs->wait_cnt, BT_WAIT_BATCH);
+			bs_reset_wait_cnt(bt, bs);
 
 		io_schedule();
 	} while (1);
@@ -243,7 +253,7 @@ static void bt_clear_tag(struct blk_mq_bitmap_tags *bt, unsigned int tag)
 
 	bs = bt_wake_ptr(bt);
 	if (bs && atomic_dec_and_test(&bs->wait_cnt)) {
-		atomic_set(&bs->wait_cnt, BT_WAIT_BATCH);
+		bs_reset_wait_cnt(bt, bs);
 		bt_index_inc(&bt->wake_index);
 		wake_up(&bs->wait);
 	}
-- 
1.7.9.5


  parent reply	other threads:[~2014-05-10 17:02 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-10 17:01 [PATCH 0/5] blk-mq: bitmap tag: fix and cleanup Ming Lei
2014-05-10 17:01 ` [PATCH 1/5] blk-mq: bitmap tag: use clear_bit_unlock in bt_clear_tag() Ming Lei
2014-05-10 17:01 ` [PATCH 2/5] blk-mq: bitmap tag: remove barrier " Ming Lei
2014-05-10 17:01 ` [PATCH 3/5] blk-mq: bitmap tag: select random tag betweet 0 and (depth - 1) Ming Lei
2014-05-10 17:01 ` [PATCH 4/5] blk-mq: bitmap tag: cleanup blk_mq_init_tags Ming Lei
2014-05-10 17:01 ` Ming Lei [this message]
2014-05-10 19:39 ` [PATCH 0/5] blk-mq: bitmap tag: fix and cleanup Jens Axboe
2014-05-11  1:13   ` Ming Lei

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=1399741312-10453-6-git-send-email-tom.leiming@gmail.com \
    --to=tom.leiming@gmail.com \
    --cc=axboe@kernel.dk \
    --cc=linux-kernel@vger.kernel.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

Powered by JetHome