All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Begunkov <asml.silence@gmail.com>
To: Jens Axboe <axboe@kernel.dk>, io-uring@vger.kernel.org
Subject: [PATCH v4 24/26] io_uring: refactor file tables alloc/free
Date: Thu,  1 Apr 2021 15:44:03 +0100	[thread overview]
Message-ID: <502a84ebf41ff119b095e59661e678eacb752bf8.1617287883.git.asml.silence@gmail.com> (raw)
In-Reply-To: <cover.1617287883.git.asml.silence@gmail.com>

Introduce a heler io_free_file_tables() doing all the cleaning, there
are several places where it's hand coded. Also move all allocations into
io_sqe_alloc_file_tables() and rename it, so all of it is in one place.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
 fs/io_uring.c | 52 +++++++++++++++++++++++++--------------------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 2b8496f76baa..a9984ca025ba 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -7031,6 +7031,16 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events,
 	return READ_ONCE(rings->cq.head) == READ_ONCE(rings->cq.tail) ? ret : 0;
 }
 
+static void io_free_file_tables(struct io_rsrc_data *data, unsigned nr_files)
+{
+	unsigned i, nr_tables = DIV_ROUND_UP(nr_files, IORING_MAX_FILES_TABLE);
+
+	for (i = 0; i < nr_tables; i++)
+		kfree(data->table[i].files);
+	kfree(data->table);
+	data->table = NULL;
+}
+
 static void __io_sqe_files_unregister(struct io_ring_ctx *ctx)
 {
 #if defined(CONFIG_UNIX)
@@ -7167,14 +7177,12 @@ static struct io_rsrc_data *io_rsrc_data_alloc(struct io_ring_ctx *ctx,
 static void io_rsrc_data_free(struct io_rsrc_data *data)
 {
 	percpu_ref_exit(&data->refs);
-	kfree(data->table);
 	kfree(data);
 }
 
 static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
 {
 	struct io_rsrc_data *data = ctx->file_data;
-	unsigned nr_tables, i;
 	int ret;
 
 	if (!data)
@@ -7184,9 +7192,7 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
 		return ret;
 
 	__io_sqe_files_unregister(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);
+	io_free_file_tables(data, ctx->nr_user_files);
 	io_rsrc_data_free(data);
 	ctx->file_data = NULL;
 	ctx->nr_user_files = 0;
@@ -7416,16 +7422,20 @@ static int io_sqe_files_scm(struct io_ring_ctx *ctx)
 }
 #endif
 
-static int io_sqe_alloc_file_tables(struct io_rsrc_data *file_data,
-				    unsigned nr_tables, unsigned nr_files)
+static bool io_alloc_file_tables(struct io_rsrc_data *file_data,
+				 unsigned nr_files)
 {
-	int i;
+	unsigned i, nr_tables = DIV_ROUND_UP(nr_files, IORING_MAX_FILES_TABLE);
+
+	file_data->table = kcalloc(nr_tables, sizeof(*file_data->table),
+				   GFP_KERNEL);
+	if (!file_data->table)
+		return false;
 
 	for (i = 0; i < nr_tables; i++) {
 		struct fixed_rsrc_table *table = &file_data->table[i];
-		unsigned this_files;
+		unsigned int this_files = min(nr_files, IORING_MAX_FILES_TABLE);
 
-		this_files = min(nr_files, IORING_MAX_FILES_TABLE);
 		table->files = kcalloc(this_files, sizeof(struct file *),
 					GFP_KERNEL);
 		if (!table->files)
@@ -7434,13 +7444,10 @@ static int io_sqe_alloc_file_tables(struct io_rsrc_data *file_data,
 	}
 
 	if (i == nr_tables)
-		return 0;
+		return true;
 
-	for (i = 0; i < nr_tables; i++) {
-		struct fixed_rsrc_table *table = &file_data->table[i];
-		kfree(table->files);
-	}
-	return 1;
+	io_free_file_tables(file_data, nr_tables * IORING_MAX_FILES_TABLE);
+	return false;
 }
 
 static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc)
@@ -7590,9 +7597,9 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
 				 unsigned nr_args)
 {
 	__s32 __user *fds = (__s32 __user *) arg;
-	unsigned nr_tables, i;
 	struct file *file;
 	int fd, ret;
+	unsigned i;
 	struct io_rsrc_data *file_data;
 
 	if (ctx->file_data)
@@ -7611,13 +7618,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
 	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);
-	if (!file_data->table)
-		goto out_free;
-
-	if (io_sqe_alloc_file_tables(file_data, nr_tables, nr_args))
+	if (!io_alloc_file_tables(file_data, nr_args))
 		goto out_free;
 
 	for (i = 0; i < nr_args; i++, ctx->nr_user_files++) {
@@ -7662,8 +7663,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
 		if (file)
 			fput(file);
 	}
-	for (i = 0; i < nr_tables; i++)
-		kfree(file_data->table[i].files);
+	io_free_file_tables(file_data, nr_args);
 	ctx->nr_user_files = 0;
 out_free:
 	io_rsrc_data_free(ctx->file_data);
-- 
2.24.0


  parent reply	other threads:[~2021-04-01 18:02 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-01 14:43 [PATCH v4 00/26] ctx wide rsrc nodes + Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 01/26] io_uring: name rsrc bits consistently Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 02/26] io_uring: simplify io_rsrc_node_ref_zero Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 03/26] io_uring: use rsrc prealloc infra for files reg Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 04/26] io_uring: encapsulate rsrc node manipulations Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 05/26] io_uring: move rsrc_put callback into io_rsrc_data Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 06/26] io_uring: refactor io_queue_rsrc_removal() Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 07/26] io_uring: ctx-wide rsrc nodes Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 08/26] io_uring: reuse io_rsrc_node_destroy() Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 09/26] io_uring: remove useless is_dying check on quiesce Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 10/26] io_uring: refactor rw reissue Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 11/26] io_uring: combine lock/unlock sections on exit Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 12/26] io_uring: better ref handling in poll_remove_one Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 13/26] io_uring: remove unused hash_wait Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 14/26] io_uring: refactor io_async_cancel() Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 15/26] io_uring: improve import_fixed overflow checks Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 16/26] io_uring: store reg buffer end instead of length Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 17/26] io_uring: kill unused forward decls Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 18/26] io_uring: lock annotate timeouts and poll Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 19/26] io_uring: simplify overflow handling Pavel Begunkov
2021-04-01 14:43 ` [PATCH v4 20/26] io_uring: put link timeout req consistently Pavel Begunkov
2021-04-01 14:44 ` [PATCH v4 21/26] io_uring: deduplicate NOSIGNAL setting Pavel Begunkov
2021-04-01 14:44 ` [PATCH v4 22/26] io_uring: set proper FFS* flags on reg file update Pavel Begunkov
2021-04-01 14:44 ` [PATCH v4 23/26] io_uring: don't quiesce intial files register Pavel Begunkov
2021-04-01 14:44 ` Pavel Begunkov [this message]
2021-04-01 14:44 ` [PATCH v4 25/26] io_uring: encapsulate fixed files into struct Pavel Begunkov
2021-04-01 14:44 ` [PATCH v4 26/26] io_uring: kill outdated comment about splice punt Pavel Begunkov
2021-04-04 19:16 ` [PATCH v4 00/26] ctx wide rsrc nodes + Jens Axboe
2021-04-04 19:22   ` Pavel Begunkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=502a84ebf41ff119b095e59661e678eacb752bf8.1617287883.git.asml.silence@gmail.com \
    --to=asml.silence@gmail.com \
    --cc=axboe@kernel.dk \
    --cc=io-uring@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.