On Tue, Feb 15, 2022 at 02:51:07PM +0800, Baokun Li wrote: > From: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > > commit e386dfc56f837da66d00a078e5314bc8382fab83 upstream. > > Commit 054aa8d439b9 ("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@xxxxxxxxxxxxxxx/ > Reported-by: kernel test robot <oliver.sang@xxxxxxxxx> > Tested-by: Carel Si <beibei.si@xxxxxxxxx> > Cc: Jann Horn <jannh@xxxxxxxxxx> > Cc: Miklos Szeredi <mszeredi@xxxxxxxxxx> > Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > Signed-off-by: Baokun Li <libaokun1@xxxxxxxxxx> > --- > fs/file.c | 72 ++++++++++++++++++++++++++++++++++++++++++------------- > 1 file changed, 56 insertions(+), 16 deletions(-) Now queued up, thanks. Any chance you can do this for 5.4 and older kernels too? greg k-h