ext4: avoid fetching btime in ext4_getattr() unless requested
authorTheodore Ts'o <tytso@mit.edu>
Fri, 29 Nov 2019 03:26:51 +0000 (22:26 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 17 Jan 2020 21:24:25 +0000 (16:24 -0500)
Linus observed that an allmodconfig build which does a lot of stat(2)
calls that ext4_getattr() was a noticeable (1%) amount of CPU time,
due to the cache line for i_extra_isize getting pulled in.  Since the
normal stat system call doesn't return btime, it's a complete waste.
So only calculate btime when it is explicitly requested.

[ Fixed to check against request_mask instead of query_flags. ]

Link: https://lore.kernel.org/r/CAHk-=wivmk_j6KbTX+Er64mLrG8abXZo0M10PNdAnHc8fWXfsQ@mail.gmail.com
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/inode.c

index d035aca..9100460 100644 (file)
@@ -5399,7 +5399,8 @@ int ext4_getattr(const struct path *path, struct kstat *stat,
        struct ext4_inode_info *ei = EXT4_I(inode);
        unsigned int flags;
 
-       if (EXT4_FITS_IN_INODE(raw_inode, ei, i_crtime)) {
+       if ((request_mask & STATX_BTIME) &&
+           EXT4_FITS_IN_INODE(raw_inode, ei, i_crtime)) {
                stat->result_mask |= STATX_BTIME;
                stat->btime.tv_sec = ei->i_crtime.tv_sec;
                stat->btime.tv_nsec = ei->i_crtime.tv_nsec;