[packages/kernel] - make xfs memory reclaim configurable; https://github.com/bobrik/linux/pull/2. No behaviour change

arekm arekm at pld-linux.org
Sun Dec 30 05:38:19 CET 2018


commit 9a2797cc361cd624ab092ff0b7569e88596b1160
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Sun Dec 30 05:37:54 2018 +0100

    - make xfs memory reclaim configurable; https://github.com/bobrik/linux/pull/2. No behaviour change by default.

 kernel.spec            |   2 +
 xfs-reclaim-hack.patch | 164 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 166 insertions(+)
---
diff --git a/kernel.spec b/kernel.spec
index f8ca7ac4..cf42a28c 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -214,6 +214,7 @@ Patch500:	kernel-rt.patch
 Patch2000:	kernel-small_fixes.patch
 Patch2001:	kernel-pwc-uncompress.patch
 Patch2003:	kernel-regressions.patch
+Patch2004:	xfs-reclaim-hack.patch
 
 # for rescuecd
 # based on ftp://ftp.leg.uct.ac.za/pub/linux/rip/tmpfs_root-2.6.30.diff.gz
@@ -685,6 +686,7 @@ rm -f localversion-rt
 %patch2000 -p1
 %patch2001 -p1
 #%patch2003 -p1
+%patch2004 -p1
 
 # Do not remove this, please!
 #%%patch50000 -p1
diff --git a/xfs-reclaim-hack.patch b/xfs-reclaim-hack.patch
new file mode 100644
index 00000000..05198cb1
--- /dev/null
+++ b/xfs-reclaim-hack.patch
@@ -0,0 +1,164 @@
+; https://github.com/bobrik/linux/pull/2
+From 1910e1157eb4b455b877a813f0a1b786dcbf799c Mon Sep 17 00:00:00 2001
+From: Ivan Babrou <ibobrik at gmail.com>
+Date: Tue, 27 Nov 2018 14:37:25 -0800
+Subject: [PATCH] xfs: add a sysctl to disable memory reclaim participation
+
+XFS may try to flush dirty inodes in reclaim and it slows things down
+considerably, especially in high page cache and slow disk environment.
+
+This sysctl allows to exclude XFS from kswapd and direct reclaim.
+
+See: https://marc.info/?t=154345187200003
+---
+ Documentation/filesystems/xfs.txt | 6 ++++++
+ fs/xfs/xfs_globals.c              | 1 +
+ fs/xfs/xfs_icache.c               | 6 +++++-
+ fs/xfs/xfs_icache.h               | 6 ++++++
+ fs/xfs/xfs_linux.h                | 1 +
+ fs/xfs/xfs_super.c                | 3 +++
+ fs/xfs/xfs_sysctl.c               | 9 +++++++++
+ fs/xfs/xfs_sysctl.h               | 2 ++
+ kernel/sysctl_binary.c            | 1 +
+ 9 files changed, 34 insertions(+), 1 deletion(-)
+
+diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt
+index 3b9b5c149f322..b33a4822f879c 100644
+--- a/Documentation/filesystems/xfs.txt
++++ b/Documentation/filesystems/xfs.txt
+@@ -331,6 +331,12 @@ The following sysctls are available for the XFS filesystem:
+ 	is to control the rate at which the allocator moves between
+ 	allocation groups when allocating extents for new files.
+ 
++  fs.xfs.memory_reclaim		(Min: 0  Default: 2  Max: 2)
++	Set memory reclaim strategy:
++	0: no inode reclaim (background reclaim is still enabled)
++	1: async inode reclaim of clean inodes only
++	2: sync inode reclaim (includes synchronous writes)
++
+ Deprecated Sysctls
+ ==================
+ 
+diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c
+index 3e1cc3001bcbf..2927cc2b12b57 100644
+--- a/fs/xfs/xfs_globals.c
++++ b/fs/xfs/xfs_globals.c
+@@ -43,6 +43,7 @@ xfs_param_t xfs_params = {
+ 	.fstrm_timer	= {	1,		30*100,		3600*100},
+ 	.eofb_timer	= {	1,		300,		3600*24},
+ 	.cowb_timer	= {	1,		1800,		3600*24},
++	.memory_reclaim	= {	0,		2,		2,	},
+ };
+ 
+ struct xfs_globals xfs_globals = {
+diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c
+index 544b5211221cd..54fcf1af7e3f5 100644
+--- a/fs/xfs/xfs_icache.c
++++ b/fs/xfs/xfs_icache.c
+@@ -1380,7 +1380,11 @@ xfs_reclaim_inodes_nr(
+ 	xfs_reclaim_work_queue(mp);
+ 	xfs_ail_push_all(mp->m_ail);
+ 
+-	return xfs_reclaim_inodes_ag(mp, SYNC_TRYLOCK | SYNC_WAIT, &nr_to_scan);
++	int flags = SYNC_TRYLOCK;
++	if (xfs_memory_reclaim == XFS_MEMORY_RECLAIM_SYNC)
++		flags |= SYNC_WAIT;
++
++	return xfs_reclaim_inodes_ag(mp, flags, &nr_to_scan);
+ }
+ 
+ /*
+diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h
+index bff4d85e54984..2547c0d85e5a1 100644
+--- a/fs/xfs/xfs_icache.h
++++ b/fs/xfs/xfs_icache.h
+@@ -54,6 +54,12 @@ struct xfs_eofblocks {
+  */
+ #define XFS_AGITER_INEW_WAIT	0x1	/* wait on new inodes */
+ 
++enum {
++	XFS_MEMORY_RECLAIM_NONE = 0,
++	XFS_MEMORY_RECLAIM_ASYNC,
++	XFS_MEMORY_RECLAIM_SYNC,
++};
++
+ int xfs_iget(struct xfs_mount *mp, struct xfs_trans *tp, xfs_ino_t ino,
+ 	     uint flags, uint lock_flags, xfs_inode_t **ipp);
+ 
+diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h
+index dcd1292664b34..3cddbffaa8cb4 100644
+--- a/fs/xfs/xfs_linux.h
++++ b/fs/xfs/xfs_linux.h
+@@ -110,6 +110,7 @@ typedef __u32			xfs_nlink_t;
+ #define xfs_fstrm_centisecs	xfs_params.fstrm_timer.val
+ #define xfs_eofb_secs		xfs_params.eofb_timer.val
+ #define xfs_cowb_secs		xfs_params.cowb_timer.val
++#define xfs_memory_reclaim	xfs_params.memory_reclaim.val
+ 
+ #define current_cpu()		(raw_smp_processor_id())
+ #define current_pid()		(current->pid)
+diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
+index 0b0282d2f011c..232e3706a0a60 100644
+--- a/fs/xfs/xfs_super.c
++++ b/fs/xfs/xfs_super.c
+@@ -1828,6 +1828,8 @@ xfs_fs_nr_cached_objects(
+ 	/* Paranoia: catch incorrect calls during mount setup or teardown */
+ 	if (WARN_ON_ONCE(!sb->s_fs_info))
+ 		return 0;
++	if (xfs_memory_reclaim == XFS_MEMORY_RECLAIM_NONE)
++		return 0;
+ 	return xfs_reclaim_inodes_count(XFS_M(sb));
+ }
+ 
+diff --git a/fs/xfs/xfs_sysctl.c b/fs/xfs/xfs_sysctl.c
+index afe1f66aaa698..ccf0d1759c215 100644
+--- a/fs/xfs/xfs_sysctl.c
++++ b/fs/xfs/xfs_sysctl.c
+@@ -193,6 +193,15 @@ static struct ctl_table xfs_table[] = {
+ 		.extra1		= &xfs_params.cowb_timer.min,
+ 		.extra2		= &xfs_params.cowb_timer.max,
+ 	},
++	{
++		.procname	= "memory_reclaim",
++		.data		= &xfs_params.memory_reclaim.val,
++		.maxlen		= sizeof(int),
++		.mode		= 0644,
++		.proc_handler	= proc_dointvec_minmax,
++		.extra1		= &xfs_params.memory_reclaim.min,
++		.extra2		= &xfs_params.memory_reclaim.max,
++	},
+ 	/* please keep this the last entry */
+ #ifdef CONFIG_PROC_FS
+ 	{
+diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h
+index 82afee005140a..eaf3addd486e7 100644
+--- a/fs/xfs/xfs_sysctl.h
++++ b/fs/xfs/xfs_sysctl.h
+@@ -49,6 +49,7 @@ typedef struct xfs_param {
+ 	xfs_sysctl_val_t fstrm_timer;	/* Filestream dir-AG assoc'n timeout. */
+ 	xfs_sysctl_val_t eofb_timer;	/* Interval between eofb scan wakeups */
+ 	xfs_sysctl_val_t cowb_timer;	/* Interval between cowb scan wakeups */
++	xfs_sysctl_val_t memory_reclaim;/* Memory reclaim policy. */
+ } xfs_param_t;
+ 
+ /*
+@@ -89,6 +90,7 @@ enum {
+ 	XFS_ROTORSTEP = 20,
+ 	XFS_INHERIT_NODFRG = 21,
+ 	XFS_FILESTREAM_TIMER = 22,
++	XFS_MEMORY_RECLAIM = 23,
+ };
+ 
+ extern xfs_param_t	xfs_params;
+diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c
+index e8c0dab4fd653..ec2f2c52e3ab5 100644
+--- a/kernel/sysctl_binary.c
++++ b/kernel/sysctl_binary.c
+@@ -778,6 +778,7 @@ static const struct bin_table bin_fs_xfs_table[] = {
+ 	{ CTL_INT,	XFS_INHERIT_NODFRG,	"inherit_nodefrag" },
+ 	{ CTL_INT,	XFS_FILESTREAM_TIMER,	"filestream_centisecs" },
+ 	{ CTL_INT,	XFS_STATS_CLEAR,	"stats_clear" },
++	{ CTL_INT,	XFS_MEMORY_RECLAIM,	"memory_reclaim" },
+ 	{}
+ };
+ 
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/kernel.git/commitdiff/9a2797cc361cd624ab092ff0b7569e88596b1160



More information about the pld-cvs-commit mailing list