• Linus Torvalds's avatar
    fget: clarify and improve __fget_files() implementation · e386dfc5
    Linus Torvalds authored
    Commit 054aa8d4 ("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: default avatarkernel test robot <oliver.sang@intel.com>
    Tested-by: default avatarCarel Si <beibei.si@intel.com>
    Cc: Jann Horn <jannh@google.com>
    Cc: Miklos Szeredi <mszeredi@redhat.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    e386dfc5
file.c 31 KB