[<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