]>
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
[] __counted_by(nr_bvecs
);
60 void io_rsrc_node_ref_zero(struct io_rsrc_node
*node
);
61 void io_rsrc_node_destroy(struct io_ring_ctx
*ctx
, struct io_rsrc_node
*ref_node
);
62 struct io_rsrc_node
*io_rsrc_node_alloc(struct io_ring_ctx
*ctx
);
63 int io_queue_rsrc_removal(struct io_rsrc_data
*data
, unsigned idx
, void *rsrc
);
65 int io_import_fixed(int ddir
, struct iov_iter
*iter
,
66 struct io_mapped_ubuf
*imu
,
67 u64 buf_addr
, size_t len
);
69 void __io_sqe_buffers_unregister(struct io_ring_ctx
*ctx
);
70 int io_sqe_buffers_unregister(struct io_ring_ctx
*ctx
);
71 int io_sqe_buffers_register(struct io_ring_ctx
*ctx
, void __user
*arg
,
72 unsigned int nr_args
, u64 __user
*tags
);
73 void __io_sqe_files_unregister(struct io_ring_ctx
*ctx
);
74 int io_sqe_files_unregister(struct io_ring_ctx
*ctx
);
75 int io_sqe_files_register(struct io_ring_ctx
*ctx
, void __user
*arg
,
76 unsigned nr_args
, u64 __user
*tags
);
78 int __io_scm_file_account(struct io_ring_ctx
*ctx
, struct file
*file
);
80 #if defined(CONFIG_UNIX)
81 static inline bool io_file_need_scm(struct file
*filp
)
83 return !!unix_get_socket(filp
);
86 static inline bool io_file_need_scm(struct file
*filp
)
92 static inline int io_scm_file_account(struct io_ring_ctx
*ctx
,
95 if (likely(!io_file_need_scm(file
)))
97 return __io_scm_file_account(ctx
, file
);
100 int io_register_files_update(struct io_ring_ctx
*ctx
, void __user
*arg
,
102 int io_register_rsrc_update(struct io_ring_ctx
*ctx
, void __user
*arg
,
103 unsigned size
, unsigned type
);
104 int io_register_rsrc(struct io_ring_ctx
*ctx
, void __user
*arg
,
105 unsigned int size
, unsigned int type
);
107 static inline void io_put_rsrc_node(struct io_ring_ctx
*ctx
, struct io_rsrc_node
*node
)
109 lockdep_assert_held(&ctx
->uring_lock
);
111 if (node
&& !--node
->refs
)
112 io_rsrc_node_ref_zero(node
);
115 static inline void io_req_put_rsrc_locked(struct io_kiocb
*req
,
116 struct io_ring_ctx
*ctx
)
118 io_put_rsrc_node(ctx
, req
->rsrc_node
);
121 static inline void io_charge_rsrc_node(struct io_ring_ctx
*ctx
,
122 struct io_rsrc_node
*node
)
127 static inline void io_req_set_rsrc_node(struct io_kiocb
*req
,
128 struct io_ring_ctx
*ctx
,
129 unsigned int issue_flags
)
131 if (!req
->rsrc_node
) {
132 io_ring_submit_lock(ctx
, issue_flags
);
134 lockdep_assert_held(&ctx
->uring_lock
);
136 req
->rsrc_node
= ctx
->rsrc_node
;
137 io_charge_rsrc_node(ctx
, ctx
->rsrc_node
);
138 io_ring_submit_unlock(ctx
, issue_flags
);
142 static inline u64
*io_get_tag_slot(struct io_rsrc_data
*data
, unsigned int idx
)
144 unsigned int off
= idx
& IO_RSRC_TAG_TABLE_MASK
;
145 unsigned int table_idx
= idx
>> IO_RSRC_TAG_TABLE_SHIFT
;
147 return &data
->tags
[table_idx
][off
];
150 static inline int io_rsrc_init(struct io_ring_ctx
*ctx
)
152 ctx
->rsrc_node
= io_rsrc_node_alloc(ctx
);
153 return ctx
->rsrc_node
? 0 : -ENOMEM
;
156 int io_files_update(struct io_kiocb
*req
, unsigned int issue_flags
);
157 int io_files_update_prep(struct io_kiocb
*req
, const struct io_uring_sqe
*sqe
);
159 int __io_account_mem(struct user_struct
*user
, unsigned long nr_pages
);
161 static inline void __io_unaccount_mem(struct user_struct
*user
,
162 unsigned long nr_pages
)
164 atomic_long_sub(nr_pages
, &user
->locked_vm
);