Skip to content

Commit 2d06b29

Browse files
author
Ian Kent
committed
fs/file.c: add fast path in find_next_fd()
JIRA: https://issues.redhat.com/browse/RHEL-38569 Upstream status: Linus commit 0c40bf4 Author: Yu Ma <yu.ma@intel.com> Date: Wed Jul 17 10:50:18 2024 -0400 fs/file.c: add fast path in find_next_fd() Skip 2-levels searching via find_next_zero_bit() when there is free slot in the word contains next_fd, as: (1) next_fd indicates the lower bound for the first free fd. (2) There is fast path inside of find_next_zero_bit() when size<=64 to speed up searching. (3) After fdt is expanded (the bitmap size doubled for each time of expansion), it would never be shrunk. The search size increases but there are few open fds available here. This fast path is proposed by Mateusz Guzik <mjguzik@gmail.com>, and agreed by Jan Kara <jack@suse.cz>, which is more generic and scalable than previous versions. And on top of patch 1 and 2, it improves pts/blogbench-1.1.0 read by 8% and write by 4% on Intel ICX 160 cores configuration with v6.10-rc7. Reviewed-by: Jan Kara <jack@suse.cz> Reviewed-by: Tim Chen <tim.c.chen@linux.intel.com> Signed-off-by: Yu Ma <yu.ma@intel.com> Link: https://lore.kernel.org/r/20240717145018.3972922-4-yu.ma@intel.com Signed-off-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Ian Kent <ikent@redhat.com>
1 parent 200e86a commit 2d06b29

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

fs/file.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,15 @@ static unsigned int find_next_fd(struct fdtable *fdt, unsigned int start)
535535
unsigned int maxfd = fdt->max_fds; /* always multiple of BITS_PER_LONG */
536536
unsigned int maxbit = maxfd / BITS_PER_LONG;
537537
unsigned int bitbit = start / BITS_PER_LONG;
538+
unsigned int bit;
539+
540+
/*
541+
* Try to avoid looking at the second level bitmap
542+
*/
543+
bit = find_next_zero_bit(&fdt->open_fds[bitbit], BITS_PER_LONG,
544+
start & (BITS_PER_LONG - 1));
545+
if (bit < BITS_PER_LONG)
546+
return bit + bitbit * BITS_PER_LONG;
538547

539548
bitbit = find_next_zero_bit(fdt->full_fds_bits, maxbit, bitbit) * BITS_PER_LONG;
540549
if (bitbit >= maxfd)

0 commit comments

Comments
 (0)