Message ID | 20240808155429.1080545-1-mjguzik@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | vfs: only read fops once in fops_get/put | expand |
On Thu, 08 Aug 2024 17:54:28 +0200, Mateusz Guzik wrote: > The compiler emits 2 access in fops_get(), put is patched to maintain some > consistency. > > This makes do_dentry_open() go down from 1177 to 1154 bytes. > > This popped up due to false-sharing where loads from inode->i_fop end up > bouncing a cacheline on parallel open. While this is going to be fixed, > the spurious load does not need to be there. > > [...] Applied to the vfs.misc branch of the vfs/vfs.git tree. Patches in the vfs.misc branch should appear in linux-next soon. Please report any outstanding bugs that were missed during review in a new review to the original patch series allowing us to drop it. It's encouraged to provide Acked-bys and Reviewed-bys even though the patch has now been applied. If possible patch trailers will be updated. Note that commit hashes shown below are subject to change due to rebase, trailer updates or similar. If in doubt, please check the listed branch. tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git branch: vfs.misc [1/1] vfs: only read fops once in fops_get/put https://git.kernel.org/vfs/vfs/c/2a2dc5eb79c4
diff --git a/include/linux/fs.h b/include/linux/fs.h index ef5ada9d5e33..87d191798454 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2565,10 +2565,17 @@ struct super_block *sget(struct file_system_type *type, struct super_block *sget_dev(struct fs_context *fc, dev_t dev); /* Alas, no aliases. Too much hassle with bringing module.h everywhere */ -#define fops_get(fops) \ - (((fops) && try_module_get((fops)->owner) ? (fops) : NULL)) -#define fops_put(fops) \ - do { if (fops) module_put((fops)->owner); } while(0) +#define fops_get(fops) ({ \ + const struct file_operations *_fops = (fops); \ + (((_fops) && try_module_get((_fops)->owner) ? (_fops) : NULL)); \ +}) + +#define fops_put(fops) ({ \ + const struct file_operations *_fops = (fops); \ + if (_fops) \ + module_put((_fops)->owner); \ +}) + /* * This one is to be used *ONLY* from ->open() instances. * fops must be non-NULL, pinned down *and* module dependencies
The compiler emits 2 access in fops_get(), put is patched to maintain some consistency. This makes do_dentry_open() go down from 1177 to 1154 bytes. This popped up due to false-sharing where loads from inode->i_fop end up bouncing a cacheline on parallel open. While this is going to be fixed, the spurious load does not need to be there. No functional changes. Signed-off-by: Mateusz Guzik <mjguzik@gmail.com> --- include/linux/fs.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)