blk-mq: make sure that correct hctx->next_cpu is set
authorMing Lei <ming.lei@redhat.com>
Sun, 8 Apr 2018 09:48:07 +0000 (17:48 +0800)
committerJens Axboe <axboe@kernel.dk>
Tue, 10 Apr 2018 14:38:46 +0000 (08:38 -0600)
From commit 20e4d81393196 (blk-mq: simplify queue mapping & schedule
with each possisble CPU), one hctx can be mapped from all offline CPUs,
then hctx->next_cpu can be set as wrong.

This patch fixes this issue by making hctx->next_cpu pointing to the
first CPU in hctx->cpumask if all CPUs in hctx->cpumask are offline.

Cc: Stefan Haberland <sth@linux.vnet.ibm.com>
Tested-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Fixes: 20e4d81393196 ("blk-mq: simplify queue mapping & schedule with each possisble CPU")
Cc: stable@vger.kernel.org
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c

index 90f869a083a4c928551cb615f3d2c73f1a97bcaa..f489ec9208071e2859777f64d8ebda1308a5d084 100644 (file)
@@ -2431,6 +2431,8 @@ static void blk_mq_map_swqueue(struct request_queue *q)
                 */
                hctx->next_cpu = cpumask_first_and(hctx->cpumask,
                                cpu_online_mask);
+               if (hctx->next_cpu >= nr_cpu_ids)
+                       hctx->next_cpu = cpumask_first(hctx->cpumask);
                hctx->next_cpu_batch = BLK_MQ_CPU_WORK_BATCH;
        }
 }