diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-mq-tag.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index eb55492e6875..bab4bff15f42 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c | |||
@@ -261,6 +261,14 @@ static int bt_get(struct blk_mq_alloc_data *data, | |||
261 | */ | 261 | */ |
262 | blk_mq_run_hw_queue(hctx, false); | 262 | blk_mq_run_hw_queue(hctx, false); |
263 | 263 | ||
264 | /* | ||
265 | * Retry tag allocation after running the hardware queue, | ||
266 | * as running the queue may also have found completions. | ||
267 | */ | ||
268 | tag = __bt_get(hctx, bt, last_tag); | ||
269 | if (tag != -1) | ||
270 | break; | ||
271 | |||
264 | blk_mq_put_ctx(data->ctx); | 272 | blk_mq_put_ctx(data->ctx); |
265 | 273 | ||
266 | io_schedule(); | 274 | io_schedule(); |