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>] [day] [month] [year] [list]
Message-Id: <20250515030151.224508-1-zhangzihuan@kylinos.cn>
Date: Thu, 15 May 2025 11:01:51 +0800
From: Zihuan Zhang <zhangzihuan@...inos.cn>
To: rafael@...nel.org,
	pavel@...nel.org
Cc: linux-pm@...r.kernel.org,
	linux-kernel@...r.kernel.org,
	Zihuan Zhang <zhangzihuan@...inos.cn>
Subject: [PATCH v1] freezer: Skip zombie processes early to reduce lock contention

Currently, the freezer core processes all tasks, including zombie tasks
(EXIT_ZOMBIE), when performing freeze operations.  However, zombie tasks
cannot be frozen since they are already dead and won't execute further.
Despite this, these tasks are still passed to freeze_task(), which may
involve acquiring locks and accessing unnecessary internal state.

This patch introduces an early check to skip zombie tasks when calling
freeze_task(), significantly reducing the lock contention, especially on
systems with many short-lived processes or a high volume of process
exits.

Benefits:
- Reduces unnecessary lock contention by skipping zombie processes
  earlier in the freeze process.
- Improves overall freezing performance, particularly in high-load
  systems where there are many zombie processes.

Signed-off-by: Zihuan Zhang <zhangzihuan@...inos.cn>
---
 kernel/freezer.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/kernel/freezer.c b/kernel/freezer.c
index 8d530d0949ff..a6867195bb77 100644
--- a/kernel/freezer.c
+++ b/kernel/freezer.c
@@ -164,6 +164,9 @@ bool freeze_task(struct task_struct *p)
 {
 	unsigned long flags;
 
+	if (p->exit_state == EXIT_ZOMBIE)
+		return false;
+
 	spin_lock_irqsave(&freezer_lock, flags);
 	if (!freezing(p) || frozen(p) || __freeze_task(p)) {
 		spin_unlock_irqrestore(&freezer_lock, flags);
@@ -203,6 +206,9 @@ void __thaw_task(struct task_struct *p)
 {
 	unsigned long flags;
 
+	if (p->exit_state == EXIT_ZOMBIE)
+		return;
+
 	spin_lock_irqsave(&freezer_lock, flags);
 	if (WARN_ON_ONCE(freezing(p)))
 		goto unlock;
-- 
2.25.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ