Revert "blk-mq: Micro-optimize bt_get()"
authorJens Axboe <axboe@fb.com>
Mon, 15 Dec 2014 15:30:26 +0000 (08:30 -0700)
committerJens Axboe <axboe@fb.com>
Mon, 15 Dec 2014 15:30:26 +0000 (08:30 -0700)
This reverts commit 52f7eb945f2ba62b324bb9ae16d945326a961dcf.

The optimization is only really safe for a single queue, otherwise
'bs' and 'bt' can indeed change, and if we don't do a finish_wait()
for each loop, we'll potentially change the wait structure and
corrupt task wait list.

Reported-by: Jan Kara <jack@suse.cz>
block/blk-mq-tag.c

index e3d4e4043b496199d9f1eda8d83318cd1f9b0fe9..32e8dbb9ad1c49f0078e57fae100f0e6a7eb8a73 100644 (file)
@@ -248,8 +248,8 @@ static int bt_get(struct blk_mq_alloc_data *data,
        if (!(data->gfp & __GFP_WAIT))
                return -1;
 
+       bs = bt_wait_ptr(bt, hctx);
        do {
-               bs = bt_wait_ptr(bt, hctx);
                prepare_to_wait(&bs->wait, &wait, TASK_UNINTERRUPTIBLE);
 
                tag = __bt_get(hctx, bt, last_tag);
@@ -285,6 +285,8 @@ static int bt_get(struct blk_mq_alloc_data *data,
                        hctx = data->hctx;
                        bt = &hctx->tags->bitmap_tags;
                }
+               finish_wait(&bs->wait, &wait);
+               bs = bt_wait_ptr(bt, hctx);
        } while (1);
 
        finish_wait(&bs->wait, &wait);