diff mbox series

vfs: only read fops once in fops_get/put

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

Commit Message

Mateusz Guzik Aug. 8, 2024, 3:54 p.m. UTC
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(-)

Comments

Christian Brauner Aug. 9, 2024, 8:30 a.m. UTC | #1
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 mbox series

Patch

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