shmem: shrink shmem_inode_info: dir_offsets in a union
authorHugh Dickins <hughd@google.com>
Sat, 30 Sep 2023 03:25:38 +0000 (20:25 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 18 Oct 2023 21:34:13 +0000 (14:34 -0700)
Patch series "shmem,tmpfs: general maintenance".

Mostly just cosmetic mods in mm/shmem.c, but the last two enforcing the
"size=" limit better.  8/8 goes into percpu counter territory, and could
stand alone.

This patch (of 8):

Shave 32 bytes off (the 64-bit) shmem_inode_info.  There was a 4-byte
pahole after stop_eviction, better filled by fsflags.  And the 24-byte
dir_offsets can only be used by directories, whereas shrinklist and
swaplist only by shmem_mapping() inodes (regular files or long symlinks):
so put those into a union.  No change in mm/shmem.c is required for this.

Link: https://lkml.kernel.org/r/c7441dc6-f3bb-dd60-c670-9f5cbd9f266@google.com
Link: https://lkml.kernel.org/r/86ebb4b-c571-b9e8-27f5-cb82ec50357e@google.com
Signed-off-by: Hugh Dickins <hughd@google.com>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Carlos Maiolino <cem@kernel.org>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Darrick J. Wong <djwong@kernel.org>
Cc: Dave Chinner <dchinner@redhat.com>
Cc: Tim Chen <tim.c.chen@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/shmem_fs.h

index 6b0c626..2caa6b8 100644 (file)
@@ -23,18 +23,22 @@ struct shmem_inode_info {
        unsigned long           flags;
        unsigned long           alloced;        /* data pages alloced to file */
        unsigned long           swapped;        /* subtotal assigned to swap */
-       pgoff_t                 fallocend;      /* highest fallocate endindex */
-       struct list_head        shrinklist;     /* shrinkable hpage inodes */
-       struct list_head        swaplist;       /* chain of maybes on swap */
+       union {
+           struct offset_ctx   dir_offsets;    /* stable directory offsets */
+           struct {
+               struct list_head shrinklist;    /* shrinkable hpage inodes */
+               struct list_head swaplist;      /* chain of maybes on swap */
+           };
+       };
+       struct timespec64       i_crtime;       /* file creation time */
        struct shared_policy    policy;         /* NUMA memory alloc policy */
        struct simple_xattrs    xattrs;         /* list of xattrs */
+       pgoff_t                 fallocend;      /* highest fallocate endindex */
+       unsigned int            fsflags;        /* for FS_IOC_[SG]ETFLAGS */
        atomic_t                stop_eviction;  /* hold when working on inode */
-       struct timespec64       i_crtime;       /* file creation time */
-       unsigned int            fsflags;        /* flags for FS_IOC_[SG]ETFLAGS */
 #ifdef CONFIG_TMPFS_QUOTA
        struct dquot            *i_dquot[MAXQUOTAS];
 #endif
-       struct offset_ctx       dir_offsets;    /* stable entry offsets */
        struct inode            vfs_inode;
 };