From: Al Viro <viro@zeniv.linux.org.uk>
To: Qiliang Yuan <realwujing@gmail.com>
Cc: brauner@kernel.org, jack@suse.cz, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, yuanql9@chinatelecom.cn
Subject: Re: [PATCH] fs/file: optimize close_range() complexity from O(N) to O(Sparse)
Date: Thu, 22 Jan 2026 17:14:08 +0000 [thread overview]
Message-ID: <20260122171408.GF3183987@ZenIV> (raw)
In-Reply-To: <20260122163553.147673-1-realwujing@gmail.com>
On Thu, Jan 22, 2026 at 11:35:53AM -0500, Qiliang Yuan wrote:
> In close_range(), the kernel traditionally performs a linear scan over the
> [fd, max_fd] range, resulting in O(N) complexity where N is the range size.
> For processes with sparse FD tables, this is inefficient as it checks many
> unallocated slots.
>
> This patch optimizes __range_close() by using find_next_bit() on the
> open_fds bitmap to skip holes. This shifts the algorithmic complexity from
> O(Range Size) to O(Active FDs), providing a significant performance boost
> for large-range close operations on sparse file descriptor tables.
>
> Signed-off-by: Qiliang Yuan <realwujing@gmail.com>
> Signed-off-by: Qiliang Yuan <yuanql9@chinatelecom.cn>
> ---
> fs/file.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/fs/file.c b/fs/file.c
> index 0a4f3bdb2dec..c7c3ee03f8df 100644
> --- a/fs/file.c
> +++ b/fs/file.c
> @@ -777,13 +777,17 @@ static inline void __range_close(struct files_struct *files, unsigned int fd,
> unsigned int max_fd)
> {
> struct file *file;
> + struct fdtable *fdt;
> unsigned n;
>
> spin_lock(&files->file_lock);
> - n = last_fd(files_fdtable(files));
> + fdt = files_fdtable(files);
Careful - that thing might be expanded and reallocated once you drop
->file_lock (i.e. every time you close anything). IOW, every time
you regain the lock, you need to recalculate fdt.
Other than that, looks sane.
next prev parent reply other threads:[~2026-01-22 17:12 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-22 16:35 [PATCH] fs/file: optimize close_range() complexity from O(N) to O(Sparse) Qiliang Yuan
2026-01-22 17:14 ` Al Viro [this message]
2026-01-23 8:12 ` [PATCH v2] " Qiliang Yuan
2026-01-23 11:23 ` Jan Kara
2026-01-23 14:38 ` Christian Brauner
2026-01-27 3:03 ` Qiliang Yuan
2026-02-18 1:34 ` Eric Biggers
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=20260122171408.GF3183987@ZenIV \
--to=viro@zeniv.linux.org.uk \
--cc=brauner@kernel.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=realwujing@gmail.com \
--cc=yuanql9@chinatelecom.cn \
/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.