Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0d0b7d42 authored by Jose Alonso's avatar Jose Alonso Committed by Jens Axboe
Browse files

blk-mq: for_each_* macro correctness



I observed that there are for_each macros that do an extra memory access
beyond the defined area.
Normally this does not cause problems.
But, this can cause exceptions. For example: if the area is allocated at
the end of a page and the next page is not accessible.

For correctness, I suggest changing the arguments of the 'for loop' like
others 'for_each' do in the kernel.

Signed-off-by: default avatarJose Alonso <joalonsof@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 17a05cca
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -158,16 +158,16 @@ static inline struct request *blk_mq_tag_to_rq(struct blk_mq_hw_ctx *hctx,
}

#define queue_for_each_hw_ctx(q, hctx, i)				\
	for ((i) = 0, hctx = (q)->queue_hw_ctx[0];			\
	     (i) < (q)->nr_hw_queues; (i)++, hctx = (q)->queue_hw_ctx[i])
	for ((i) = 0; (i) < (q)->nr_hw_queues &&			\
	     ({ hctx = (q)->queue_hw_ctx[i]; 1; }); (i)++)

#define queue_for_each_ctx(q, ctx, i)					\
	for ((i) = 0, ctx = per_cpu_ptr((q)->queue_ctx, 0);		\
	     (i) < (q)->nr_queues; (i)++, ctx = per_cpu_ptr(q->queue_ctx, (i)))
	for ((i) = 0; (i) < (q)->nr_queues &&				\
	     ({ ctx = per_cpu_ptr((q)->queue_ctx, (i)); 1; }); (i)++)

#define hctx_for_each_ctx(hctx, ctx, i)					\
	for ((i) = 0, ctx = (hctx)->ctxs[0];				\
	     (i) < (hctx)->nr_ctx; (i)++, ctx = (hctx)->ctxs[(i)])
	for ((i) = 0; (i) < (hctx)->nr_ctx &&				\
	     ({ ctx = (hctx)->ctxs[(i)]; 1; }); (i)++)

#define blk_ctx_sum(q, sum)						\
({									\