Patch "fs.h: Optimize file struct to prevent false sharing" has been added to the 6.4-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    fs.h: Optimize file struct to prevent false sharing

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     fs.h-optimize-file-struct-to-prevent-false-sharing.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 801648d70e53a74d9aeec704a2f4d3faca493022
Author: chenzhiyin <zhiyin.chen@xxxxxxxxx>
Date:   Thu Jun 1 05:24:00 2023 -0400

    fs.h: Optimize file struct to prevent false sharing
    
    [ Upstream commit a7bc2e8ddf3c8e1f5bfeb401f7ee112956cea259 ]
    
    In the syscall test of UnixBench, performance regression occurred due
    to false sharing.
    
    The lock and atomic members, including file::f_lock, file::f_count and
    file::f_pos_lock are highly contended and frequently updated in the
    high-concurrency test scenarios. perf c2c indentified one affected
    read access, file::f_op.
    To prevent false sharing, the layout of file struct is changed as
    following
    (A) f_lock, f_count and f_pos_lock are put together to share the same
    cache line.
    (B) The read mostly members, including f_path, f_inode, f_op are put
    into a separate cache line.
    (C) f_mode is put together with f_count, since they are used frequently
     at the same time.
    Due to '__randomize_layout' attribute of file struct, the updated layout
    only can be effective when CONFIG_RANDSTRUCT_NONE is 'y'.
    
    The optimization has been validated in the syscall test of UnixBench.
    performance gain is 30~50%. Furthermore, to confirm the optimization
    effectiveness on the other codes path, the results of fsdisk, fsbuffer
    and fstime are also shown.
    
    Here are the detailed test results of unixbench.
    
    Command: numactl -C 3-18 ./Run -c 16 syscall fsbuffer fstime fsdisk
    
    Without Patch
    ------------------------------------------------------------------------
    File Copy 1024 bufsize 2000 maxblocks   875052.1 KBps  (30.0 s, 2 samples)
    File Copy 256 bufsize 500 maxblocks     235484.0 KBps  (30.0 s, 2 samples)
    File Copy 4096 bufsize 8000 maxblocks  2815153.5 KBps  (30.0 s, 2 samples)
    System Call Overhead                   5772268.3 lps   (10.0 s, 7 samples)
    
    System Benchmarks Partial Index         BASELINE       RESULT    INDEX
    File Copy 1024 bufsize 2000 maxblocks     3960.0     875052.1   2209.7
    File Copy 256 bufsize 500 maxblocks       1655.0     235484.0   1422.9
    File Copy 4096 bufsize 8000 maxblocks     5800.0    2815153.5   4853.7
    System Call Overhead                     15000.0    5772268.3   3848.2
                                                                  ========
    System Benchmarks Index Score (Partial Only)                    2768.3
    
    With Patch
    ------------------------------------------------------------------------
    File Copy 1024 bufsize 2000 maxblocks  1009977.2 KBps  (30.0 s, 2 samples)
    File Copy 256 bufsize 500 maxblocks     264765.9 KBps  (30.0 s, 2 samples)
    File Copy 4096 bufsize 8000 maxblocks  3052236.0 KBps  (30.0 s, 2 samples)
    System Call Overhead                   8237404.4 lps   (10.0 s, 7 samples)
    
    System Benchmarks Partial Index         BASELINE       RESULT    INDEX
    File Copy 1024 bufsize 2000 maxblocks     3960.0    1009977.2   2550.4
    File Copy 256 bufsize 500 maxblocks       1655.0     264765.9   1599.8
    File Copy 4096 bufsize 8000 maxblocks     5800.0    3052236.0   5262.5
    System Call Overhead                     15000.0    8237404.4   5491.6
                                                                  ========
    System Benchmarks Index Score (Partial Only)                    3295.3
    
    Signed-off-by: chenzhiyin <zhiyin.chen@xxxxxxxxx>
    Message-Id: <20230601092400.27162-1-zhiyin.chen@xxxxxxxxx>
    Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/linux/fs.h b/include/linux/fs.h
index 133f0640fb241..6f96f99ab9511 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -956,29 +956,35 @@ static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index)
 		index <  ra->start + ra->size);
 }
 
+/*
+ * f_{lock,count,pos_lock} members can be highly contended and share
+ * the same cacheline. f_{lock,mode} are very frequently used together
+ * and so share the same cacheline as well. The read-mostly
+ * f_{path,inode,op} are kept on a separate cacheline.
+ */
 struct file {
 	union {
 		struct llist_node	f_llist;
 		struct rcu_head 	f_rcuhead;
 		unsigned int 		f_iocb_flags;
 	};
-	struct path		f_path;
-	struct inode		*f_inode;	/* cached value */
-	const struct file_operations	*f_op;
 
 	/*
 	 * Protects f_ep, f_flags.
 	 * Must not be taken from IRQ context.
 	 */
 	spinlock_t		f_lock;
-	atomic_long_t		f_count;
-	unsigned int 		f_flags;
 	fmode_t			f_mode;
+	atomic_long_t		f_count;
 	struct mutex		f_pos_lock;
 	loff_t			f_pos;
+	unsigned int		f_flags;
 	struct fown_struct	f_owner;
 	const struct cred	*f_cred;
 	struct file_ra_state	f_ra;
+	struct path		f_path;
+	struct inode		*f_inode;	/* cached value */
+	const struct file_operations	*f_op;
 
 	u64			f_version;
 #ifdef CONFIG_SECURITY



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux