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@xxxxxxxxx> --- include/linux/fs.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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 -- 2.43.0