1c9f06aa7SJens Axboe // SPDX-License-Identifier: GPL-2.0 2c9f06aa7SJens Axboe 3c9f06aa7SJens Axboe struct io_tctx_node { 4c9f06aa7SJens Axboe struct list_head ctx_node; 5c9f06aa7SJens Axboe struct task_struct *task; 6c9f06aa7SJens Axboe struct io_ring_ctx *ctx; 7c9f06aa7SJens Axboe }; 8c9f06aa7SJens Axboe 9c9f06aa7SJens Axboe int io_uring_alloc_task_context(struct task_struct *task, 10c9f06aa7SJens Axboe struct io_ring_ctx *ctx); 11c9f06aa7SJens Axboe void io_uring_del_tctx_node(unsigned long index); 12*97c96e9fSDylan Yudaken int __io_uring_add_tctx_node(struct io_ring_ctx *ctx); 13*97c96e9fSDylan Yudaken int __io_uring_add_tctx_node_from_submit(struct io_ring_ctx *ctx); 14c9f06aa7SJens Axboe void io_uring_clean_tctx(struct io_uring_task *tctx); 15c9f06aa7SJens Axboe 16c9f06aa7SJens Axboe void io_uring_unreg_ringfd(void); 17c9f06aa7SJens Axboe int io_ringfd_register(struct io_ring_ctx *ctx, void __user *__arg, 18c9f06aa7SJens Axboe unsigned nr_args); 19c9f06aa7SJens Axboe int io_ringfd_unregister(struct io_ring_ctx *ctx, void __user *__arg, 20c9f06aa7SJens Axboe unsigned nr_args); 21c9f06aa7SJens Axboe 22c9f06aa7SJens Axboe /* 23c9f06aa7SJens Axboe * Note that this task has used io_uring. We use it for cancelation purposes. 24c9f06aa7SJens Axboe */ io_uring_add_tctx_node(struct io_ring_ctx * ctx)25c9f06aa7SJens Axboestatic inline int io_uring_add_tctx_node(struct io_ring_ctx *ctx) 26c9f06aa7SJens Axboe { 27c9f06aa7SJens Axboe struct io_uring_task *tctx = current->io_uring; 28c9f06aa7SJens Axboe 29c9f06aa7SJens Axboe if (likely(tctx && tctx->last == ctx)) 30c9f06aa7SJens Axboe return 0; 31*97c96e9fSDylan Yudaken 32*97c96e9fSDylan Yudaken return __io_uring_add_tctx_node_from_submit(ctx); 33c9f06aa7SJens Axboe } 34