1*73572984SJens Axboe // SPDX-License-Identifier: GPL-2.0 2*73572984SJens Axboe #ifndef IOU_RSRC_H 3*73572984SJens Axboe #define IOU_RSRC_H 4*73572984SJens Axboe 5*73572984SJens Axboe #include <net/af_unix.h> 6*73572984SJens Axboe 7*73572984SJens Axboe #define IO_RSRC_TAG_TABLE_SHIFT (PAGE_SHIFT - 3) 8*73572984SJens Axboe #define IO_RSRC_TAG_TABLE_MAX (1U << IO_RSRC_TAG_TABLE_SHIFT) 9*73572984SJens Axboe #define IO_RSRC_TAG_TABLE_MASK (IO_RSRC_TAG_TABLE_MAX - 1) 10*73572984SJens Axboe 11*73572984SJens Axboe enum { 12*73572984SJens Axboe IORING_RSRC_FILE = 0, 13*73572984SJens Axboe IORING_RSRC_BUFFER = 1, 14*73572984SJens Axboe }; 15*73572984SJens Axboe 16*73572984SJens Axboe struct io_rsrc_put { 17*73572984SJens Axboe struct list_head list; 18*73572984SJens Axboe u64 tag; 19*73572984SJens Axboe union { 20*73572984SJens Axboe void *rsrc; 21*73572984SJens Axboe struct file *file; 22*73572984SJens Axboe struct io_mapped_ubuf *buf; 23*73572984SJens Axboe }; 24*73572984SJens Axboe }; 25*73572984SJens Axboe 26*73572984SJens Axboe typedef void (rsrc_put_fn)(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc); 27*73572984SJens Axboe 28*73572984SJens Axboe struct io_rsrc_data { 29*73572984SJens Axboe struct io_ring_ctx *ctx; 30*73572984SJens Axboe 31*73572984SJens Axboe u64 **tags; 32*73572984SJens Axboe unsigned int nr; 33*73572984SJens Axboe rsrc_put_fn *do_put; 34*73572984SJens Axboe atomic_t refs; 35*73572984SJens Axboe struct completion done; 36*73572984SJens Axboe bool quiesce; 37*73572984SJens Axboe }; 38*73572984SJens Axboe 39*73572984SJens Axboe struct io_rsrc_node { 40*73572984SJens Axboe struct percpu_ref refs; 41*73572984SJens Axboe struct list_head node; 42*73572984SJens Axboe struct list_head rsrc_list; 43*73572984SJens Axboe struct io_rsrc_data *rsrc_data; 44*73572984SJens Axboe struct llist_node llist; 45*73572984SJens Axboe bool done; 46*73572984SJens Axboe }; 47*73572984SJens Axboe 48*73572984SJens Axboe void io_rsrc_put_work(struct work_struct *work); 49*73572984SJens Axboe void io_rsrc_refs_refill(struct io_ring_ctx *ctx); 50*73572984SJens Axboe void io_wait_rsrc_data(struct io_rsrc_data *data); 51*73572984SJens Axboe void io_rsrc_node_destroy(struct io_rsrc_node *ref_node); 52*73572984SJens Axboe void io_rsrc_refs_drop(struct io_ring_ctx *ctx); 53*73572984SJens Axboe int io_rsrc_node_switch_start(struct io_ring_ctx *ctx); 54*73572984SJens Axboe int io_queue_rsrc_removal(struct io_rsrc_data *data, unsigned idx, 55*73572984SJens Axboe struct io_rsrc_node *node, void *rsrc); 56*73572984SJens Axboe void io_rsrc_node_switch(struct io_ring_ctx *ctx, 57*73572984SJens Axboe struct io_rsrc_data *data_to_kill); 58*73572984SJens Axboe 59*73572984SJens Axboe 60*73572984SJens Axboe void __io_sqe_buffers_unregister(struct io_ring_ctx *ctx); 61*73572984SJens Axboe int io_sqe_buffers_unregister(struct io_ring_ctx *ctx); 62*73572984SJens Axboe int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg, 63*73572984SJens Axboe unsigned int nr_args, u64 __user *tags); 64*73572984SJens Axboe void __io_sqe_files_unregister(struct io_ring_ctx *ctx); 65*73572984SJens Axboe int io_sqe_files_unregister(struct io_ring_ctx *ctx); 66*73572984SJens Axboe int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg, 67*73572984SJens Axboe unsigned nr_args, u64 __user *tags); 68*73572984SJens Axboe 69*73572984SJens Axboe int __io_scm_file_account(struct io_ring_ctx *ctx, struct file *file); 70*73572984SJens Axboe 71*73572984SJens Axboe #if defined(CONFIG_UNIX) 72*73572984SJens Axboe static inline bool io_file_need_scm(struct file *filp) 73*73572984SJens Axboe { 74*73572984SJens Axboe #if defined(IO_URING_SCM_ALL) 75*73572984SJens Axboe return true; 76*73572984SJens Axboe #else 77*73572984SJens Axboe return !!unix_get_socket(filp); 78*73572984SJens Axboe #endif 79*73572984SJens Axboe } 80*73572984SJens Axboe #else 81*73572984SJens Axboe static inline bool io_file_need_scm(struct file *filp) 82*73572984SJens Axboe { 83*73572984SJens Axboe return false; 84*73572984SJens Axboe } 85*73572984SJens Axboe #endif 86*73572984SJens Axboe 87*73572984SJens Axboe static inline int io_scm_file_account(struct io_ring_ctx *ctx, 88*73572984SJens Axboe struct file *file) 89*73572984SJens Axboe { 90*73572984SJens Axboe if (likely(!io_file_need_scm(file))) 91*73572984SJens Axboe return 0; 92*73572984SJens Axboe return __io_scm_file_account(ctx, file); 93*73572984SJens Axboe } 94*73572984SJens Axboe 95*73572984SJens Axboe int io_register_files_update(struct io_ring_ctx *ctx, void __user *arg, 96*73572984SJens Axboe unsigned nr_args); 97*73572984SJens Axboe int io_register_rsrc_update(struct io_ring_ctx *ctx, void __user *arg, 98*73572984SJens Axboe unsigned size, unsigned type); 99*73572984SJens Axboe int io_register_rsrc(struct io_ring_ctx *ctx, void __user *arg, 100*73572984SJens Axboe unsigned int size, unsigned int type); 101*73572984SJens Axboe 102*73572984SJens Axboe static inline void io_rsrc_put_node(struct io_rsrc_node *node, int nr) 103*73572984SJens Axboe { 104*73572984SJens Axboe percpu_ref_put_many(&node->refs, nr); 105*73572984SJens Axboe } 106*73572984SJens Axboe 107*73572984SJens Axboe static inline void io_req_put_rsrc(struct io_kiocb *req) 108*73572984SJens Axboe { 109*73572984SJens Axboe if (req->rsrc_node) 110*73572984SJens Axboe io_rsrc_put_node(req->rsrc_node, 1); 111*73572984SJens Axboe } 112*73572984SJens Axboe 113*73572984SJens Axboe static inline void io_req_put_rsrc_locked(struct io_kiocb *req, 114*73572984SJens Axboe struct io_ring_ctx *ctx) 115*73572984SJens Axboe __must_hold(&ctx->uring_lock) 116*73572984SJens Axboe { 117*73572984SJens Axboe struct io_rsrc_node *node = req->rsrc_node; 118*73572984SJens Axboe 119*73572984SJens Axboe if (node) { 120*73572984SJens Axboe if (node == ctx->rsrc_node) 121*73572984SJens Axboe ctx->rsrc_cached_refs++; 122*73572984SJens Axboe else 123*73572984SJens Axboe io_rsrc_put_node(node, 1); 124*73572984SJens Axboe } 125*73572984SJens Axboe } 126*73572984SJens Axboe 127*73572984SJens Axboe static inline void io_req_set_rsrc_node(struct io_kiocb *req, 128*73572984SJens Axboe struct io_ring_ctx *ctx, 129*73572984SJens Axboe unsigned int issue_flags) 130*73572984SJens Axboe { 131*73572984SJens Axboe if (!req->rsrc_node) { 132*73572984SJens Axboe req->rsrc_node = ctx->rsrc_node; 133*73572984SJens Axboe 134*73572984SJens Axboe if (!(issue_flags & IO_URING_F_UNLOCKED)) { 135*73572984SJens Axboe lockdep_assert_held(&ctx->uring_lock); 136*73572984SJens Axboe ctx->rsrc_cached_refs--; 137*73572984SJens Axboe if (unlikely(ctx->rsrc_cached_refs < 0)) 138*73572984SJens Axboe io_rsrc_refs_refill(ctx); 139*73572984SJens Axboe } else { 140*73572984SJens Axboe percpu_ref_get(&req->rsrc_node->refs); 141*73572984SJens Axboe } 142*73572984SJens Axboe } 143*73572984SJens Axboe } 144*73572984SJens Axboe 145*73572984SJens Axboe static inline u64 *io_get_tag_slot(struct io_rsrc_data *data, unsigned int idx) 146*73572984SJens Axboe { 147*73572984SJens Axboe unsigned int off = idx & IO_RSRC_TAG_TABLE_MASK; 148*73572984SJens Axboe unsigned int table_idx = idx >> IO_RSRC_TAG_TABLE_SHIFT; 149*73572984SJens Axboe 150*73572984SJens Axboe return &data->tags[table_idx][off]; 151*73572984SJens Axboe } 152*73572984SJens Axboe 153*73572984SJens Axboe int io_files_update(struct io_kiocb *req, unsigned int issue_flags); 154*73572984SJens Axboe int io_files_update_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe); 155*73572984SJens Axboe #endif 156