fs: add batch and poll flags to the uring_cmd_iopoll() handler
authorJens Axboe <axboe@kernel.dk>
Fri, 2 Sep 2022 21:18:05 +0000 (15:18 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 21 Sep 2022 16:30:43 +0000 (10:30 -0600)
We need the poll_flags to know how to poll for the IO, and we should
have the batch structure in preparation for supporting batched
completions with iopoll.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/host/ioctl.c
drivers/nvme/host/nvme.h
include/linux/fs.h
io_uring/rw.c

index 7756b43..548aca8 100644 (file)
@@ -623,7 +623,9 @@ int nvme_ns_chr_uring_cmd(struct io_uring_cmd *ioucmd, unsigned int issue_flags)
        return nvme_ns_uring_cmd(ns, ioucmd, issue_flags);
 }
 
-int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd)
+int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd,
+                                struct io_comp_batch *iob,
+                                unsigned int poll_flags)
 {
        struct bio *bio;
        int ret = 0;
@@ -636,7 +638,7 @@ int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd)
                        struct nvme_ns, cdev);
        q = ns->queue;
        if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev)
-               ret = bio_poll(bio, NULL, 0);
+               ret = bio_poll(bio, iob, poll_flags);
        rcu_read_unlock();
        return ret;
 }
@@ -722,7 +724,9 @@ int nvme_ns_head_chr_uring_cmd(struct io_uring_cmd *ioucmd,
        return ret;
 }
 
-int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd)
+int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd,
+                                     struct io_comp_batch *iob,
+                                     unsigned int poll_flags)
 {
        struct cdev *cdev = file_inode(ioucmd->file)->i_cdev;
        struct nvme_ns_head *head = container_of(cdev, struct nvme_ns_head, cdev);
@@ -738,7 +742,7 @@ int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd)
                q = ns->queue;
                if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio
                                && bio->bi_bdev)
-                       ret = bio_poll(bio, NULL, 0);
+                       ret = bio_poll(bio, iob, poll_flags);
                rcu_read_unlock();
        }
        srcu_read_unlock(&head->srcu, srcu_idx);
index fdcbc93..216acbe 100644 (file)
@@ -821,8 +821,10 @@ long nvme_ns_head_chr_ioctl(struct file *file, unsigned int cmd,
                unsigned long arg);
 long nvme_dev_ioctl(struct file *file, unsigned int cmd,
                unsigned long arg);
-int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd);
-int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd);
+int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd,
+               struct io_comp_batch *iob, unsigned int poll_flags);
+int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd,
+               struct io_comp_batch *iob, unsigned int poll_flags);
 int nvme_ns_chr_uring_cmd(struct io_uring_cmd *ioucmd,
                unsigned int issue_flags);
 int nvme_ns_head_chr_uring_cmd(struct io_uring_cmd *ioucmd,
index d6badd1..01681d0 100644 (file)
@@ -2132,7 +2132,8 @@ struct file_operations {
                                   loff_t len, unsigned int remap_flags);
        int (*fadvise)(struct file *, loff_t, loff_t, int);
        int (*uring_cmd)(struct io_uring_cmd *ioucmd, unsigned int issue_flags);
-       int (*uring_cmd_iopoll)(struct io_uring_cmd *ioucmd);
+       int (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *,
+                               unsigned int poll_flags);
 } __randomize_layout;
 
 struct inode_operations {
index 9187344..da1c0d0 100644 (file)
@@ -1015,7 +1015,8 @@ int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin)
                        struct io_uring_cmd *ioucmd;
 
                        ioucmd = io_kiocb_to_cmd(req, struct io_uring_cmd);
-                       ret = file->f_op->uring_cmd_iopoll(ioucmd);
+                       ret = file->f_op->uring_cmd_iopoll(ioucmd, &iob,
+                                                               poll_flags);
                } else {
                        struct io_rw *rw = io_kiocb_to_cmd(req, struct io_rw);