lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240112073524.80724-1-libang.li@antgroup.com>
Date: Fri, 12 Jan 2024 15:35:24 +0800
From: "Bang Li" <libang.li@...group.com>
To: akpm@...ux-foundation.org
Cc:  <linux-mm@...ck.org>,
   <linux-kernel@...r.kernel.org>,
  "朱辉(茶水)" <teawater@...group.com>,
  "Yan Yan(cailing)" <yanyan.yan@...group.com>,
  "Bang Li" <libang.li@...group.com>
Subject: [PATCH] mm/compaction: Reduce unnecessary loops

Compaction will be triggered when we write 1 to '/proc/sys/vm/
compact_memory'. During the execution of the process, when we send
SIGKILL to terminate the compaction, the process does not exit
immediately. Instead, it will continue to loop through the remaining
zones and nodes before exiting.

in my environment:

[root]# cat /proc/buddyinfo
Node 0, zone      DMA      1      1      1      0      2      1      1      0      1      1      3
Node 0, zone    DMA32   1666   1123    804    625    488    356    321    278    209    178    250
Node 0, zone   Normal  58852  83160  49983   9812   2287   1229  19604  24471  10346   5219  12205
[root]# echo 1 > /sys/kernel/debug/tracing/events/compaction/mm_compaction_end/enable

before the patch:

[root]# timeout --signal=SIGKILL 0.002 bash -c 'echo 1 > /proc/sys/vm/compact_memory'
[root]# cat /sys/kernel/debug/tracing/trace_pipe
           <...>-26494   [014] .....   226.468993: mm_compaction_end: zone_start=0x1 migrate_pfn=0xe00 free_pfn=0xe00 zone_end=0x1000, mode=sync status=complete
           <...>-26494   [014] .....   226.469718: mm_compaction_end: zone_start=0x1000 migrate_pfn=0x20a80 free_pfn=0xffe00 zone_end=0x100000, mode=sync status=contended
           <...>-26494   [014] .....   226.469720: mm_compaction_end: zone_start=0x100000 migrate_pfn=0x100000 free_pfn=0x307fe00 zone_end=0x3080000, mode=sync status=contended

after the patch:

[root]# timeout --signal=SIGKILL 0.002 bash -c 'echo 1 > /proc/sys/vm/compact_memory'
[root]# cat /sys/kernel/debug/tracing/trace_pipe
           <...>-17491   [053] .....   109.005387: mm_compaction_end: zone_start=0x1 migrate_pfn=0xe00 free_pfn=0xe00 zone_end=0x1000, mode=sync status=complete
           <...>-17491   [053] .....   109.006139: mm_compaction_end: zone_start=0x1000 migrate_pfn=0x22220 free_pfn=0xffe00 zone_end=0x100000, mode=sync status=contended

Although it exits quickly after receiving the SIGKILL signal, a better
solution is to terminate the loop early after receiving the SIGKILL
signal.

Signed-off-by: Bang Li <libang.li@...group.com>
---
 mm/compaction.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/mm/compaction.c b/mm/compaction.c
index 27ada42924d5..16f2bde5205d 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -2807,7 +2807,7 @@ static void proactive_compact_node(pg_data_t *pgdat)
 }
 
 /* Compact all zones within a node */
-static void compact_node(int nid)
+static int compact_node(int nid)
 {
 	pg_data_t *pgdat = NODE_DATA(nid);
 	int zoneid;
@@ -2830,7 +2830,12 @@ static void compact_node(int nid)
 		cc.zone = zone;
 
 		compact_zone(&cc, NULL);
+
+		if (fatal_signal_pending(current))
+			return -EINTR;
 	}
+
+	return 0;
 }
 
 /* Compact all nodes in the system */
@@ -2841,8 +2846,10 @@ static void compact_nodes(void)
 	/* Flush pending updates to the LRU lists */
 	lru_add_drain_all();
 
-	for_each_online_node(nid)
-		compact_node(nid);
+	for_each_online_node(nid) {
+		if (compact_node(nid))
+			break;
+	}
 }
 
 static int compaction_proactiveness_sysctl_handler(struct ctl_table *table, int write,
-- 
2.19.1.6.gb485710b


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ