* [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff
@ 2021-03-25 13:07 Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 01/17] io_uring: name rsrc bits consistently Pavel Begunkov
` (16 more replies)
0 siblings, 17 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
1-7 implement ctx wide rsrc nodes. The main idea here is to make make
rsrc nodes (aka ref nodes) to be per ctx rather than per rsrc_data, that
is a requirement for having multiple resource types. All the meat to it
in 7/7. Btw improve rsrc API, because it was too easy to misuse.
8-17 are necessarily related cleanups
v2: io_rsrc_node_destroy() last rsrc_node on ctx_free()
v3: add 8-17, 1-7 are unchanged
Pavel Begunkov (17):
io_uring: name rsrc bits consistently
io_uring: simplify io_rsrc_node_ref_zero
io_uring: use rsrc prealloc infra for files reg
io_uring: encapsulate rsrc node manipulations
io_uring: move rsrc_put callback into io_rsrc_data
io_uring: refactor io_queue_rsrc_removal()
io_uring: ctx-wide rsrc nodes
io_uring: reuse io_rsrc_node_destroy()
io_uring: remove useless is_dying check on quiesce
io_uring: refactor rw reissue
io_uring: combine lock/unlock sections on exit
io_uring: better ref handling in poll_remove_one
io_uring: remove unused hash_wait
io_uring: refactor io_async_cancel()
io_uring: improve import_fixed overflow checks
io_uring: store reg buffer end instead of length
io_uring: kill unused forward decls
fs/io_uring.c | 333 ++++++++++++++++++++------------------------------
1 file changed, 135 insertions(+), 198 deletions(-)
--
2.24.0
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v3 01/17] io_uring: name rsrc bits consistently
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 02/17] io_uring: simplify io_rsrc_node_ref_zero Pavel Begunkov
` (15 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
Keep resource related structs' and functions' naming consistent, in
particular use "io_rsrc" prefix for everything.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 150 ++++++++++++++++++++++++--------------------------
1 file changed, 71 insertions(+), 79 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 2d2e1184c205..b2c6d91749df 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -215,22 +215,22 @@ struct fixed_rsrc_table {
struct file **files;
};
-struct fixed_rsrc_ref_node {
+struct io_rsrc_node {
struct percpu_ref refs;
struct list_head node;
struct list_head rsrc_list;
- struct fixed_rsrc_data *rsrc_data;
+ struct io_rsrc_data *rsrc_data;
void (*rsrc_put)(struct io_ring_ctx *ctx,
struct io_rsrc_put *prsrc);
struct llist_node llist;
bool done;
};
-struct fixed_rsrc_data {
+struct io_rsrc_data {
struct fixed_rsrc_table *table;
struct io_ring_ctx *ctx;
- struct fixed_rsrc_ref_node *node;
+ struct io_rsrc_node *node;
struct percpu_ref refs;
struct completion done;
bool quiesce;
@@ -389,7 +389,7 @@ struct io_ring_ctx {
* readers must ensure that ->refs is alive as long as the file* is
* used. Only updated through io_uring_register(2).
*/
- struct fixed_rsrc_data *file_data;
+ struct io_rsrc_data *file_data;
unsigned nr_user_files;
/* if used, fixed mapped user buffers */
@@ -443,7 +443,7 @@ struct io_ring_ctx {
struct llist_head rsrc_put_llist;
struct list_head rsrc_ref_list;
spinlock_t rsrc_ref_lock;
- struct fixed_rsrc_ref_node *rsrc_backup_node;
+ struct io_rsrc_node *rsrc_backup_node;
struct io_restriction restrictions;
@@ -1012,9 +1012,8 @@ static void io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
struct task_struct *task,
struct files_struct *files);
static void io_uring_cancel_sqpoll(struct io_ring_ctx *ctx);
-static void destroy_fixed_rsrc_ref_node(struct fixed_rsrc_ref_node *ref_node);
-static struct fixed_rsrc_ref_node *alloc_fixed_rsrc_ref_node(
- struct io_ring_ctx *ctx);
+static void io_rsrc_node_destroy(struct io_rsrc_node *ref_node);
+static struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx);
static void io_ring_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc);
static void io_cqring_fill_event(struct io_kiocb *req, long res);
@@ -1059,7 +1058,7 @@ EXPORT_SYMBOL(io_uring_get_socket);
#define io_for_each_link(pos, head) \
for (pos = (head); pos; pos = pos->link)
-static inline void io_set_resource_node(struct io_kiocb *req)
+static inline void io_req_set_rsrc_node(struct io_kiocb *req)
{
struct io_ring_ctx *ctx = req->ctx;
@@ -6164,7 +6163,7 @@ static void io_wq_submit_work(struct io_wq_work *work)
#endif
#define FFS_MASK ~(FFS_ASYNC_READ|FFS_ASYNC_WRITE|FFS_ISREG)
-static inline struct file **io_fixed_file_slot(struct fixed_rsrc_data *file_data,
+static inline struct file **io_fixed_file_slot(struct io_rsrc_data *file_data,
unsigned i)
{
struct fixed_rsrc_table *table;
@@ -6198,7 +6197,7 @@ static struct file *io_file_get(struct io_submit_state *state,
file_ptr &= ~FFS_MASK;
/* mask in overlapping REQ_F and FFS bits */
req->flags |= (file_ptr << REQ_F_ASYNC_READ_BIT);
- io_set_resource_node(req);
+ io_req_set_rsrc_node(req);
} else {
trace_io_uring_file_get(ctx, fd);
file = __io_file_get(state, fd);
@@ -6948,9 +6947,8 @@ static void __io_sqe_files_unregister(struct io_ring_ctx *ctx)
static void io_rsrc_data_ref_zero(struct percpu_ref *ref)
{
- struct fixed_rsrc_data *data;
+ struct io_rsrc_data *data = container_of(ref, struct io_rsrc_data, refs);
- data = container_of(ref, struct fixed_rsrc_data, refs);
complete(&data->done);
}
@@ -6964,20 +6962,20 @@ static inline void io_rsrc_ref_unlock(struct io_ring_ctx *ctx)
spin_unlock_bh(&ctx->rsrc_ref_lock);
}
-static void io_sqe_rsrc_set_node(struct io_ring_ctx *ctx,
- struct fixed_rsrc_data *rsrc_data,
- struct fixed_rsrc_ref_node *ref_node)
+static void io_rsrc_node_set(struct io_ring_ctx *ctx,
+ struct io_rsrc_data *rsrc_data,
+ struct io_rsrc_node *rsrc_node)
{
io_rsrc_ref_lock(ctx);
- rsrc_data->node = ref_node;
- list_add_tail(&ref_node->node, &ctx->rsrc_ref_list);
+ rsrc_data->node = rsrc_node;
+ list_add_tail(&rsrc_node->node, &ctx->rsrc_ref_list);
io_rsrc_ref_unlock(ctx);
percpu_ref_get(&rsrc_data->refs);
}
-static void io_sqe_rsrc_kill_node(struct io_ring_ctx *ctx, struct fixed_rsrc_data *data)
+static void io_rsrc_node_kill(struct io_ring_ctx *ctx, struct io_rsrc_data *data)
{
- struct fixed_rsrc_ref_node *ref_node = NULL;
+ struct io_rsrc_node *ref_node = NULL;
io_rsrc_ref_lock(ctx);
ref_node = data->node;
@@ -6987,21 +6985,21 @@ static void io_sqe_rsrc_kill_node(struct io_ring_ctx *ctx, struct fixed_rsrc_dat
percpu_ref_kill(&ref_node->refs);
}
-static int io_rsrc_refnode_prealloc(struct io_ring_ctx *ctx)
+static int io_rsrc_node_prealloc(struct io_ring_ctx *ctx)
{
if (ctx->rsrc_backup_node)
return 0;
- ctx->rsrc_backup_node = alloc_fixed_rsrc_ref_node(ctx);
+ ctx->rsrc_backup_node = io_rsrc_node_alloc(ctx);
return ctx->rsrc_backup_node ? 0 : -ENOMEM;
}
-static struct fixed_rsrc_ref_node *
-io_rsrc_refnode_get(struct io_ring_ctx *ctx,
- struct fixed_rsrc_data *rsrc_data,
- void (*rsrc_put)(struct io_ring_ctx *ctx,
- struct io_rsrc_put *prsrc))
+static struct io_rsrc_node *
+io_rsrc_node_get(struct io_ring_ctx *ctx,
+ struct io_rsrc_data *rsrc_data,
+ void (*rsrc_put)(struct io_ring_ctx *ctx,
+ struct io_rsrc_put *prsrc))
{
- struct fixed_rsrc_ref_node *node = ctx->rsrc_backup_node;
+ struct io_rsrc_node *node = ctx->rsrc_backup_node;
WARN_ON_ONCE(!node);
@@ -7011,12 +7009,12 @@ io_rsrc_refnode_get(struct io_ring_ctx *ctx,
return node;
}
-static int io_rsrc_ref_quiesce(struct fixed_rsrc_data *data,
+static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
struct io_ring_ctx *ctx,
void (*rsrc_put)(struct io_ring_ctx *ctx,
struct io_rsrc_put *prsrc))
{
- struct fixed_rsrc_ref_node *node;
+ struct io_rsrc_node *node;
int ret;
if (data->quiesce)
@@ -7024,10 +7022,10 @@ static int io_rsrc_ref_quiesce(struct fixed_rsrc_data *data,
data->quiesce = true;
do {
- ret = io_rsrc_refnode_prealloc(ctx);
+ ret = io_rsrc_node_prealloc(ctx);
if (ret)
break;
- io_sqe_rsrc_kill_node(ctx, data);
+ io_rsrc_node_kill(ctx, data);
percpu_ref_kill(&data->refs);
flush_delayed_work(&ctx->rsrc_put_work);
@@ -7036,8 +7034,8 @@ static int io_rsrc_ref_quiesce(struct fixed_rsrc_data *data,
break;
percpu_ref_resurrect(&data->refs);
- node = io_rsrc_refnode_get(ctx, data, rsrc_put);
- io_sqe_rsrc_set_node(ctx, data, node);
+ node = io_rsrc_node_get(ctx, data, rsrc_put);
+ io_rsrc_node_set(ctx, data, node);
reinit_completion(&data->done);
mutex_unlock(&ctx->uring_lock);
@@ -7049,9 +7047,9 @@ static int io_rsrc_ref_quiesce(struct fixed_rsrc_data *data,
return ret;
}
-static struct fixed_rsrc_data *alloc_fixed_rsrc_data(struct io_ring_ctx *ctx)
+static struct io_rsrc_data *io_rsrc_data_alloc(struct io_ring_ctx *ctx)
{
- struct fixed_rsrc_data *data;
+ struct io_rsrc_data *data;
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data)
@@ -7067,7 +7065,7 @@ static struct fixed_rsrc_data *alloc_fixed_rsrc_data(struct io_ring_ctx *ctx)
return data;
}
-static void free_fixed_rsrc_data(struct fixed_rsrc_data *data)
+static void io_rsrc_data_free(struct io_rsrc_data *data)
{
percpu_ref_exit(&data->refs);
kfree(data->table);
@@ -7076,7 +7074,7 @@ static void free_fixed_rsrc_data(struct fixed_rsrc_data *data)
static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
{
- struct fixed_rsrc_data *data = ctx->file_data;
+ struct io_rsrc_data *data = ctx->file_data;
unsigned nr_tables, i;
int ret;
@@ -7095,7 +7093,7 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
nr_tables = DIV_ROUND_UP(ctx->nr_user_files, IORING_MAX_FILES_TABLE);
for (i = 0; i < nr_tables; i++)
kfree(data->table[i].files);
- free_fixed_rsrc_data(data);
+ io_rsrc_data_free(data);
ctx->file_data = NULL;
ctx->nr_user_files = 0;
return 0;
@@ -7324,7 +7322,7 @@ static int io_sqe_files_scm(struct io_ring_ctx *ctx)
}
#endif
-static int io_sqe_alloc_file_tables(struct fixed_rsrc_data *file_data,
+static int io_sqe_alloc_file_tables(struct io_rsrc_data *file_data,
unsigned nr_tables, unsigned nr_files)
{
int i;
@@ -7414,9 +7412,9 @@ static void io_ring_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
#endif
}
-static void __io_rsrc_put_work(struct fixed_rsrc_ref_node *ref_node)
+static void __io_rsrc_put_work(struct io_rsrc_node *ref_node)
{
- struct fixed_rsrc_data *rsrc_data = ref_node->rsrc_data;
+ struct io_rsrc_data *rsrc_data = ref_node->rsrc_data;
struct io_ring_ctx *ctx = rsrc_data->ctx;
struct io_rsrc_put *prsrc, *tmp;
@@ -7440,10 +7438,10 @@ static void io_rsrc_put_work(struct work_struct *work)
node = llist_del_all(&ctx->rsrc_put_llist);
while (node) {
- struct fixed_rsrc_ref_node *ref_node;
+ struct io_rsrc_node *ref_node;
struct llist_node *next = node->next;
- ref_node = llist_entry(node, struct fixed_rsrc_ref_node, llist);
+ ref_node = llist_entry(node, struct io_rsrc_node, llist);
__io_rsrc_put_work(ref_node);
node = next;
}
@@ -7451,27 +7449,23 @@ static void io_rsrc_put_work(struct work_struct *work)
static void io_rsrc_node_ref_zero(struct percpu_ref *ref)
{
- struct fixed_rsrc_ref_node *ref_node;
- struct fixed_rsrc_data *data;
- struct io_ring_ctx *ctx;
+ struct io_rsrc_node *node = container_of(ref, struct io_rsrc_node, refs);
+ struct io_rsrc_data *data = node->rsrc_data;
+ struct io_ring_ctx *ctx = data->ctx;
bool first_add = false;
int delay = HZ;
- ref_node = container_of(ref, struct fixed_rsrc_ref_node, refs);
- data = ref_node->rsrc_data;
- ctx = data->ctx;
-
io_rsrc_ref_lock(ctx);
- ref_node->done = true;
+ node->done = true;
while (!list_empty(&ctx->rsrc_ref_list)) {
- ref_node = list_first_entry(&ctx->rsrc_ref_list,
- struct fixed_rsrc_ref_node, node);
+ node = list_first_entry(&ctx->rsrc_ref_list,
+ struct io_rsrc_node, node);
/* recycle ref nodes in order */
- if (!ref_node->done)
+ if (!node->done)
break;
- list_del(&ref_node->node);
- first_add |= llist_add(&ref_node->llist, &ctx->rsrc_put_llist);
+ list_del(&node->node);
+ first_add |= llist_add(&node->llist, &ctx->rsrc_put_llist);
}
io_rsrc_ref_unlock(ctx);
@@ -7484,10 +7478,9 @@ static void io_rsrc_node_ref_zero(struct percpu_ref *ref)
queue_delayed_work(system_wq, &ctx->rsrc_put_work, delay);
}
-static struct fixed_rsrc_ref_node *alloc_fixed_rsrc_ref_node(
- struct io_ring_ctx *ctx)
+static struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx)
{
- struct fixed_rsrc_ref_node *ref_node;
+ struct io_rsrc_node *ref_node;
ref_node = kzalloc(sizeof(*ref_node), GFP_KERNEL);
if (!ref_node)
@@ -7505,19 +7498,18 @@ static struct fixed_rsrc_ref_node *alloc_fixed_rsrc_ref_node(
}
static void init_fixed_file_ref_node(struct io_ring_ctx *ctx,
- struct fixed_rsrc_ref_node *ref_node)
+ struct io_rsrc_node *ref_node)
{
ref_node->rsrc_data = ctx->file_data;
ref_node->rsrc_put = io_ring_file_put;
}
-static void destroy_fixed_rsrc_ref_node(struct fixed_rsrc_ref_node *ref_node)
+static void io_rsrc_node_destroy(struct io_rsrc_node *ref_node)
{
percpu_ref_exit(&ref_node->refs);
kfree(ref_node);
}
-
static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
unsigned nr_args)
{
@@ -7525,8 +7517,8 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
unsigned nr_tables, i;
struct file *file;
int fd, ret = -ENOMEM;
- struct fixed_rsrc_ref_node *ref_node;
- struct fixed_rsrc_data *file_data;
+ struct io_rsrc_node *ref_node;
+ struct io_rsrc_data *file_data;
if (ctx->file_data)
return -EBUSY;
@@ -7535,7 +7527,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
if (nr_args > IORING_MAX_FIXED_FILES)
return -EMFILE;
- file_data = alloc_fixed_rsrc_data(ctx);
+ file_data = io_rsrc_data_alloc(ctx);
if (!file_data)
return -ENOMEM;
ctx->file_data = file_data;
@@ -7592,14 +7584,14 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return ret;
}
- ref_node = alloc_fixed_rsrc_ref_node(ctx);
+ ref_node = io_rsrc_node_alloc(ctx);
if (!ref_node) {
io_sqe_files_unregister(ctx);
return -ENOMEM;
}
init_fixed_file_ref_node(ctx, ref_node);
- io_sqe_rsrc_set_node(ctx, file_data, ref_node);
+ io_rsrc_node_set(ctx, file_data, ref_node);
return ret;
out_fput:
for (i = 0; i < ctx->nr_user_files; i++) {
@@ -7611,7 +7603,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
kfree(file_data->table[i].files);
ctx->nr_user_files = 0;
out_free:
- free_fixed_rsrc_data(ctx->file_data);
+ io_rsrc_data_free(ctx->file_data);
ctx->file_data = NULL;
return ret;
}
@@ -7659,10 +7651,10 @@ static int io_sqe_file_register(struct io_ring_ctx *ctx, struct file *file,
#endif
}
-static int io_queue_rsrc_removal(struct fixed_rsrc_data *data, void *rsrc)
+static int io_queue_rsrc_removal(struct io_rsrc_data *data, void *rsrc)
{
struct io_rsrc_put *prsrc;
- struct fixed_rsrc_ref_node *ref_node = data->node;
+ struct io_rsrc_node *ref_node = data->node;
prsrc = kzalloc(sizeof(*prsrc), GFP_KERNEL);
if (!prsrc)
@@ -7674,7 +7666,7 @@ static int io_queue_rsrc_removal(struct fixed_rsrc_data *data, void *rsrc)
return 0;
}
-static inline int io_queue_file_removal(struct fixed_rsrc_data *data,
+static inline int io_queue_file_removal(struct io_rsrc_data *data,
struct file *file)
{
return io_queue_rsrc_removal(data, (void *)file);
@@ -7684,8 +7676,8 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
struct io_uring_rsrc_update *up,
unsigned nr_args)
{
- struct fixed_rsrc_data *data = ctx->file_data;
- struct fixed_rsrc_ref_node *ref_node;
+ struct io_rsrc_data *data = ctx->file_data;
+ struct io_rsrc_node *ref_node;
struct file *file, **file_slot;
__s32 __user *fds;
int fd, i, err;
@@ -7696,7 +7688,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
return -EOVERFLOW;
if (done > ctx->nr_user_files)
return -EINVAL;
- err = io_rsrc_refnode_prealloc(ctx);
+ err = io_rsrc_node_prealloc(ctx);
if (err)
return err;
@@ -7752,8 +7744,8 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
if (needs_switch) {
percpu_ref_kill(&data->node->refs);
- ref_node = io_rsrc_refnode_get(ctx, data, io_ring_file_put);
- io_sqe_rsrc_set_node(ctx, data, ref_node);
+ ref_node = io_rsrc_node_get(ctx, data, io_ring_file_put);
+ io_rsrc_node_set(ctx, data, ref_node);
}
return done ? done : err;
}
@@ -8431,7 +8423,7 @@ static void io_ring_ctx_free(struct io_ring_ctx *ctx)
io_destroy_buffers(ctx);
if (ctx->rsrc_backup_node)
- destroy_fixed_rsrc_ref_node(ctx->rsrc_backup_node);
+ io_rsrc_node_destroy(ctx->rsrc_backup_node);
#if defined(CONFIG_UNIX)
if (ctx->ring_sock) {
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 02/17] io_uring: simplify io_rsrc_node_ref_zero
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 01/17] io_uring: name rsrc bits consistently Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 03/17] io_uring: use rsrc prealloc infra for files reg Pavel Begunkov
` (14 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
Replace queue_delayed_work() with mod_delayed_work() in
io_rsrc_node_ref_zero() as the later one can schedule a new work, and
cleanup it further for better readability.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index b2c6d91749df..502b0f6c755b 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -7453,7 +7453,7 @@ static void io_rsrc_node_ref_zero(struct percpu_ref *ref)
struct io_rsrc_data *data = node->rsrc_data;
struct io_ring_ctx *ctx = data->ctx;
bool first_add = false;
- int delay = HZ;
+ int delay;
io_rsrc_ref_lock(ctx);
node->done = true;
@@ -7469,13 +7469,9 @@ static void io_rsrc_node_ref_zero(struct percpu_ref *ref)
}
io_rsrc_ref_unlock(ctx);
- if (percpu_ref_is_dying(&data->refs))
- delay = 0;
-
- if (!delay)
- mod_delayed_work(system_wq, &ctx->rsrc_put_work, 0);
- else if (first_add)
- queue_delayed_work(system_wq, &ctx->rsrc_put_work, delay);
+ delay = percpu_ref_is_dying(&data->refs) ? 0 : HZ;
+ if (first_add || !delay)
+ mod_delayed_work(system_wq, &ctx->rsrc_put_work, delay);
}
static struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx)
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 03/17] io_uring: use rsrc prealloc infra for files reg
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 01/17] io_uring: name rsrc bits consistently Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 02/17] io_uring: simplify io_rsrc_node_ref_zero Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 04/17] io_uring: encapsulate rsrc node manipulations Pavel Begunkov
` (13 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
Keep it consistent with update and use io_rsrc_node_prealloc() +
io_rsrc_node_get() in io_sqe_files_register() as well, that will be used
in future patches, not as error prone and allows to deduplicate
rsrc_node init.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 21 ++++++---------------
1 file changed, 6 insertions(+), 15 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 502b0f6c755b..a494850e4539 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -7493,13 +7493,6 @@ static struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx)
return ref_node;
}
-static void init_fixed_file_ref_node(struct io_ring_ctx *ctx,
- struct io_rsrc_node *ref_node)
-{
- ref_node->rsrc_data = ctx->file_data;
- ref_node->rsrc_put = io_ring_file_put;
-}
-
static void io_rsrc_node_destroy(struct io_rsrc_node *ref_node)
{
percpu_ref_exit(&ref_node->refs);
@@ -7512,7 +7505,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
__s32 __user *fds = (__s32 __user *) arg;
unsigned nr_tables, i;
struct file *file;
- int fd, ret = -ENOMEM;
+ int fd, ret;
struct io_rsrc_node *ref_node;
struct io_rsrc_data *file_data;
@@ -7522,12 +7515,16 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return -EINVAL;
if (nr_args > IORING_MAX_FIXED_FILES)
return -EMFILE;
+ ret = io_rsrc_node_prealloc(ctx);
+ if (ret)
+ return ret;
file_data = io_rsrc_data_alloc(ctx);
if (!file_data)
return -ENOMEM;
ctx->file_data = file_data;
+ ret = -ENOMEM;
nr_tables = DIV_ROUND_UP(nr_args, IORING_MAX_FILES_TABLE);
file_data->table = kcalloc(nr_tables, sizeof(*file_data->table),
GFP_KERNEL);
@@ -7580,13 +7577,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return ret;
}
- ref_node = io_rsrc_node_alloc(ctx);
- if (!ref_node) {
- io_sqe_files_unregister(ctx);
- return -ENOMEM;
- }
- init_fixed_file_ref_node(ctx, ref_node);
-
+ ref_node = io_rsrc_node_get(ctx, ctx->file_data, io_ring_file_put);
io_rsrc_node_set(ctx, file_data, ref_node);
return ret;
out_fput:
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 04/17] io_uring: encapsulate rsrc node manipulations
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (2 preceding siblings ...)
2021-03-25 13:07 ` [PATCH v3 03/17] io_uring: use rsrc prealloc infra for files reg Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 05/17] io_uring: move rsrc_put callback into io_rsrc_data Pavel Begunkov
` (12 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
io_rsrc_node_get() and io_rsrc_node_set() are always used together,
merge them into one so most users don't even see io_rsrc_node and don't
need to care about it.
It helped to catch io_sqe_files_register() inferring rsrc data argument
for get and set differently, not a problem but a good sign.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 39 +++++++++++++--------------------------
1 file changed, 13 insertions(+), 26 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index a494850e4539..6d49049f378f 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -6964,8 +6964,17 @@ static inline void io_rsrc_ref_unlock(struct io_ring_ctx *ctx)
static void io_rsrc_node_set(struct io_ring_ctx *ctx,
struct io_rsrc_data *rsrc_data,
- struct io_rsrc_node *rsrc_node)
+ void (*rsrc_put)(struct io_ring_ctx *ctx,
+ struct io_rsrc_put *prsrc))
{
+ struct io_rsrc_node *rsrc_node = ctx->rsrc_backup_node;
+
+ WARN_ON_ONCE(!rsrc_node);
+
+ ctx->rsrc_backup_node = NULL;
+ rsrc_node->rsrc_data = rsrc_data;
+ rsrc_node->rsrc_put = rsrc_put;
+
io_rsrc_ref_lock(ctx);
rsrc_data->node = rsrc_node;
list_add_tail(&rsrc_node->node, &ctx->rsrc_ref_list);
@@ -6993,28 +7002,11 @@ static int io_rsrc_node_prealloc(struct io_ring_ctx *ctx)
return ctx->rsrc_backup_node ? 0 : -ENOMEM;
}
-static struct io_rsrc_node *
-io_rsrc_node_get(struct io_ring_ctx *ctx,
- struct io_rsrc_data *rsrc_data,
- void (*rsrc_put)(struct io_ring_ctx *ctx,
- struct io_rsrc_put *prsrc))
-{
- struct io_rsrc_node *node = ctx->rsrc_backup_node;
-
- WARN_ON_ONCE(!node);
-
- ctx->rsrc_backup_node = NULL;
- node->rsrc_data = rsrc_data;
- node->rsrc_put = rsrc_put;
- return node;
-}
-
static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
struct io_ring_ctx *ctx,
void (*rsrc_put)(struct io_ring_ctx *ctx,
struct io_rsrc_put *prsrc))
{
- struct io_rsrc_node *node;
int ret;
if (data->quiesce)
@@ -7034,8 +7026,7 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
break;
percpu_ref_resurrect(&data->refs);
- node = io_rsrc_node_get(ctx, data, rsrc_put);
- io_rsrc_node_set(ctx, data, node);
+ io_rsrc_node_set(ctx, data, rsrc_put);
reinit_completion(&data->done);
mutex_unlock(&ctx->uring_lock);
@@ -7506,7 +7497,6 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
unsigned nr_tables, i;
struct file *file;
int fd, ret;
- struct io_rsrc_node *ref_node;
struct io_rsrc_data *file_data;
if (ctx->file_data)
@@ -7577,8 +7567,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return ret;
}
- ref_node = io_rsrc_node_get(ctx, ctx->file_data, io_ring_file_put);
- io_rsrc_node_set(ctx, file_data, ref_node);
+ io_rsrc_node_set(ctx, file_data, io_ring_file_put);
return ret;
out_fput:
for (i = 0; i < ctx->nr_user_files; i++) {
@@ -7664,7 +7653,6 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
unsigned nr_args)
{
struct io_rsrc_data *data = ctx->file_data;
- struct io_rsrc_node *ref_node;
struct file *file, **file_slot;
__s32 __user *fds;
int fd, i, err;
@@ -7731,8 +7719,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
if (needs_switch) {
percpu_ref_kill(&data->node->refs);
- ref_node = io_rsrc_node_get(ctx, data, io_ring_file_put);
- io_rsrc_node_set(ctx, data, ref_node);
+ io_rsrc_node_set(ctx, data, io_ring_file_put);
}
return done ? done : err;
}
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 05/17] io_uring: move rsrc_put callback into io_rsrc_data
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (3 preceding siblings ...)
2021-03-25 13:07 ` [PATCH v3 04/17] io_uring: encapsulate rsrc node manipulations Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 06/17] io_uring: refactor io_queue_rsrc_removal() Pavel Begunkov
` (11 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
io_rsrc_node's callback operates only on a single io_rsrc_data and only
with its resources, so rsrc_put() callback is actually a property of
io_rsrc_data. Move it there, it makes code much nicecr.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 31 ++++++++++++++-----------------
1 file changed, 14 insertions(+), 17 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 6d49049f378f..ba89cd56b6f8 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -220,16 +220,17 @@ struct io_rsrc_node {
struct list_head node;
struct list_head rsrc_list;
struct io_rsrc_data *rsrc_data;
- void (*rsrc_put)(struct io_ring_ctx *ctx,
- struct io_rsrc_put *prsrc);
struct llist_node llist;
bool done;
};
+typedef void (rsrc_put_fn)(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc);
+
struct io_rsrc_data {
struct fixed_rsrc_table *table;
struct io_ring_ctx *ctx;
+ rsrc_put_fn *do_put;
struct io_rsrc_node *node;
struct percpu_ref refs;
struct completion done;
@@ -6963,9 +6964,7 @@ static inline void io_rsrc_ref_unlock(struct io_ring_ctx *ctx)
}
static void io_rsrc_node_set(struct io_ring_ctx *ctx,
- struct io_rsrc_data *rsrc_data,
- void (*rsrc_put)(struct io_ring_ctx *ctx,
- struct io_rsrc_put *prsrc))
+ struct io_rsrc_data *rsrc_data)
{
struct io_rsrc_node *rsrc_node = ctx->rsrc_backup_node;
@@ -6973,7 +6972,6 @@ static void io_rsrc_node_set(struct io_ring_ctx *ctx,
ctx->rsrc_backup_node = NULL;
rsrc_node->rsrc_data = rsrc_data;
- rsrc_node->rsrc_put = rsrc_put;
io_rsrc_ref_lock(ctx);
rsrc_data->node = rsrc_node;
@@ -7002,10 +7000,7 @@ static int io_rsrc_node_prealloc(struct io_ring_ctx *ctx)
return ctx->rsrc_backup_node ? 0 : -ENOMEM;
}
-static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
- struct io_ring_ctx *ctx,
- void (*rsrc_put)(struct io_ring_ctx *ctx,
- struct io_rsrc_put *prsrc))
+static int io_rsrc_ref_quiesce(struct io_rsrc_data *data, struct io_ring_ctx *ctx)
{
int ret;
@@ -7026,7 +7021,7 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
break;
percpu_ref_resurrect(&data->refs);
- io_rsrc_node_set(ctx, data, rsrc_put);
+ io_rsrc_node_set(ctx, data);
reinit_completion(&data->done);
mutex_unlock(&ctx->uring_lock);
@@ -7038,7 +7033,8 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
return ret;
}
-static struct io_rsrc_data *io_rsrc_data_alloc(struct io_ring_ctx *ctx)
+static struct io_rsrc_data *io_rsrc_data_alloc(struct io_ring_ctx *ctx,
+ rsrc_put_fn *do_put)
{
struct io_rsrc_data *data;
@@ -7052,6 +7048,7 @@ static struct io_rsrc_data *io_rsrc_data_alloc(struct io_ring_ctx *ctx)
return NULL;
}
data->ctx = ctx;
+ data->do_put = do_put;
init_completion(&data->done);
return data;
}
@@ -7076,7 +7073,7 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
*/
if (!data || percpu_ref_is_dying(&data->refs))
return -ENXIO;
- ret = io_rsrc_ref_quiesce(data, ctx, io_ring_file_put);
+ ret = io_rsrc_ref_quiesce(data, ctx);
if (ret)
return ret;
@@ -7411,7 +7408,7 @@ static void __io_rsrc_put_work(struct io_rsrc_node *ref_node)
list_for_each_entry_safe(prsrc, tmp, &ref_node->rsrc_list, list) {
list_del(&prsrc->list);
- ref_node->rsrc_put(ctx, prsrc);
+ rsrc_data->do_put(ctx, prsrc);
kfree(prsrc);
}
@@ -7509,7 +7506,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
if (ret)
return ret;
- file_data = io_rsrc_data_alloc(ctx);
+ file_data = io_rsrc_data_alloc(ctx, io_ring_file_put);
if (!file_data)
return -ENOMEM;
ctx->file_data = file_data;
@@ -7567,7 +7564,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return ret;
}
- io_rsrc_node_set(ctx, file_data, io_ring_file_put);
+ io_rsrc_node_set(ctx, file_data);
return ret;
out_fput:
for (i = 0; i < ctx->nr_user_files; i++) {
@@ -7719,7 +7716,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
if (needs_switch) {
percpu_ref_kill(&data->node->refs);
- io_rsrc_node_set(ctx, data, io_ring_file_put);
+ io_rsrc_node_set(ctx, data);
}
return done ? done : err;
}
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 06/17] io_uring: refactor io_queue_rsrc_removal()
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (4 preceding siblings ...)
2021-03-25 13:07 ` [PATCH v3 05/17] io_uring: move rsrc_put callback into io_rsrc_data Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 07/17] io_uring: ctx-wide rsrc nodes Pavel Begunkov
` (10 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
Pass rsrc_node into io_queue_rsrc_removal() explicitly. Just a
simple preparation patch, makes following changes nicer.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index ba89cd56b6f8..6d2e3a3c202e 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -7624,27 +7624,20 @@ static int io_sqe_file_register(struct io_ring_ctx *ctx, struct file *file,
#endif
}
-static int io_queue_rsrc_removal(struct io_rsrc_data *data, void *rsrc)
+static int io_queue_rsrc_removal(struct io_rsrc_data *data,
+ struct io_rsrc_node *node, void *rsrc)
{
struct io_rsrc_put *prsrc;
- struct io_rsrc_node *ref_node = data->node;
prsrc = kzalloc(sizeof(*prsrc), GFP_KERNEL);
if (!prsrc)
return -ENOMEM;
prsrc->rsrc = rsrc;
- list_add(&prsrc->list, &ref_node->rsrc_list);
-
+ list_add(&prsrc->list, &node->rsrc_list);
return 0;
}
-static inline int io_queue_file_removal(struct io_rsrc_data *data,
- struct file *file)
-{
- return io_queue_rsrc_removal(data, (void *)file);
-}
-
static int __io_sqe_files_update(struct io_ring_ctx *ctx,
struct io_uring_rsrc_update *up,
unsigned nr_args)
@@ -7679,7 +7672,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
if (*file_slot) {
file = (struct file *) ((unsigned long) *file_slot & FFS_MASK);
- err = io_queue_file_removal(data, file);
+ err = io_queue_rsrc_removal(data, data->node, file);
if (err)
break;
*file_slot = NULL;
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 07/17] io_uring: ctx-wide rsrc nodes
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (5 preceding siblings ...)
2021-03-25 13:07 ` [PATCH v3 06/17] io_uring: refactor io_queue_rsrc_removal() Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 08/17] io_uring: reuse io_rsrc_node_destroy() Pavel Begunkov
` (9 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
If we're going to ever support multiple types of resources we need
shared rsrc nodes to not bloat requests, that is implemented in this
patch. It also gives a nicer API and saves one pointer dereference
in io_req_set_rsrc_node().
We may say that all requests bound to a resource belong to one and only
one rsrc node, and considering that nodes are removed and recycled
strictly in-order, this separates requests into generations, where
generation are changed on each node switch (i.e. io_rsrc_node_switch()).
The API is simple, io_rsrc_node_switch() switches to a new generation if
needed, and also optionally kills a passed in io_rsrc_data. Each call to
io_rsrc_node_switch() have to be preceded with
io_rsrc_node_switch_start(). The start function is idempotent and should
not necessarily be followed by switch.
One difference is that once a node was set it will always retain a valid
rsrc node, even on unregister. It may be a nuisance at the moment, but
makes much sense for multiple types of resources. Another thing changed
is that nodes are bound to/associated with a io_rsrc_data later just
before killing (i.e. switching).
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 73 ++++++++++++++++++++++++++-------------------------
1 file changed, 37 insertions(+), 36 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 6d2e3a3c202e..1328ff24d557 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -231,7 +231,6 @@ struct io_rsrc_data {
struct io_ring_ctx *ctx;
rsrc_put_fn *do_put;
- struct io_rsrc_node *node;
struct percpu_ref refs;
struct completion done;
bool quiesce;
@@ -444,6 +443,7 @@ struct io_ring_ctx {
struct llist_head rsrc_put_llist;
struct list_head rsrc_ref_list;
spinlock_t rsrc_ref_lock;
+ struct io_rsrc_node *rsrc_node;
struct io_rsrc_node *rsrc_backup_node;
struct io_restriction restrictions;
@@ -1064,7 +1064,7 @@ static inline void io_req_set_rsrc_node(struct io_kiocb *req)
struct io_ring_ctx *ctx = req->ctx;
if (!req->fixed_rsrc_refs) {
- req->fixed_rsrc_refs = &ctx->file_data->node->refs;
+ req->fixed_rsrc_refs = &ctx->rsrc_node->refs;
percpu_ref_get(req->fixed_rsrc_refs);
}
}
@@ -6963,36 +6963,32 @@ static inline void io_rsrc_ref_unlock(struct io_ring_ctx *ctx)
spin_unlock_bh(&ctx->rsrc_ref_lock);
}
-static void io_rsrc_node_set(struct io_ring_ctx *ctx,
- struct io_rsrc_data *rsrc_data)
+static void io_rsrc_node_switch(struct io_ring_ctx *ctx,
+ struct io_rsrc_data *data_to_kill)
{
- struct io_rsrc_node *rsrc_node = ctx->rsrc_backup_node;
+ WARN_ON_ONCE(!ctx->rsrc_backup_node);
+ WARN_ON_ONCE(data_to_kill && !ctx->rsrc_node);
- WARN_ON_ONCE(!rsrc_node);
+ if (data_to_kill) {
+ struct io_rsrc_node *rsrc_node = ctx->rsrc_node;
- ctx->rsrc_backup_node = NULL;
- rsrc_node->rsrc_data = rsrc_data;
+ rsrc_node->rsrc_data = data_to_kill;
+ io_rsrc_ref_lock(ctx);
+ list_add_tail(&rsrc_node->node, &ctx->rsrc_ref_list);
+ io_rsrc_ref_unlock(ctx);
- io_rsrc_ref_lock(ctx);
- rsrc_data->node = rsrc_node;
- list_add_tail(&rsrc_node->node, &ctx->rsrc_ref_list);
- io_rsrc_ref_unlock(ctx);
- percpu_ref_get(&rsrc_data->refs);
-}
-
-static void io_rsrc_node_kill(struct io_ring_ctx *ctx, struct io_rsrc_data *data)
-{
- struct io_rsrc_node *ref_node = NULL;
+ percpu_ref_get(&data_to_kill->refs);
+ percpu_ref_kill(&rsrc_node->refs);
+ ctx->rsrc_node = NULL;
+ }
- io_rsrc_ref_lock(ctx);
- ref_node = data->node;
- data->node = NULL;
- io_rsrc_ref_unlock(ctx);
- if (ref_node)
- percpu_ref_kill(&ref_node->refs);
+ if (!ctx->rsrc_node) {
+ ctx->rsrc_node = ctx->rsrc_backup_node;
+ ctx->rsrc_backup_node = NULL;
+ }
}
-static int io_rsrc_node_prealloc(struct io_ring_ctx *ctx)
+static int io_rsrc_node_switch_start(struct io_ring_ctx *ctx)
{
if (ctx->rsrc_backup_node)
return 0;
@@ -7009,10 +7005,11 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data, struct io_ring_ctx *ct
data->quiesce = true;
do {
- ret = io_rsrc_node_prealloc(ctx);
+ ret = io_rsrc_node_switch_start(ctx);
if (ret)
break;
- io_rsrc_node_kill(ctx, data);
+ io_rsrc_node_switch(ctx, data);
+
percpu_ref_kill(&data->refs);
flush_delayed_work(&ctx->rsrc_put_work);
@@ -7021,7 +7018,6 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data, struct io_ring_ctx *ct
break;
percpu_ref_resurrect(&data->refs);
- io_rsrc_node_set(ctx, data);
reinit_completion(&data->done);
mutex_unlock(&ctx->uring_lock);
@@ -7502,7 +7498,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return -EINVAL;
if (nr_args > IORING_MAX_FIXED_FILES)
return -EMFILE;
- ret = io_rsrc_node_prealloc(ctx);
+ ret = io_rsrc_node_switch_start(ctx);
if (ret)
return ret;
@@ -7564,7 +7560,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return ret;
}
- io_rsrc_node_set(ctx, file_data);
+ io_rsrc_node_switch(ctx, NULL);
return ret;
out_fput:
for (i = 0; i < ctx->nr_user_files; i++) {
@@ -7653,7 +7649,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
return -EOVERFLOW;
if (done > ctx->nr_user_files)
return -EINVAL;
- err = io_rsrc_node_prealloc(ctx);
+ err = io_rsrc_node_switch_start(ctx);
if (err)
return err;
@@ -7672,7 +7668,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
if (*file_slot) {
file = (struct file *) ((unsigned long) *file_slot & FFS_MASK);
- err = io_queue_rsrc_removal(data, data->node, file);
+ err = io_queue_rsrc_removal(data, ctx->rsrc_node, file);
if (err)
break;
*file_slot = NULL;
@@ -7707,10 +7703,8 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
}
}
- if (needs_switch) {
- percpu_ref_kill(&data->node->refs);
- io_rsrc_node_set(ctx, data);
- }
+ if (needs_switch)
+ io_rsrc_node_switch(ctx, data);
return done ? done : err;
}
@@ -8386,8 +8380,15 @@ static void io_ring_ctx_free(struct io_ring_ctx *ctx)
io_eventfd_unregister(ctx);
io_destroy_buffers(ctx);
+ /* there are no registered resources left, nobody uses it */
+ if (ctx->rsrc_node)
+ io_rsrc_node_destroy(ctx->rsrc_node);
if (ctx->rsrc_backup_node)
io_rsrc_node_destroy(ctx->rsrc_backup_node);
+ flush_delayed_work(&ctx->rsrc_put_work);
+
+ WARN_ON_ONCE(!list_empty(&ctx->rsrc_ref_list));
+ WARN_ON_ONCE(!llist_empty(&ctx->rsrc_put_llist));
#if defined(CONFIG_UNIX)
if (ctx->ring_sock) {
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 08/17] io_uring: reuse io_rsrc_node_destroy()
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (6 preceding siblings ...)
2021-03-25 13:07 ` [PATCH v3 07/17] io_uring: ctx-wide rsrc nodes Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 09/17] io_uring: remove useless is_dying check on quiesce Pavel Begunkov
` (8 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
Reuse io_rsrc_node_destroy() in __io_rsrc_put_work(). Also move it to a
more appropriate place -- to the other node routines, and remove forward
declaration.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 1328ff24d557..9da4a1981560 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -1013,7 +1013,6 @@ static void io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
struct task_struct *task,
struct files_struct *files);
static void io_uring_cancel_sqpoll(struct io_ring_ctx *ctx);
-static void io_rsrc_node_destroy(struct io_rsrc_node *ref_node);
static struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx);
static void io_ring_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc);
@@ -6963,6 +6962,12 @@ static inline void io_rsrc_ref_unlock(struct io_ring_ctx *ctx)
spin_unlock_bh(&ctx->rsrc_ref_lock);
}
+static void io_rsrc_node_destroy(struct io_rsrc_node *ref_node)
+{
+ percpu_ref_exit(&ref_node->refs);
+ kfree(ref_node);
+}
+
static void io_rsrc_node_switch(struct io_ring_ctx *ctx,
struct io_rsrc_data *data_to_kill)
{
@@ -7408,8 +7413,7 @@ static void __io_rsrc_put_work(struct io_rsrc_node *ref_node)
kfree(prsrc);
}
- percpu_ref_exit(&ref_node->refs);
- kfree(ref_node);
+ io_rsrc_node_destroy(ref_node);
percpu_ref_put(&rsrc_data->refs);
}
@@ -7477,12 +7481,6 @@ static struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx)
return ref_node;
}
-static void io_rsrc_node_destroy(struct io_rsrc_node *ref_node)
-{
- percpu_ref_exit(&ref_node->refs);
- kfree(ref_node);
-}
-
static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
unsigned nr_args)
{
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 09/17] io_uring: remove useless is_dying check on quiesce
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (7 preceding siblings ...)
2021-03-25 13:07 ` [PATCH v3 08/17] io_uring: reuse io_rsrc_node_destroy() Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 10/17] io_uring: refactor rw reissue Pavel Begunkov
` (7 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
rsrc_data refs should always be valid for potential submitters,
io_rsrc_ref_quiesce() restores it before unlocking, so
percpu_ref_is_dying() check in io_sqe_files_unregister() does nothing
and misleading. Concurrent quiesce is prevented with
struct io_rsrc_data::quiesce.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 9da4a1981560..a57fe91f06d2 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -7005,6 +7005,7 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data, struct io_ring_ctx *ct
{
int ret;
+ /* As we may drop ->uring_lock, other task may have started quiesce */
if (data->quiesce)
return -ENXIO;
@@ -7067,12 +7068,7 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
unsigned nr_tables, i;
int ret;
- /*
- * percpu_ref_is_dying() is to stop parallel files unregister
- * Since we possibly drop uring lock later in this function to
- * run task work.
- */
- if (!data || percpu_ref_is_dying(&data->refs))
+ if (!data)
return -ENXIO;
ret = io_rsrc_ref_quiesce(data, ctx);
if (ret)
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 10/17] io_uring: refactor rw reissue
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (8 preceding siblings ...)
2021-03-25 13:07 ` [PATCH v3 09/17] io_uring: remove useless is_dying check on quiesce Pavel Begunkov
@ 2021-03-25 13:07 ` Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 11/17] io_uring: combine lock/unlock sections on exit Pavel Begunkov
` (6 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:07 UTC (permalink / raw)
To: Jens Axboe, io-uring
Move io_rw_should_reissue() check into io_resubmit_prep(), so we don't
need, so we can remove it from io_rw_reissue() and
io_complete_rw_iopoll().
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 37 ++++++++++++++++---------------------
1 file changed, 16 insertions(+), 21 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index a57fe91f06d2..350ada47d5fb 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -2472,17 +2472,6 @@ static void kiocb_end_write(struct io_kiocb *req)
}
#ifdef CONFIG_BLOCK
-static bool io_resubmit_prep(struct io_kiocb *req)
-{
- struct io_async_rw *rw = req->async_data;
-
- if (!rw)
- return !io_req_prep_async(req);
- /* may have left rw->iter inconsistent on -EIOCBQUEUED */
- iov_iter_revert(&rw->iter, req->result - iov_iter_count(&rw->iter));
- return true;
-}
-
static bool io_rw_should_reissue(struct io_kiocb *req)
{
umode_t mode = file_inode(req->file)->i_mode;
@@ -2498,26 +2487,34 @@ static bool io_rw_should_reissue(struct io_kiocb *req)
* Don't attempt to reissue from that path, just let it fail with
* -EAGAIN.
*/
- if (percpu_ref_is_dying(&ctx->refs))
- return false;
- return true;
+ return !percpu_ref_is_dying(&ctx->refs);
}
-#endif
-static bool io_rw_reissue(struct io_kiocb *req)
+static bool io_resubmit_prep(struct io_kiocb *req)
{
-#ifdef CONFIG_BLOCK
+ struct io_async_rw *rw = req->async_data;
+
if (!io_rw_should_reissue(req))
return false;
lockdep_assert_held(&req->ctx->uring_lock);
+ if (!rw)
+ return !io_req_prep_async(req);
+ /* may have left rw->iter inconsistent on -EIOCBQUEUED */
+ iov_iter_revert(&rw->iter, req->result - iov_iter_count(&rw->iter));
+ return true;
+}
+#endif
+
+static bool io_rw_reissue(struct io_kiocb *req)
+{
+#ifdef CONFIG_BLOCK
if (io_resubmit_prep(req)) {
req_ref_get(req);
io_queue_async_work(req);
return true;
}
- req_set_fail_links(req);
#endif
return false;
}
@@ -2556,9 +2553,7 @@ static void io_complete_rw_iopoll(struct kiocb *kiocb, long res, long res2)
bool fail = true;
#ifdef CONFIG_BLOCK
- if (res == -EAGAIN && io_rw_should_reissue(req) &&
- io_resubmit_prep(req))
- fail = false;
+ fail = res != -EAGAIN || !io_resubmit_prep(req);
#endif
if (fail) {
req_set_fail_links(req);
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 11/17] io_uring: combine lock/unlock sections on exit
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (9 preceding siblings ...)
2021-03-25 13:07 ` [PATCH v3 10/17] io_uring: refactor rw reissue Pavel Begunkov
@ 2021-03-25 13:08 ` Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 12/17] io_uring: better ref handling in poll_remove_one Pavel Begunkov
` (5 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:08 UTC (permalink / raw)
To: Jens Axboe, io-uring
io_ring_exit_work() already does uring_lock lock/unlock, no need to
repeat it for lock waiting trick in io_ring_ctx_free(). Move the waiting
with comments and spinlocking into io_ring_exit_work.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 350ada47d5fb..454381c19d25 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -8345,16 +8345,6 @@ static void io_req_caches_free(struct io_ring_ctx *ctx)
static void io_ring_ctx_free(struct io_ring_ctx *ctx)
{
- /*
- * Some may use context even when all refs and requests have been put,
- * and they are free to do so while still holding uring_lock or
- * completion_lock, see __io_req_task_submit(). Wait for them to finish.
- */
- mutex_lock(&ctx->uring_lock);
- mutex_unlock(&ctx->uring_lock);
- spin_lock_irq(&ctx->completion_lock);
- spin_unlock_irq(&ctx->completion_lock);
-
io_sq_thread_finish(ctx);
io_sqe_buffers_unregister(ctx);
@@ -8505,6 +8495,12 @@ static void io_ring_exit_work(struct work_struct *work)
WARN_ON_ONCE(time_after(jiffies, timeout));
} while (!wait_for_completion_timeout(&ctx->ref_comp, HZ/20));
+ /*
+ * Some may use context even when all refs and requests have been put,
+ * and they are free to do so while still holding uring_lock or
+ * completion_lock, see __io_req_task_submit(). Apart from other work,
+ * this lock/unlock section also waits them to finish.
+ */
mutex_lock(&ctx->uring_lock);
while (!list_empty(&ctx->tctx_list)) {
WARN_ON_ONCE(time_after(jiffies, timeout));
@@ -8525,6 +8521,8 @@ static void io_ring_exit_work(struct work_struct *work)
mutex_lock(&ctx->uring_lock);
}
mutex_unlock(&ctx->uring_lock);
+ spin_lock_irq(&ctx->completion_lock);
+ spin_unlock_irq(&ctx->completion_lock);
io_ring_ctx_free(ctx);
}
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 12/17] io_uring: better ref handling in poll_remove_one
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (10 preceding siblings ...)
2021-03-25 13:08 ` [PATCH v3 11/17] io_uring: combine lock/unlock sections on exit Pavel Begunkov
@ 2021-03-25 13:08 ` Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 13/17] io_uring: remove unused hash_wait Pavel Begunkov
` (4 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:08 UTC (permalink / raw)
To: Jens Axboe, io-uring
Instead of io_put_req() to drop not a final ref, use req_ref_put(),
which is slimmer and will also check the invariant.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 454381c19d25..a4c94dc7edc8 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -5212,7 +5212,7 @@ static bool io_poll_remove_one(struct io_kiocb *req)
/* non-poll requests have submit ref still */
do_complete = __io_poll_remove_one(req, &apoll->poll);
if (do_complete) {
- io_put_req(req);
+ req_ref_put(req);
kfree(apoll->double_poll);
kfree(apoll);
}
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 13/17] io_uring: remove unused hash_wait
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (11 preceding siblings ...)
2021-03-25 13:08 ` [PATCH v3 12/17] io_uring: better ref handling in poll_remove_one Pavel Begunkov
@ 2021-03-25 13:08 ` Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 14/17] io_uring: refactor io_async_cancel() Pavel Begunkov
` (3 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:08 UTC (permalink / raw)
To: Jens Axboe, io-uring
No users of io_uring_ctx::hash_wait left, kill it.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index a4c94dc7edc8..ebd152b1cd6d 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -451,8 +451,6 @@ struct io_ring_ctx {
/* exit task_work */
struct callback_head *exit_task_work;
- struct wait_queue_head hash_wait;
-
/* Keep this last, we don't need it for the fast path */
struct work_struct exit_work;
struct list_head tctx_list;
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 14/17] io_uring: refactor io_async_cancel()
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (12 preceding siblings ...)
2021-03-25 13:08 ` [PATCH v3 13/17] io_uring: remove unused hash_wait Pavel Begunkov
@ 2021-03-25 13:08 ` Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 15/17] io_uring: improve import_fixed overflow checks Pavel Begunkov
` (2 subsequent siblings)
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:08 UTC (permalink / raw)
To: Jens Axboe, io-uring
Remove extra tctx==NULL checks that are already done by
io_async_cancel_one().
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index ebd152b1cd6d..b324f7c7a5cc 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -5696,8 +5696,6 @@ static int io_async_cancel(struct io_kiocb *req, unsigned int issue_flags)
list_for_each_entry(node, &ctx->tctx_list, ctx_node) {
struct io_uring_task *tctx = node->task->io_uring;
- if (!tctx || !tctx->io_wq)
- continue;
ret = io_async_cancel_one(tctx, req->cancel.addr, ctx);
if (ret != -ENOENT)
break;
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 15/17] io_uring: improve import_fixed overflow checks
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (13 preceding siblings ...)
2021-03-25 13:08 ` [PATCH v3 14/17] io_uring: refactor io_async_cancel() Pavel Begunkov
@ 2021-03-25 13:08 ` Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 16/17] io_uring: store reg buffer end instead of length Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 17/17] io_uring: kill unused forward decls Pavel Begunkov
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:08 UTC (permalink / raw)
To: Jens Axboe, io-uring
Replace a hand-coded overflow check with a specialised function. Even
though compilers are smart enough to generate identical binary (i.e.
check carry bit), but it's more foolproof and conveys the intention
better.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index b324f7c7a5cc..f30580f59070 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -2802,8 +2802,8 @@ static int io_import_fixed(struct io_kiocb *req, int rw, struct iov_iter *iter)
size_t len = req->rw.len;
struct io_mapped_ubuf *imu;
u16 index, buf_index = req->buf_index;
+ u64 buf_end, buf_addr = req->rw.addr;
size_t offset;
- u64 buf_addr;
if (unlikely(buf_index >= ctx->nr_user_bufs))
return -EFAULT;
@@ -2811,11 +2811,10 @@ static int io_import_fixed(struct io_kiocb *req, int rw, struct iov_iter *iter)
imu = &ctx->user_bufs[index];
buf_addr = req->rw.addr;
- /* overflow */
- if (buf_addr + len < buf_addr)
+ if (unlikely(check_add_overflow(buf_addr, (u64)len, &buf_end)))
return -EFAULT;
/* not inside the mapped region */
- if (buf_addr < imu->ubuf || buf_addr + len > imu->ubuf + imu->len)
+ if (buf_addr < imu->ubuf || buf_end > imu->ubuf + imu->len)
return -EFAULT;
/*
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 16/17] io_uring: store reg buffer end instead of length
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (14 preceding siblings ...)
2021-03-25 13:08 ` [PATCH v3 15/17] io_uring: improve import_fixed overflow checks Pavel Begunkov
@ 2021-03-25 13:08 ` Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 17/17] io_uring: kill unused forward decls Pavel Begunkov
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:08 UTC (permalink / raw)
To: Jens Axboe, io-uring
It's a bit more convenient for us to store a registered buffer end
address instead of length, see struct io_mapped_ubuf, as it allow to not
recompute it every time.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index f30580f59070..9f062bddae31 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -195,7 +195,7 @@ enum io_uring_cmd_flags {
struct io_mapped_ubuf {
u64 ubuf;
- size_t len;
+ u64 ubuf_end;
struct bio_vec *bvec;
unsigned int nr_bvecs;
unsigned long acct_pages;
@@ -2814,7 +2814,7 @@ static int io_import_fixed(struct io_kiocb *req, int rw, struct iov_iter *iter)
if (unlikely(check_add_overflow(buf_addr, (u64)len, &buf_end)))
return -EFAULT;
/* not inside the mapped region */
- if (buf_addr < imu->ubuf || buf_end > imu->ubuf + imu->len)
+ if (unlikely(buf_addr < imu->ubuf || buf_end > imu->ubuf_end))
return -EFAULT;
/*
@@ -8186,7 +8186,7 @@ static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
}
/* store original address for later verification */
imu->ubuf = ubuf;
- imu->len = iov->iov_len;
+ imu->ubuf_end = ubuf + iov->iov_len;
imu->nr_bvecs = nr_pages;
ret = 0;
done:
@@ -9222,9 +9222,9 @@ static void __io_uring_show_fdinfo(struct io_ring_ctx *ctx, struct seq_file *m)
seq_printf(m, "UserBufs:\t%u\n", ctx->nr_user_bufs);
for (i = 0; has_lock && i < ctx->nr_user_bufs; i++) {
struct io_mapped_ubuf *buf = &ctx->user_bufs[i];
+ unsigned int len = buf->ubuf_end - buf->ubuf;
- seq_printf(m, "%5u: 0x%llx/%u\n", i, buf->ubuf,
- (unsigned int) buf->len);
+ seq_printf(m, "%5u: 0x%llx/%u\n", i, buf->ubuf, len);
}
if (has_lock && !xa_empty(&ctx->personalities)) {
unsigned long index;
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v3 17/17] io_uring: kill unused forward decls
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
` (15 preceding siblings ...)
2021-03-25 13:08 ` [PATCH v3 16/17] io_uring: store reg buffer end instead of length Pavel Begunkov
@ 2021-03-25 13:08 ` Pavel Begunkov
16 siblings, 0 replies; 18+ messages in thread
From: Pavel Begunkov @ 2021-03-25 13:08 UTC (permalink / raw)
To: Jens Axboe, io-uring
Kill unused forward declarations for io_ring_file_put() and
io_queue_next(). Also btw rename the first one.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
fs/io_uring.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 9f062bddae31..661082f2094e 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -1012,14 +1012,12 @@ static void io_uring_try_cancel_requests(struct io_ring_ctx *ctx,
struct files_struct *files);
static void io_uring_cancel_sqpoll(struct io_ring_ctx *ctx);
static struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx);
-static void io_ring_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc);
static void io_cqring_fill_event(struct io_kiocb *req, long res);
static void io_put_req(struct io_kiocb *req);
static void io_put_req_deferred(struct io_kiocb *req, int nr);
static void io_dismantle_req(struct io_kiocb *req);
static void io_put_task(struct task_struct *task, int nr);
-static void io_queue_next(struct io_kiocb *req);
static struct io_kiocb *io_prep_linked_timeout(struct io_kiocb *req);
static void io_queue_linked_timeout(struct io_kiocb *req);
static int __io_sqe_files_update(struct io_ring_ctx *ctx,
@@ -7324,7 +7322,7 @@ static int io_sqe_alloc_file_tables(struct io_rsrc_data *file_data,
return 1;
}
-static void io_ring_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
+static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
{
struct file *file = prsrc->file;
#if defined(CONFIG_UNIX)
@@ -7486,7 +7484,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
if (ret)
return ret;
- file_data = io_rsrc_data_alloc(ctx, io_ring_file_put);
+ file_data = io_rsrc_data_alloc(ctx, io_rsrc_file_put);
if (!file_data)
return -ENOMEM;
ctx->file_data = file_data;
--
2.24.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
end of thread, other threads:[~2021-03-25 13:13 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-03-25 13:07 [PATCH v3 for-5.13 00/17] ctx wide rsrc nodes + other stuff Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 01/17] io_uring: name rsrc bits consistently Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 02/17] io_uring: simplify io_rsrc_node_ref_zero Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 03/17] io_uring: use rsrc prealloc infra for files reg Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 04/17] io_uring: encapsulate rsrc node manipulations Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 05/17] io_uring: move rsrc_put callback into io_rsrc_data Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 06/17] io_uring: refactor io_queue_rsrc_removal() Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 07/17] io_uring: ctx-wide rsrc nodes Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 08/17] io_uring: reuse io_rsrc_node_destroy() Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 09/17] io_uring: remove useless is_dying check on quiesce Pavel Begunkov
2021-03-25 13:07 ` [PATCH v3 10/17] io_uring: refactor rw reissue Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 11/17] io_uring: combine lock/unlock sections on exit Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 12/17] io_uring: better ref handling in poll_remove_one Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 13/17] io_uring: remove unused hash_wait Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 14/17] io_uring: refactor io_async_cancel() Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 15/17] io_uring: improve import_fixed overflow checks Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 16/17] io_uring: store reg buffer end instead of length Pavel Begunkov
2021-03-25 13:08 ` [PATCH v3 17/17] io_uring: kill unused forward decls Pavel Begunkov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.