diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-03-19 11:30:33 +0100 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-03-20 09:34:02 -0600 |
commit | 897bb0c7f1ea82d7cc882b19790b5e1df00ffc29 (patch) | |
tree | 97b9ef1ba99b9c0f76ca57e398a55fa124ec3f7e /block/blk-mq.c | |
parent | 5173cb814b36439a9d9537016965e75798b9f130 (diff) | |
download | lwn-897bb0c7f1ea82d7cc882b19790b5e1df00ffc29.tar.gz lwn-897bb0c7f1ea82d7cc882b19790b5e1df00ffc29.zip |
blk-mq: Use proper cpumask iterator
queue_for_each_ctx() iterates over per_cpu variables under the assumption that
the possible cpu mask cannot have holes. That's wrong as all cpumasks can have
holes. In case there are holes the iteration ends up accessing uninitialized
memory and crashing as a result.
Replace the macro by a proper for_each_possible_cpu() loop and drop the unused
macro blk_ctx_sum() which references queue_for_each_ctx().
Reported-by: Xiong Zhou <jencce.kernel@gmail.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block/blk-mq.c')
-rw-r--r-- | block/blk-mq.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index 050f7a13021b..1699baf39b78 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1798,11 +1798,12 @@ static void blk_mq_map_swqueue(struct request_queue *q, /* * Map software to hardware queues */ - queue_for_each_ctx(q, ctx, i) { + for_each_possible_cpu(i) { /* If the cpu isn't online, the cpu is mapped to first hctx */ if (!cpumask_test_cpu(i, online_mask)) continue; + ctx = per_cpu_ptr(q->queue_ctx, i); hctx = q->mq_ops->map_queue(q, i); cpumask_set_cpu(i, hctx->cpumask); |