io_uring: switch cancel_hash to use per entry spinlock
[linux-block.git] / io_uring / fdinfo.c
index fcedde4b4b1e1f15d63165eb0767d7b2047fba1a..f941c73f550259bb0ef4d7fd1c43b76978db32c7 100644 (file)
@@ -13,6 +13,7 @@
 #include "io_uring.h"
 #include "sqpoll.h"
 #include "fdinfo.h"
+#include "cancel.h"
 
 #ifdef CONFIG_PROC_FS
 static __cold int io_uring_show_cred(struct seq_file *m, unsigned int id,
@@ -157,17 +158,19 @@ static __cold void __io_uring_show_fdinfo(struct io_ring_ctx *ctx,
                mutex_unlock(&ctx->uring_lock);
 
        seq_puts(m, "PollList:\n");
-       spin_lock(&ctx->completion_lock);
        for (i = 0; i < (1U << ctx->cancel_hash_bits); i++) {
-               struct hlist_head *list = &ctx->cancel_hash[i];
+               struct io_hash_bucket *hb = &ctx->cancel_hash[i];
                struct io_kiocb *req;
 
-               hlist_for_each_entry(req, list, hash_node)
+               spin_lock(&hb->lock);
+               hlist_for_each_entry(req, &hb->list, hash_node)
                        seq_printf(m, "  op=%d, task_works=%d\n", req->opcode,
                                        task_work_pending(req->task));
+               spin_unlock(&hb->lock);
        }
 
        seq_puts(m, "CqOverflowList:\n");
+       spin_lock(&ctx->completion_lock);
        list_for_each_entry(ocqe, &ctx->cq_overflow_list, list) {
                struct io_uring_cqe *cqe = &ocqe->cqe;