Re: [PATCH RFC DRAFT DOESNOTBUILD] inode: free up more space

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jul 15, 2025 at 05:09:03PM +0100, Matthew Wilcox wrote:
> On Tue, Jul 15, 2025 at 04:35:24PM +0200, Christian Brauner wrote:
> > struct inode is bloated as everyone is aware and we should try and
> > shrink it as that's potentially a lot of memory savings. I've already
> > freed up around 8 bytes but we can probably do better.
> 
> OK, but let's make sure we're actually achieving memory savings.
> First, inodes are allocated from slabs.  If we reduce a struct from,
> say, 596 to 592 bytes, we'll still get 27 of them in a 16KiB page
> (although we'd get 110 instead of 109 in a 64KiB page!) so we need
> to be crossing some important boundaries to actually make a difference.
> 
> For block/network filesystems, those slabs are fs-private with
> struct inode embedded into struct fs_inode.  eg:
> 
> xfs_inode         584600 593856   1024   32    8 : tunables    0    0    0 : slabdata  18558  18558      0
> ext4_inode_cache     756    756   1168   28    8 : tunables    0    0    0 : slabdata     27     27      0
> proc_inode_cache   18316  19136    704   46    8 : tunables    0    0    0 : slabdata    416    416      0
> inode_cache         8059   9325    632   25    4 : tunables    0    0    0 : slabdata    373    373      0
> 
> That's on a machine running 6.12 and pahole tells me struct inode is
> currently 624 bytes, so yes, you've saved 8 bytes (Debian config).
> And we've gone from 25 objects per 16KiB to 26, so yay!  Getting to 27
> will be harder, we have to get to 604 bytes.  Although for my system if
> we could get xfs_inode down from 1024 bytes to 992, that'd save me much
> more memory ;-)
> 
> We could get rid of i_io_list by using an allocating xarray to store the
> inodes in each backing_dev.  There's 16 bytes (would probably need to
> retain a 4 byte ID to allow for efficient deletion from the xarray,
> and there are multiple lists it might be on, so perhaps 3 bits to
> determine which list it's on).
> 
> That might work for i_sb_list, i_sb_list and i_lru too.  That could get
> us 48 bytes.
> 
> We can also win in inode by shrinking address_space.  nr_thps is
> one I want to kill.  That'll get us 8 bytes back as soon as btrfs
> lets us drop CONFIG_READ_ONLY_THP_FOR_FS.
> 
> The i_private_* members in i_data can probably also go.  Mostly they're
> used for buffer_heads.  So more conversion to iomap will help with that.
> 
> 
> I wonder if we can shift from having i_data embedded in struct inode
> to embedding it in struct foofs_inode.  Then procfs and other pseudo
> filesystems wouldn't allocate 192 bytes worth of data ...

If you/or someone manages to do that work before LSFMM in May 2026 I'll
bring the author a VFS T-Shirt with "I shrunk struct inode by $n bytes."
LSFMM 2026 edition.




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [NTFS 3]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [NTFS 3]     [Samba]     [Device Mapper]     [CEPH Development]

  Powered by Linux