]> git.baikalelectronics.ru Git - kernel.git/commit
fget: clarify and improve __fget_files() implementation
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 10 Dec 2021 22:00:15 +0000 (14:00 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 Dec 2021 18:55:30 +0000 (10:55 -0800)
commitf5ea3b818af0ca1fec6b7da6e22fac6d8001e7a6
tree108d8eff7a9260944f2722a3d6cfa6d4171f8b32
parentc218e0b6cbbdf0307713783ed79056cea7414e80
fget: clarify and improve __fget_files() implementation

Commit a7957d1bcf6a ("fget: check that the fd still exists after getting
a ref to it") fixed a race with getting a reference to a file just as it
was being closed.  It was a fairly minimal patch, and I didn't think
re-checking the file pointer lookup would be a measurable overhead,
since it was all right there and cached.

But I was wrong, as pointed out by the kernel test robot.

The 'poll2' case of the will-it-scale.per_thread_ops benchmark regressed
quite noticeably.  Admittedly it seems to be a very artificial test:
doing "poll()" system calls on regular files in a very tight loop in
multiple threads.

That means that basically all the time is spent just looking up file
descriptors without ever doing anything useful with them (not that doing
'poll()' on a regular file is useful to begin with).  And as a result it
shows the extra "re-check fd" cost as a sore thumb.

Happily, the regression is fixable by just writing the code to loook up
the fd to be better and clearer.  There's still a cost to verify the
file pointer, but now it's basically in the noise even for that
benchmark that does nothing else - and the code is more understandable
and has better comments too.

[ Side note: this patch is also a classic case of one that looks very
  messy with the default greedy Myers diff - it's much more legible with
  either the patience of histogram diff algorithm ]

Link: https://lore.kernel.org/lkml/20211210053743.GA36420@xsang-OptiPlex-9020/
Link: https://lore.kernel.org/lkml/20211213083154.GA20853@linux.intel.com/
Reported-by: kernel test robot <oliver.sang@intel.com>
Tested-by: Carel Si <beibei.si@intel.com>
Cc: Jann Horn <jannh@google.com>
Cc: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/file.c