Merge tag 'io_uring-6.19-20260205' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux

Pull io_uring fixes from Jens Axboe:

- Two small fixes for zcrx

- Two small fixes for fdinfo - one is just killing a superflous newline

* tag 'io_uring-6.19-20260205' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux:
io_uring/fdinfo: be a bit nicer when looping a lot of SQEs/CQEs
io_uring/fdinfo: kill unnecessary newline feed in CQE32 printing
io_uring/zcrx: fix rq flush locking
io_uring/zcrx: fix page array leak

+14 -8
+9 -4
io_uring/fdinfo.c
··· 67 67 unsigned int cq_head = READ_ONCE(r->cq.head); 68 68 unsigned int cq_tail = READ_ONCE(r->cq.tail); 69 69 unsigned int sq_shift = 0; 70 - unsigned int sq_entries; 70 + unsigned int cq_entries, sq_entries; 71 71 int sq_pid = -1, sq_cpu = -1; 72 72 u64 sq_total_time = 0, sq_work_time = 0; 73 73 unsigned int i; ··· 146 146 } 147 147 } 148 148 seq_printf(m, "\n"); 149 + cond_resched(); 149 150 } 150 151 seq_printf(m, "CQEs:\t%u\n", cq_tail - cq_head); 151 - while (cq_head < cq_tail) { 152 + cq_entries = min(cq_tail - cq_head, ctx->cq_entries); 153 + for (i = 0; i < cq_entries; i++) { 152 154 struct io_uring_cqe *cqe; 153 155 bool cqe32 = false; 154 156 ··· 161 159 cq_head & cq_mask, cqe->user_data, cqe->res, 162 160 cqe->flags); 163 161 if (cqe32) 164 - seq_printf(m, ", extra1:%llu, extra2:%llu\n", 162 + seq_printf(m, ", extra1:%llu, extra2:%llu", 165 163 cqe->big_cqe[0], cqe->big_cqe[1]); 166 164 seq_printf(m, "\n"); 167 165 cq_head++; 168 - if (cqe32) 166 + if (cqe32) { 169 167 cq_head++; 168 + i++; 169 + } 170 + cond_resched(); 170 171 } 171 172 172 173 if (ctx->flags & IORING_SETUP_SQPOLL) {
+5 -4
io_uring/zcrx.c
··· 197 197 GFP_KERNEL_ACCOUNT); 198 198 if (ret) { 199 199 unpin_user_pages(pages, nr_pages); 200 + kvfree(pages); 200 201 return ret; 201 202 } 202 203 ··· 1069 1068 unsigned int mask = zcrx->rq_entries - 1; 1070 1069 unsigned int i; 1071 1070 1072 - guard(spinlock_bh)(&zcrx->rq_lock); 1073 - 1074 1071 nr = min(nr, io_zcrx_rqring_entries(zcrx)); 1075 1072 for (i = 0; i < nr; i++) { 1076 1073 struct io_uring_zcrx_rqe *rqe = io_zcrx_get_rqe(zcrx, mask); ··· 1113 1114 return -EINVAL; 1114 1115 1115 1116 do { 1116 - nr = zcrx_parse_rq(netmems, ZCRX_FLUSH_BATCH, zcrx); 1117 + scoped_guard(spinlock_bh, &zcrx->rq_lock) { 1118 + nr = zcrx_parse_rq(netmems, ZCRX_FLUSH_BATCH, zcrx); 1119 + zcrx_return_buffers(netmems, nr); 1120 + } 1117 1121 1118 - zcrx_return_buffers(netmems, nr); 1119 1122 total += nr; 1120 1123 1121 1124 if (fatal_signal_pending(current))