vfs: only read fops once in fops_get/put
authorMateusz Guzik <mjguzik@gmail.com>
Sat, 10 Aug 2024 06:47:53 +0000 (08:47 +0200)
committerChristian Brauner <brauner@kernel.org>
Fri, 30 Aug 2024 06:22:36 +0000 (08:22 +0200)
commit8447d848e1dc6d42d1dcd00f133d7715fc732c47
treece84df5664c493a20b444ab48b694d076a1d61fc
parent193b72792fdba54aa2af6c3ad72ce16c3f06b4f7
vfs: only read fops once in fops_get/put

In do_dentry_open() the usage is:
f->f_op = fops_get(inode->i_fop);

In generated asm the compiler emits 2 reads from inode->i_fop instead of
just one.

This popped up due to false-sharing where loads from that offset end up
bouncing a cacheline during parallel open. While this is going to be fixed,
the spurious load does not need to be there.

This makes do_dentry_open() go down from 1177 to 1154 bytes.

fops_put() is patched to maintain some consistency.

No functional changes.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Mateusz Guzik <mjguzik@gmail.com>
Link: https://lore.kernel.org/r/20240810064753.1211441-1-mjguzik@gmail.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
include/linux/fs.h