lkml.org 
[lkml]   [2022]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH net-next v4 13/27] io_uring: export io_put_task()
    Date
    Make io_put_task() available to non-core parts of io_uring, we'll need
    it for notification infrastructure.

    Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
    ---
    include/linux/io_uring_types.h | 25 +++++++++++++++++++++++++
    io_uring/io_uring.c | 11 +----------
    io_uring/io_uring.h | 10 ++++++++++
    io_uring/tctx.h | 26 --------------------------
    4 files changed, 36 insertions(+), 36 deletions(-)

    diff --git a/include/linux/io_uring_types.h b/include/linux/io_uring_types.h
    index 26ef11e978d4..d876a0367081 100644
    --- a/include/linux/io_uring_types.h
    +++ b/include/linux/io_uring_types.h
    @@ -4,6 +4,7 @@
    #include <linux/blkdev.h>
    #include <linux/task_work.h>
    #include <linux/bitmap.h>
    +#include <linux/llist.h>
    #include <uapi/linux/io_uring.h>

    struct io_wq_work_node {
    @@ -43,6 +44,30 @@ struct io_hash_table {
    unsigned hash_bits;
    };

    +/*
    + * Arbitrary limit, can be raised if need be
    + */
    +#define IO_RINGFD_REG_MAX 16
    +
    +struct io_uring_task {
    + /* submission side */
    + int cached_refs;
    + const struct io_ring_ctx *last;
    + struct io_wq *io_wq;
    + struct file *registered_rings[IO_RINGFD_REG_MAX];
    +
    + struct xarray xa;
    + struct wait_queue_head wait;
    + atomic_t in_idle;
    + atomic_t inflight_tracked;
    + struct percpu_counter inflight;
    +
    + struct { /* task_work */
    + struct llist_head task_list;
    + struct callback_head task_work;
    + } ____cacheline_aligned_in_smp;
    +};
    +
    struct io_uring {
    u32 head ____cacheline_aligned_in_smp;
    u32 tail ____cacheline_aligned_in_smp;
    diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
    index caf979cd4327..bb644b1b575a 100644
    --- a/io_uring/io_uring.c
    +++ b/io_uring/io_uring.c
    @@ -602,7 +602,7 @@ static bool io_cqring_overflow_flush(struct io_ring_ctx *ctx)
    return ret;
    }

    -static void __io_put_task(struct task_struct *task, int nr)
    +void __io_put_task(struct task_struct *task, int nr)
    {
    struct io_uring_task *tctx = task->io_uring;

    @@ -612,15 +612,6 @@ static void __io_put_task(struct task_struct *task, int nr)
    put_task_struct_many(task, nr);
    }

    -/* must to be called somewhat shortly after putting a request */
    -static inline void io_put_task(struct task_struct *task, int nr)
    -{
    - if (likely(task == current))
    - task->io_uring->cached_refs += nr;
    - else
    - __io_put_task(task, nr);
    -}
    -
    static void io_task_refs_refill(struct io_uring_task *tctx)
    {
    unsigned int refill = -tctx->cached_refs + IO_TCTX_REFS_CACHE_NR;
    diff --git a/io_uring/io_uring.h b/io_uring/io_uring.h
    index 868f45d55543..2379d9e70c10 100644
    --- a/io_uring/io_uring.h
    +++ b/io_uring/io_uring.h
    @@ -66,6 +66,7 @@ void io_wq_submit_work(struct io_wq_work *work);

    void io_free_req(struct io_kiocb *req);
    void io_queue_next(struct io_kiocb *req);
    +void __io_put_task(struct task_struct *task, int nr);

    bool io_match_task_safe(struct io_kiocb *head, struct task_struct *task,
    bool cancel_all);
    @@ -253,4 +254,13 @@ static inline void io_commit_cqring_flush(struct io_ring_ctx *ctx)
    __io_commit_cqring_flush(ctx);
    }

    +/* must to be called somewhat shortly after putting a request */
    +static inline void io_put_task(struct task_struct *task, int nr)
    +{
    + if (likely(task == current))
    + task->io_uring->cached_refs += nr;
    + else
    + __io_put_task(task, nr);
    +}
    +
    #endif
    diff --git a/io_uring/tctx.h b/io_uring/tctx.h
    index 8a33ff6e5d91..25974beed4d6 100644
    --- a/io_uring/tctx.h
    +++ b/io_uring/tctx.h
    @@ -1,31 +1,5 @@
    // SPDX-License-Identifier: GPL-2.0

    -#include <linux/llist.h>
    -
    -/*
    - * Arbitrary limit, can be raised if need be
    - */
    -#define IO_RINGFD_REG_MAX 16
    -
    -struct io_uring_task {
    - /* submission side */
    - int cached_refs;
    - const struct io_ring_ctx *last;
    - struct io_wq *io_wq;
    - struct file *registered_rings[IO_RINGFD_REG_MAX];
    -
    - struct xarray xa;
    - struct wait_queue_head wait;
    - atomic_t in_idle;
    - atomic_t inflight_tracked;
    - struct percpu_counter inflight;
    -
    - struct { /* task_work */
    - struct llist_head task_list;
    - struct callback_head task_work;
    - } ____cacheline_aligned_in_smp;
    -};
    -
    struct io_tctx_node {
    struct list_head ctx_node;
    struct task_struct *task;
    --
    2.36.1
    \
     
     \ /
      Last update: 2022-07-07 13:54    [W:4.433 / U:0.556 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site