Messages in this thread Patch in this message | | | From | Eric Dumazet <> | Subject | [PATCH] fs : reorder some 'struct inode' fields to speedup i_size manipulations | Date | Thu, 23 Nov 2006 11:57:29 +0100 |
| |
On 32bits SMP platforms, 64bits i_size is protected by a seqcount (i_size_seqcount).
When i_size is read or written, i_size_seqcount is read/written as well, so it make sense to group these two fields together in the same cache line.
Before this patch, accessing i_size needed 3 cache lines (2 for i_size, one for i_size_seqcount). After, only one cache line is needed/ (dirtied on a i_size change).
This patch moves i_size_seqcount next to i_size, and also moves i_version to let offsetof(struct inode, i_size) being 0x40 instead of 0x3c (for 32bits platforms).
For 64 bits platforms, i_size_seqcount doesnt exist, and the move of a 'long i_version' should not introduce a new hole because of padding.
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> --- linux-2.6.19-rc6/include/linux/fs.h 2006-11-23 10:47:53.000000000 +0100 +++ linux-2.6.19-rc6-ed/include/linux/fs.h 2006-11-23 11:13:36.000000000 +0100 @@ -548,12 +548,15 @@ struct inode { uid_t i_uid; gid_t i_gid; dev_t i_rdev; + unsigned long i_version; loff_t i_size; +#ifdef __NEED_I_SIZE_ORDERED + seqcount_t i_size_seqcount; +#endif struct timespec i_atime; struct timespec i_mtime; struct timespec i_ctime; unsigned int i_blkbits; - unsigned long i_version; blkcnt_t i_blocks; unsigned short i_bytes; spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ @@ -598,9 +601,6 @@ struct inode { void *i_security; #endif void *i_private; /* fs or device private pointer */ -#ifdef __NEED_I_SIZE_ORDERED - seqcount_t i_size_seqcount; -#endif }; /* | |