Ver código fonte

vfs: move inode stat information closer together

The comment above it says "Stat data, not accessed from path walking",
but in fact some of inode fields we use for the common stat data was way
down at the end of the inode, causing unnecessary cache misses for the
common stat operations.

The inode structure is pretty big, and this can change padding depending
on field width, but at least on the common 64-bit configurations this
doesn't change the size.  Some of our inode layout has historically been
to tro to avoid unnecessary padding fields, but cache locality is at
least as important for layout, if not more.

Noticed by looking at kernel profiles, and noticing that the "i_blkbits"
access stood out like a sore thumb.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Linus Torvalds 13 anos atrás
pai
commit
2f9d3df8aa
1 arquivos alterados com 3 adições e 3 exclusões
  1. 3 3
      include/linux/fs.h

+ 3 - 3
include/linux/fs.h

@@ -802,13 +802,14 @@ struct inode {
 		unsigned int __i_nlink;
 		unsigned int __i_nlink;
 	};
 	};
 	dev_t			i_rdev;
 	dev_t			i_rdev;
+	loff_t			i_size;
 	struct timespec		i_atime;
 	struct timespec		i_atime;
 	struct timespec		i_mtime;
 	struct timespec		i_mtime;
 	struct timespec		i_ctime;
 	struct timespec		i_ctime;
 	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */
 	spinlock_t		i_lock;	/* i_blocks, i_bytes, maybe i_size */
 	unsigned short          i_bytes;
 	unsigned short          i_bytes;
+	unsigned int		i_blkbits;
 	blkcnt_t		i_blocks;
 	blkcnt_t		i_blocks;
-	loff_t			i_size;
 
 
 #ifdef __NEED_I_SIZE_ORDERED
 #ifdef __NEED_I_SIZE_ORDERED
 	seqcount_t		i_size_seqcount;
 	seqcount_t		i_size_seqcount;
@@ -828,9 +829,8 @@ struct inode {
 		struct list_head	i_dentry;
 		struct list_head	i_dentry;
 		struct rcu_head		i_rcu;
 		struct rcu_head		i_rcu;
 	};
 	};
-	atomic_t		i_count;
-	unsigned int		i_blkbits;
 	u64			i_version;
 	u64			i_version;
+	atomic_t		i_count;
 	atomic_t		i_dio_count;
 	atomic_t		i_dio_count;
 	atomic_t		i_writecount;
 	atomic_t		i_writecount;
 	const struct file_operations	*i_fop;	/* former ->i_op->default_file_ops */
 	const struct file_operations	*i_fop;	/* former ->i_op->default_file_ops */