projects
/
firefly-linux-kernel-4.4.55.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
67e2c38
)
Revert "blk-mq: Micro-optimize bt_get()"
author
Jens Axboe
<axboe@fb.com>
Mon, 15 Dec 2014 15:30:26 +0000
(08:30 -0700)
committer
Jens 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
patch
|
blob
|
history
diff --git
a/block/blk-mq-tag.c
b/block/blk-mq-tag.c
index e3d4e4043b496199d9f1eda8d83318cd1f9b0fe9..32e8dbb9ad1c49f0078e57fae100f0e6a7eb8a73 100644
(file)
--- a/
block/blk-mq-tag.c
+++ b/
block/blk-mq-tag.c
@@
-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);