lkml.org 
[lkml]   [2022]   [Jul]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next v3 24/25] io_uring: add zc notification flush requests
    Date
    Overlay notification control onto IORING_OP_RSRC_UPDATE (former
    IORING_OP_FILES_UPDATE). It allows to flush a range of zc notifications
    from slots with indexes [sqe->off, sqe->off+sqe->len). If sqe->arg is
    not zero, it also copies sqe->arg as a new tag for all flushed
    notifications.

    Note, it doesn't flush a notification of a slot if there was no requests
    attached to it (since last flush or registration).

    Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
    ---
    include/uapi/linux/io_uring.h | 1 +
    io_uring/rsrc.c | 38 +++++++++++++++++++++++++++++++++++
    2 files changed, 39 insertions(+)

    diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h
    index e62e61ceb494..eeb0fbee19cb 100644
    --- a/include/uapi/linux/io_uring.h
    +++ b/include/uapi/linux/io_uring.h
    @@ -280,6 +280,7 @@ enum io_uring_op {
    */
    enum {
    IORING_RSRC_UPDATE_FILES,
    + IORING_RSRC_UPDATE_NOTIF,
    };

    /*
    diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c
    index 0c3f95f24cef..af58d58dd21b 100644
    --- a/io_uring/rsrc.c
    +++ b/io_uring/rsrc.c
    @@ -15,6 +15,7 @@
    #include "io_uring.h"
    #include "openclose.h"
    #include "rsrc.h"
    +#include "notif.h"

    struct io_rsrc_update {
    struct file *file;
    @@ -742,6 +743,41 @@ static int io_files_update(struct io_kiocb *req, unsigned int issue_flags)
    return IOU_OK;
    }

    +static int io_notif_update(struct io_kiocb *req, unsigned int issue_flags)
    +{
    + struct io_rsrc_update *up = io_kiocb_to_cmd(req);
    + struct io_ring_ctx *ctx = req->ctx;
    + unsigned len = up->nr_args;
    + unsigned idx_end, idx = up->offset;
    + int ret = 0;
    +
    + io_ring_submit_lock(ctx, issue_flags);
    + if (unlikely(check_add_overflow(idx, len, &idx_end))) {
    + ret = -EOVERFLOW;
    + goto out;
    + }
    + if (unlikely(idx_end > ctx->nr_notif_slots)) {
    + ret = -EINVAL;
    + goto out;
    + }
    +
    + for (; idx < idx_end; idx++) {
    + struct io_notif_slot *slot = &ctx->notif_slots[idx];
    +
    + if (!slot->notif)
    + continue;
    + if (up->arg)
    + slot->tag = up->arg;
    + io_notif_slot_flush_submit(slot, issue_flags);
    + }
    +out:
    + io_ring_submit_unlock(ctx, issue_flags);
    + if (ret < 0)
    + req_set_fail(req);
    + io_req_set_res(req, ret, 0);
    + return IOU_OK;
    +}
    +
    int io_rsrc_update(struct io_kiocb *req, unsigned int issue_flags)
    {
    struct io_rsrc_update *up = io_kiocb_to_cmd(req);
    @@ -749,6 +785,8 @@ int io_rsrc_update(struct io_kiocb *req, unsigned int issue_flags)
    switch (up->type) {
    case IORING_RSRC_UPDATE_FILES:
    return io_files_update(req, issue_flags);
    + case IORING_RSRC_UPDATE_NOTIF:
    + return io_notif_update(req, issue_flags);
    }
    return -EINVAL;
    }
    --
    2.36.1
    \
     
     \ /
      Last update: 2022-07-05 17:06    [W:4.110 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site