mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 05:24:39 +01:00
fs/file: optimize close_range() complexity from O(N) to O(Sparse)
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> Link: https://patch.msgid.link/20260123081221.659125-1-realwujing@gmail.com Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
6cbfdf8947
commit
fc94368bce
1 changed files with 8 additions and 2 deletions
10
fs/file.c
10
fs/file.c
|
|
@ -777,23 +777,29 @@ 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);
|
||||
n = last_fd(fdt);
|
||||
max_fd = min(max_fd, n);
|
||||
|
||||
for (; fd <= max_fd; fd++) {
|
||||
for (fd = find_next_bit(fdt->open_fds, max_fd + 1, fd);
|
||||
fd <= max_fd;
|
||||
fd = find_next_bit(fdt->open_fds, max_fd + 1, fd + 1)) {
|
||||
file = file_close_fd_locked(files, fd);
|
||||
if (file) {
|
||||
spin_unlock(&files->file_lock);
|
||||
filp_close(file, files);
|
||||
cond_resched();
|
||||
spin_lock(&files->file_lock);
|
||||
fdt = files_fdtable(files);
|
||||
} else if (need_resched()) {
|
||||
spin_unlock(&files->file_lock);
|
||||
cond_resched();
|
||||
spin_lock(&files->file_lock);
|
||||
fdt = files_fdtable(files);
|
||||
}
|
||||
}
|
||||
spin_unlock(&files->file_lock);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue