Commit 38cfdd9d authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring/fdinfo: be a bit nicer when looping a lot of SQEs/CQEs



Add cond_resched() in those dump loops, just in case a lot of entries
are being dumped. And detect invalid CQ ring head/tail entries, to avoid
iterating more than what is necessary. Generally not an issue, but can be
if things like KASAN or other debugging metrics are enabled.

Reported-by: default avatar是参差 <shicenci@gmail.com>
Link: https://lore.kernel.org/all/PS1PPF7E1D7501FE5631002D242DD89403FAB9BA@PS1PPF7E1D7501F.apcprd02.prod.outlook.com/


Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent b1dfe4e0
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
	unsigned int cq_head = READ_ONCE(r->cq.head);
	unsigned int cq_tail = READ_ONCE(r->cq.tail);
	unsigned int sq_shift = 0;
	unsigned int sq_entries;
	unsigned int cq_entries, sq_entries;
	int sq_pid = -1, sq_cpu = -1;
	u64 sq_total_time = 0, sq_work_time = 0;
	unsigned int i;
@@ -146,9 +146,11 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
			}
		}
		seq_printf(m, "\n");
		cond_resched();
	}
	seq_printf(m, "CQEs:\t%u\n", cq_tail - cq_head);
	while (cq_head < cq_tail) {
	cq_entries = min(cq_tail - cq_head, ctx->cq_entries);
	for (i = 0; i < cq_entries; i++) {
		struct io_uring_cqe *cqe;
		bool cqe32 = false;

@@ -163,8 +165,11 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
					cqe->big_cqe[0], cqe->big_cqe[1]);
		seq_printf(m, "\n");
		cq_head++;
		if (cqe32)
		if (cqe32) {
			cq_head++;
			i++;
		}
		cond_resched();
	}

	if (ctx->flags & IORING_SETUP_SQPOLL) {