From: Anton Blanchard Most of the inode slabs are cacheline aligned. This can waste a fair amount of memory, especially on architectures with large cacheline sizes (eg 128 bytes). Alignment has a few advantages. It prevents 2 cpus from accessing 2 data structures in the same cacheline. Since struct inodes are well over a cacheline and there are so many of them, there is little chance we will hit this problem if we remove the alignment. Alignment also ensures the maximum amount of the data structure is in the same cacheline (instead of straddling 2 for example). The large size of struct inode reduces this advantage. With this patch the inode_cache slab goes from 640 bytes to 544 bytes, and the number that fits in a 4kB slab goes from 6 to 7 on ppc64. A number of other inode slabs also see improvements. Signed-off-by: Anton Blanchard Signed-off-by: Andrew Morton --- 25-akpm/fs/adfs/super.c | 2 +- 25-akpm/fs/affs/super.c | 2 +- 25-akpm/fs/befs/linuxvfs.c | 2 +- 25-akpm/fs/bfs/inode.c | 2 +- 25-akpm/fs/cifs/cifsfs.c | 2 +- 25-akpm/fs/coda/inode.c | 2 +- 25-akpm/fs/efs/super.c | 2 +- 25-akpm/fs/ext2/super.c | 2 +- 25-akpm/fs/ext3/super.c | 2 +- 25-akpm/fs/fat/inode.c | 2 +- 25-akpm/fs/hpfs/super.c | 2 +- 25-akpm/fs/inode.c | 3 +-- 25-akpm/fs/isofs/inode.c | 2 +- 25-akpm/fs/jffs2/super.c | 2 +- 25-akpm/fs/minix/inode.c | 2 +- 25-akpm/fs/ncpfs/inode.c | 2 +- 25-akpm/fs/nfs/inode.c | 2 +- 25-akpm/fs/ntfs/super.c | 2 +- 25-akpm/fs/proc/inode.c | 2 +- 25-akpm/fs/qnx4/inode.c | 2 +- 25-akpm/fs/reiserfs/super.c | 2 +- 25-akpm/fs/romfs/inode.c | 2 +- 25-akpm/fs/smbfs/inode.c | 2 +- 25-akpm/fs/sysv/inode.c | 2 +- 25-akpm/fs/udf/super.c | 2 +- 25-akpm/fs/ufs/super.c | 2 +- 25-akpm/fs/xfs/linux-2.6/xfs_super.c | 3 +-- 27 files changed, 27 insertions(+), 29 deletions(-) diff -puN fs/adfs/super.c~remove-cacheline-alignment-from-inode-slabs fs/adfs/super.c --- 25/fs/adfs/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.907289448 -0700 +++ 25-akpm/fs/adfs/super.c 2004-08-16 23:43:12.947283368 -0700 @@ -241,7 +241,7 @@ static int init_inodecache(void) { adfs_inode_cachep = kmem_cache_create("adfs_inode_cache", sizeof(struct adfs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (adfs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/affs/super.c~remove-cacheline-alignment-from-inode-slabs fs/affs/super.c --- 25/fs/affs/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.908289296 -0700 +++ 25-akpm/fs/affs/super.c 2004-08-16 23:43:12.948283216 -0700 @@ -115,7 +115,7 @@ static int init_inodecache(void) { affs_inode_cachep = kmem_cache_create("affs_inode_cache", sizeof(struct affs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (affs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/befs/linuxvfs.c~remove-cacheline-alignment-from-inode-slabs fs/befs/linuxvfs.c --- 25/fs/befs/linuxvfs.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.910288992 -0700 +++ 25-akpm/fs/befs/linuxvfs.c 2004-08-16 23:43:12.949283064 -0700 @@ -433,7 +433,7 @@ befs_init_inodecache(void) { befs_inode_cachep = kmem_cache_create("befs_inode_cache", sizeof (struct befs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (befs_inode_cachep == NULL) { printk(KERN_ERR "befs_init_inodecache: " diff -puN fs/bfs/inode.c~remove-cacheline-alignment-from-inode-slabs fs/bfs/inode.c --- 25/fs/bfs/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.911288840 -0700 +++ 25-akpm/fs/bfs/inode.c 2004-08-16 23:43:12.950282912 -0700 @@ -245,7 +245,7 @@ static int init_inodecache(void) { bfs_inode_cachep = kmem_cache_create("bfs_inode_cache", sizeof(struct bfs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (bfs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/cifs/cifsfs.c~remove-cacheline-alignment-from-inode-slabs fs/cifs/cifsfs.c --- 25/fs/cifs/cifsfs.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.912288688 -0700 +++ 25-akpm/fs/cifs/cifsfs.c 2004-08-16 23:43:12.950282912 -0700 @@ -561,7 +561,7 @@ cifs_init_inodecache(void) { cifs_inode_cachep = kmem_cache_create("cifs_inode_cache", sizeof (struct cifsInodeInfo), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, cifs_init_once, NULL); if (cifs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/coda/inode.c~remove-cacheline-alignment-from-inode-slabs fs/coda/inode.c --- 25/fs/coda/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.914288384 -0700 +++ 25-akpm/fs/coda/inode.c 2004-08-16 23:43:12.951282760 -0700 @@ -69,7 +69,7 @@ int coda_init_inodecache(void) { coda_inode_cachep = kmem_cache_create("coda_inode_cache", sizeof(struct coda_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (coda_inode_cachep == NULL) return -ENOMEM; diff -puN fs/efs/super.c~remove-cacheline-alignment-from-inode-slabs fs/efs/super.c --- 25/fs/efs/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.915288232 -0700 +++ 25-akpm/fs/efs/super.c 2004-08-16 23:43:12.951282760 -0700 @@ -58,7 +58,7 @@ static int init_inodecache(void) { efs_inode_cachep = kmem_cache_create("efs_inode_cache", sizeof(struct efs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (efs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/ext2/super.c~remove-cacheline-alignment-from-inode-slabs fs/ext2/super.c --- 25/fs/ext2/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.916288080 -0700 +++ 25-akpm/fs/ext2/super.c 2004-08-16 23:43:12.952282608 -0700 @@ -190,7 +190,7 @@ static int init_inodecache(void) { ext2_inode_cachep = kmem_cache_create("ext2_inode_cache", sizeof(struct ext2_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (ext2_inode_cachep == NULL) return -ENOMEM; diff -puN fs/ext3/super.c~remove-cacheline-alignment-from-inode-slabs fs/ext3/super.c --- 25/fs/ext3/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.918287776 -0700 +++ 25-akpm/fs/ext3/super.c 2004-08-16 23:43:12.954282304 -0700 @@ -477,7 +477,7 @@ static int init_inodecache(void) { ext3_inode_cachep = kmem_cache_create("ext3_inode_cache", sizeof(struct ext3_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (ext3_inode_cachep == NULL) return -ENOMEM; diff -puN fs/fat/inode.c~remove-cacheline-alignment-from-inode-slabs fs/fat/inode.c --- 25/fs/fat/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.920287472 -0700 +++ 25-akpm/fs/fat/inode.c 2004-08-16 23:43:12.955282152 -0700 @@ -744,7 +744,7 @@ int __init fat_init_inodecache(void) { fat_inode_cachep = kmem_cache_create("fat_inode_cache", sizeof(struct msdos_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (fat_inode_cachep == NULL) return -ENOMEM; diff -puN fs/hpfs/super.c~remove-cacheline-alignment-from-inode-slabs fs/hpfs/super.c --- 25/fs/hpfs/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.921287320 -0700 +++ 25-akpm/fs/hpfs/super.c 2004-08-16 23:43:12.956282000 -0700 @@ -191,7 +191,7 @@ static int init_inodecache(void) { hpfs_inode_cachep = kmem_cache_create("hpfs_inode_cache", sizeof(struct hpfs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (hpfs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/inode.c~remove-cacheline-alignment-from-inode-slabs fs/inode.c --- 25/fs/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.922287168 -0700 +++ 25-akpm/fs/inode.c 2004-08-16 23:43:12.957281848 -0700 @@ -1363,8 +1363,7 @@ void __init inode_init(unsigned long mem /* inode slab cache */ inode_cachep = kmem_cache_create("inode_cache", sizeof(struct inode), - 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, init_once, - NULL); + 0, SLAB_PANIC, init_once, NULL); set_shrinker(DEFAULT_SEEKS, shrink_icache_memory); } diff -puN fs/isofs/inode.c~remove-cacheline-alignment-from-inode-slabs fs/isofs/inode.c --- 25/fs/isofs/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.924286864 -0700 +++ 25-akpm/fs/isofs/inode.c 2004-08-16 23:43:12.958281696 -0700 @@ -108,7 +108,7 @@ static int init_inodecache(void) { isofs_inode_cachep = kmem_cache_create("isofs_inode_cache", sizeof(struct iso_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (isofs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/jffs2/super.c~remove-cacheline-alignment-from-inode-slabs fs/jffs2/super.c --- 25/fs/jffs2/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.925286712 -0700 +++ 25-akpm/fs/jffs2/super.c 2004-08-16 23:43:12.958281696 -0700 @@ -302,7 +302,7 @@ static int __init init_jffs2_fs(void) jffs2_inode_cachep = kmem_cache_create("jffs2_i", sizeof(struct jffs2_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, jffs2_i_init_once, NULL); if (!jffs2_inode_cachep) { printk(KERN_ERR "JFFS2 error: Failed to initialise inode cache\n"); diff -puN fs/minix/inode.c~remove-cacheline-alignment-from-inode-slabs fs/minix/inode.c --- 25/fs/minix/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.927286408 -0700 +++ 25-akpm/fs/minix/inode.c 2004-08-16 23:43:12.959281544 -0700 @@ -79,7 +79,7 @@ static int init_inodecache(void) { minix_inode_cachep = kmem_cache_create("minix_inode_cache", sizeof(struct minix_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (minix_inode_cachep == NULL) return -ENOMEM; diff -puN fs/ncpfs/inode.c~remove-cacheline-alignment-from-inode-slabs fs/ncpfs/inode.c --- 25/fs/ncpfs/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.928286256 -0700 +++ 25-akpm/fs/ncpfs/inode.c 2004-08-16 23:43:12.960281392 -0700 @@ -72,7 +72,7 @@ static int init_inodecache(void) { ncp_inode_cachep = kmem_cache_create("ncp_inode_cache", sizeof(struct ncp_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (ncp_inode_cachep == NULL) return -ENOMEM; diff -puN fs/nfs/inode.c~remove-cacheline-alignment-from-inode-slabs fs/nfs/inode.c --- 25/fs/nfs/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.929286104 -0700 +++ 25-akpm/fs/nfs/inode.c 2004-08-16 23:43:12.961281240 -0700 @@ -1779,7 +1779,7 @@ int nfs_init_inodecache(void) { nfs_inode_cachep = kmem_cache_create("nfs_inode_cache", sizeof(struct nfs_inode), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (nfs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/ntfs/super.c~remove-cacheline-alignment-from-inode-slabs fs/ntfs/super.c --- 25/fs/ntfs/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.931285800 -0700 +++ 25-akpm/fs/ntfs/super.c 2004-08-16 23:43:12.963280936 -0700 @@ -2551,7 +2551,7 @@ static int __init init_ntfs_fs(void) ntfs_inode_cache = kmem_cache_create(ntfs_inode_cache_name, sizeof(ntfs_inode), 0, - SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, NULL, NULL); + SLAB_RECLAIM_ACCOUNT, NULL, NULL); if (!ntfs_inode_cache) { printk(KERN_CRIT "NTFS: Failed to create %s!\n", ntfs_inode_cache_name); diff -puN fs/proc/inode.c~remove-cacheline-alignment-from-inode-slabs fs/proc/inode.c --- 25/fs/proc/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.932285648 -0700 +++ 25-akpm/fs/proc/inode.c 2004-08-16 23:43:12.964280784 -0700 @@ -120,7 +120,7 @@ int __init proc_init_inodecache(void) { proc_inode_cachep = kmem_cache_create("proc_inode_cache", sizeof(struct proc_inode), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (proc_inode_cachep == NULL) return -ENOMEM; diff -puN fs/qnx4/inode.c~remove-cacheline-alignment-from-inode-slabs fs/qnx4/inode.c --- 25/fs/qnx4/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.934285344 -0700 +++ 25-akpm/fs/qnx4/inode.c 2004-08-16 23:43:12.965280632 -0700 @@ -544,7 +544,7 @@ static int init_inodecache(void) { qnx4_inode_cachep = kmem_cache_create("qnx4_inode_cache", sizeof(struct qnx4_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (qnx4_inode_cachep == NULL) return -ENOMEM; diff -puN fs/reiserfs/super.c~remove-cacheline-alignment-from-inode-slabs fs/reiserfs/super.c --- 25/fs/reiserfs/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.935285192 -0700 +++ 25-akpm/fs/reiserfs/super.c 2004-08-16 23:43:12.966280480 -0700 @@ -444,7 +444,7 @@ static int init_inodecache(void) { reiserfs_inode_cachep = kmem_cache_create("reiser_inode_cache", sizeof(struct reiserfs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (reiserfs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/romfs/inode.c~remove-cacheline-alignment-from-inode-slabs fs/romfs/inode.c --- 25/fs/romfs/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.937284888 -0700 +++ 25-akpm/fs/romfs/inode.c 2004-08-16 23:43:12.967280328 -0700 @@ -579,7 +579,7 @@ static int init_inodecache(void) { romfs_inode_cachep = kmem_cache_create("romfs_inode_cache", sizeof(struct romfs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (romfs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/smbfs/inode.c~remove-cacheline-alignment-from-inode-slabs fs/smbfs/inode.c --- 25/fs/smbfs/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.938284736 -0700 +++ 25-akpm/fs/smbfs/inode.c 2004-08-16 23:43:12.967280328 -0700 @@ -80,7 +80,7 @@ static int init_inodecache(void) { smb_inode_cachep = kmem_cache_create("smb_inode_cache", sizeof(struct smb_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (smb_inode_cachep == NULL) return -ENOMEM; diff -puN fs/sysv/inode.c~remove-cacheline-alignment-from-inode-slabs fs/sysv/inode.c --- 25/fs/sysv/inode.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.939284584 -0700 +++ 25-akpm/fs/sysv/inode.c 2004-08-16 23:43:12.968280176 -0700 @@ -340,7 +340,7 @@ int __init sysv_init_icache(void) { sysv_inode_cachep = kmem_cache_create("sysv_inode_cache", sizeof(struct sysv_inode_info), 0, - SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (!sysv_inode_cachep) return -ENOMEM; diff -puN fs/udf/super.c~remove-cacheline-alignment-from-inode-slabs fs/udf/super.c --- 25/fs/udf/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.941284280 -0700 +++ 25-akpm/fs/udf/super.c 2004-08-16 23:43:12.969280024 -0700 @@ -145,7 +145,7 @@ static int init_inodecache(void) { udf_inode_cachep = kmem_cache_create("udf_inode_cache", sizeof(struct udf_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (udf_inode_cachep == NULL) return -ENOMEM; diff -puN fs/ufs/super.c~remove-cacheline-alignment-from-inode-slabs fs/ufs/super.c --- 25/fs/ufs/super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.942284128 -0700 +++ 25-akpm/fs/ufs/super.c 2004-08-16 23:43:12.970279872 -0700 @@ -1183,7 +1183,7 @@ static int init_inodecache(void) { ufs_inode_cachep = kmem_cache_create("ufs_inode_cache", sizeof(struct ufs_inode_info), - 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (ufs_inode_cachep == NULL) return -ENOMEM; diff -puN fs/xfs/linux-2.6/xfs_super.c~remove-cacheline-alignment-from-inode-slabs fs/xfs/linux-2.6/xfs_super.c --- 25/fs/xfs/linux-2.6/xfs_super.c~remove-cacheline-alignment-from-inode-slabs 2004-08-16 23:43:12.944283824 -0700 +++ 25-akpm/fs/xfs/linux-2.6/xfs_super.c 2004-08-16 23:43:12.971279720 -0700 @@ -334,8 +334,7 @@ STATIC int init_inodecache( void ) { linvfs_inode_zone = kmem_cache_create("linvfs_icache", - sizeof(vnode_t), 0, - SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, + sizeof(vnode_t), 0, SLAB_RECLAIM_ACCOUNT, init_once, NULL); if (linvfs_inode_zone == NULL) _