]>
git.ipfire.org Git - thirdparty/linux.git/blob - io_uring/rsrc.h
1 // SPDX-License-Identifier: GPL-2.0
5 #include <net/af_unix.h>
7 #include "alloc_cache.h"
9 #define IO_NODE_ALLOC_CACHE_MAX 32
11 #define IO_RSRC_TAG_TABLE_SHIFT (PAGE_SHIFT - 3)
12 #define IO_RSRC_TAG_TABLE_MAX (1U << IO_RSRC_TAG_TABLE_SHIFT)
13 #define IO_RSRC_TAG_TABLE_MASK (IO_RSRC_TAG_TABLE_MAX - 1)
17 IORING_RSRC_BUFFER
= 1,
25 struct io_mapped_ubuf
*buf
;
29 typedef void (rsrc_put_fn
)(struct io_ring_ctx
*ctx
, struct io_rsrc_put
*prsrc
);
32 struct io_ring_ctx
*ctx
;
42 struct io_cache_entry cache
;
43 struct io_ring_ctx
*ctx
;
48 struct list_head node
;
49 struct io_rsrc_put item
;
52 struct io_mapped_ubuf
{
55 unsigned int nr_bvecs
;
56 unsigned long acct_pages
;
57 struct bio_vec bvec
[];
60 void io_rsrc_put_tw(struct callback_head
*cb
);
61 void io_rsrc_node_ref_zero(struct io_rsrc_node
*node
);
62 void io_rsrc_node_destroy(struct io_ring_ctx
*ctx
, struct io_rsrc_node
*ref_node
);
63 struct io_rsrc_node
*io_rsrc_node_alloc(struct io_ring_ctx
*ctx
);
64 int io_queue_rsrc_removal(struct io_rsrc_data
*data
, unsigned idx
, void *rsrc
);
66 int io_import_fixed(int ddir
, struct iov_iter
*iter
,
67 struct io_mapped_ubuf
*imu
,
68 u64 buf_addr
, size_t len
);
70 void __io_sqe_buffers_unregister(struct io_ring_ctx
*ctx
);
71 int io_sqe_buffers_unregister(struct io_ring_ctx
*ctx
);
72 int io_sqe_buffers_register(struct io_ring_ctx
*ctx
, void __user
*arg
,
73 unsigned int nr_args
, u64 __user
*tags
);
74 void __io_sqe_files_unregister(struct io_ring_ctx
*ctx
);
75 int io_sqe_files_unregister(struct io_ring_ctx
*ctx
);
76 int io_sqe_files_register(struct io_ring_ctx
*ctx
, void __user
*arg
,
77 unsigned nr_args
, u64 __user
*tags
);
79 int __io_scm_file_account(struct io_ring_ctx
*ctx
, struct file
*file
);
81 #if defined(CONFIG_UNIX)
82 static inline bool io_file_need_scm(struct file
*filp
)
84 return !!unix_get_socket(filp
);
87 static inline bool io_file_need_scm(struct file
*filp
)
93 static inline int io_scm_file_account(struct io_ring_ctx
*ctx
,
96 if (likely(!io_file_need_scm(file
)))
98 return __io_scm_file_account(ctx
, file
);
101 int io_register_files_update(struct io_ring_ctx
*ctx
, void __user
*arg
,
103 int io_register_rsrc_update(struct io_ring_ctx
*ctx
, void __user
*arg
,
104 unsigned size
, unsigned type
);
105 int io_register_rsrc(struct io_ring_ctx
*ctx
, void __user
*arg
,
106 unsigned int size
, unsigned int type
);
108 static inline void io_put_rsrc_node(struct io_ring_ctx
*ctx
, struct io_rsrc_node
*node
)
110 lockdep_assert_held(&ctx
->uring_lock
);
112 if (node
&& !--node
->refs
)
113 io_rsrc_node_ref_zero(node
);
116 static inline void io_req_put_rsrc_locked(struct io_kiocb
*req
,
117 struct io_ring_ctx
*ctx
)
119 io_put_rsrc_node(ctx
, req
->rsrc_node
);
122 static inline void io_charge_rsrc_node(struct io_ring_ctx
*ctx
,
123 struct io_rsrc_node
*node
)
128 static inline void io_req_set_rsrc_node(struct io_kiocb
*req
,
129 struct io_ring_ctx
*ctx
,
130 unsigned int issue_flags
)
132 if (!req
->rsrc_node
) {
133 io_ring_submit_lock(ctx
, issue_flags
);
135 lockdep_assert_held(&ctx
->uring_lock
);
137 req
->rsrc_node
= ctx
->rsrc_node
;
138 io_charge_rsrc_node(ctx
, ctx
->rsrc_node
);
139 io_ring_submit_unlock(ctx
, issue_flags
);
143 static inline u64
*io_get_tag_slot(struct io_rsrc_data
*data
, unsigned int idx
)
145 unsigned int off
= idx
& IO_RSRC_TAG_TABLE_MASK
;
146 unsigned int table_idx
= idx
>> IO_RSRC_TAG_TABLE_SHIFT
;
148 return &data
->tags
[table_idx
][off
];
151 static inline int io_rsrc_init(struct io_ring_ctx
*ctx
)
153 ctx
->rsrc_node
= io_rsrc_node_alloc(ctx
);
154 return ctx
->rsrc_node
? 0 : -ENOMEM
;
157 int io_files_update(struct io_kiocb
*req
, unsigned int issue_flags
);
158 int io_files_update_prep(struct io_kiocb
*req
, const struct io_uring_sqe
*sqe
);
160 int __io_account_mem(struct user_struct
*user
, unsigned long nr_pages
);
162 static inline void __io_unaccount_mem(struct user_struct
*user
,
163 unsigned long nr_pages
)
165 atomic_long_sub(nr_pages
, &user
->locked_vm
);