From: Jens Axboe Date: Fri, 17 Apr 2015 14:28:50 +0000 (-0600) Subject: blk-mq: fix iteration of busy bitmap X-Git-Tag: v4.1-rc1~100^2 X-Git-Url: https://git.kernel.dk/?p=linux-2.6-block.git;a=commitdiff_plain;h=569fd0ce96087283866ab8c438dac4bcf1738846 blk-mq: fix iteration of busy bitmap Commit 889fa31f00b2 was a bit too eager in reducing the loop count, so we ended up missing queues in some configurations. Ensure that our division rounds up, so that's not the case. Reported-by: Guenter Roeck Fixes: 889fa31f00b2 ("blk-mq: reduce unnecessary software queue looping") Signed-off-by: Jens Axboe --- diff --git a/block/blk-mq.c b/block/blk-mq.c index c82de08f3721..ade8a2d1b0aa 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -41,7 +41,7 @@ static bool blk_mq_hctx_has_pending(struct blk_mq_hw_ctx *hctx) { unsigned int i; - for (i = 0; i < hctx->ctx_map.map_size; i++) + for (i = 0; i < hctx->ctx_map.size; i++) if (hctx->ctx_map.map[i].word) return true; @@ -730,7 +730,7 @@ static void flush_busy_ctxs(struct blk_mq_hw_ctx *hctx, struct list_head *list) struct blk_mq_ctx *ctx; int i; - for (i = 0; i < hctx->ctx_map.map_size; i++) { + for (i = 0; i < hctx->ctx_map.size; i++) { struct blk_align_bitmap *bm = &hctx->ctx_map.map[i]; unsigned int off, bit; @@ -1818,7 +1818,7 @@ static void blk_mq_map_swqueue(struct request_queue *q) * This is more accurate and more efficient than looping * over all possibly mapped software queues. */ - map->map_size = hctx->nr_ctx / map->bits_per_word; + map->size = DIV_ROUND_UP(hctx->nr_ctx, map->bits_per_word); /* * Initialize batch roundrobin counts diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 8210e8797c12..2056a99b92f8 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -13,7 +13,7 @@ struct blk_mq_cpu_notifier { }; struct blk_mq_ctxmap { - unsigned int map_size; + unsigned int size; unsigned int bits_per_word; struct blk_align_bitmap *map; };