]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring/mock: add trivial poll handler
authorPavel Begunkov <asml.silence@gmail.com>
Mon, 30 Jun 2025 18:16:56 +0000 (19:16 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 2 Jul 2025 14:10:26 +0000 (08:10 -0600)
Add a flag that enables polling on the mock file. For now it's trivially
says that there is always data available, it'll be extended in the
future.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/f16de043ec4876d65fae294fc99ade57415fba0c.1750599274.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/uapi/linux/io_uring/mock_file.h
io_uring/mock_file.c

index c8fa77e39c681667aa5b5b0b5872de6debfd08af..debeee8e4527d70c2fcf3fb96137681b7baa11ea 100644 (file)
@@ -8,6 +8,7 @@ enum {
        IORING_MOCK_FEAT_RW_ZERO,
        IORING_MOCK_FEAT_RW_NOWAIT,
        IORING_MOCK_FEAT_RW_ASYNC,
+       IORING_MOCK_FEAT_POLL,
 
        IORING_MOCK_FEAT_END,
 };
@@ -19,6 +20,7 @@ struct io_uring_mock_probe {
 
 enum {
        IORING_MOCK_CREATE_F_SUPPORT_NOWAIT                     = 1,
+       IORING_MOCK_CREATE_F_POLL                               = 2,
 };
 
 struct io_uring_mock_create {
index ed6a5505763e9bbcf7287f24eaa7d9bdb11974f2..45d3735b2708ed3f4c3c925c918d84fed84c648f 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/anon_inodes.h>
 #include <linux/ktime.h>
 #include <linux/hrtimer.h>
+#include <linux/poll.h>
 
 #include <linux/io_uring/cmd.h>
 #include <linux/io_uring_types.h>
@@ -20,6 +21,8 @@ struct io_mock_iocb {
 struct io_mock_file {
        size_t                  size;
        u64                     rw_delay_ns;
+       bool                    pollable;
+       struct wait_queue_head  poll_wq;
 };
 
 #define IO_VALID_COPY_CMD_FLAGS                IORING_MOCK_COPY_FROM
@@ -161,6 +164,18 @@ static loff_t io_mock_llseek(struct file *file, loff_t offset, int whence)
        return fixed_size_llseek(file, offset, whence, mf->size);
 }
 
+static __poll_t io_mock_poll(struct file *file, struct poll_table_struct *pt)
+{
+       struct io_mock_file *mf = file->private_data;
+       __poll_t mask = 0;
+
+       poll_wait(file, &mf->poll_wq, pt);
+
+       mask |= EPOLLOUT | EPOLLWRNORM;
+       mask |= EPOLLIN | EPOLLRDNORM;
+       return mask;
+}
+
 static int io_mock_release(struct inode *inode, struct file *file)
 {
        struct io_mock_file *mf = file->private_data;
@@ -178,10 +193,22 @@ static const struct file_operations io_mock_fops = {
        .llseek         = io_mock_llseek,
 };
 
-#define IO_VALID_CREATE_FLAGS (IORING_MOCK_CREATE_F_SUPPORT_NOWAIT)
+static const struct file_operations io_mock_poll_fops = {
+       .owner          = THIS_MODULE,
+       .release        = io_mock_release,
+       .uring_cmd      = io_mock_cmd,
+       .read_iter      = io_mock_read_iter,
+       .write_iter     = io_mock_write_iter,
+       .llseek         = io_mock_llseek,
+       .poll           = io_mock_poll,
+};
+
+#define IO_VALID_CREATE_FLAGS (IORING_MOCK_CREATE_F_SUPPORT_NOWAIT | \
+                               IORING_MOCK_CREATE_F_POLL)
 
 static int io_create_mock_file(struct io_uring_cmd *cmd, unsigned int issue_flags)
 {
+       const struct file_operations *fops = &io_mock_fops;
        const struct io_uring_sqe *sqe = cmd->sqe;
        struct io_uring_mock_create mc, __user *uarg;
        struct io_mock_file *mf = NULL;
@@ -223,9 +250,15 @@ static int io_create_mock_file(struct io_uring_cmd *cmd, unsigned int issue_flag
        if (fd < 0)
                goto fail;
 
+       init_waitqueue_head(&mf->poll_wq);
        mf->size = mc.file_size;
        mf->rw_delay_ns = mc.rw_delay_ns;
-       file = anon_inode_create_getfile("[io_uring_mock]", &io_mock_fops,
+       if (mc.flags & IORING_MOCK_CREATE_F_POLL) {
+               fops = &io_mock_poll_fops;
+               mf->pollable = true;
+       }
+
+       file = anon_inode_create_getfile("[io_uring_mock]", fops,
                                         mf, O_RDWR | O_CLOEXEC, NULL);
        if (IS_ERR(file)) {
                ret = PTR_ERR(file);