From: Mateusz Guzik <mjguzik@gmail.com>
To: zhangzihuan <zhangzihuan@kylinos.cn>
Cc: David Hildenbrand <david@redhat.com>,
rafael@kernel.org, len.brown@intel.com, pavel@kernel.org,
kees@kernel.org, mingo@redhat.com, peterz@infradead.org,
juri.lelli@redhat.com, vincent.guittot@linaro.org,
dietmar.eggemann@arm.com, rostedt@goodmis.org,
bsegall@google.com, mgorman@suse.de, vschneid@redhat.com,
akpm@linux-foundation.org, lorenzo.stoakes@oracle.com,
Liam.Howlett@oracle.com, vbabka@suse.cz, rppt@kernel.org,
surenb@google.com, mhocko@suse.com, linux-pm@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [RFC PATCH] PM: Optionally block user fork during freeze to improve performance
Date: Sun, 8 Jun 2025 17:50:33 +0200 [thread overview]
Message-ID: <5mj4mc7asiplmgbqyl2uaw5cdpt6dpdrhtapi63dcrowozcwuq@c4cxyaxwe6aw> (raw)
In-Reply-To: <6350624c-7293-43de-8788-e52a236d91fb@kylinos.cn>
On Sun, Jun 08, 2025 at 03:22:20PM +0800, zhangzihuan wrote:
> One alternative could be to block in kernel_clone() until freezing ends,
> instead of returning an error. That way, fork() would not fail, just
> potentially block briefly (similar to memory pressure or cgroup limits). Do
> you think that's more acceptable?
So I had a look at the freezing loop and it operates with
tasklist_lock held, meaning it already stalls clone().
try_to_freeze_tasks() in kernel/power/process.c contains:
todo = 0;
read_lock(&tasklist_lock);
for_each_process_thread(g, p) {
if (p == current || !freeze_task(p))
continue;
todo++;
}
read_unlock(&tasklist_lock);
I don't get where the assumption that fork itself is a factor is coming
from.
Looking at freezing itself it seems to me perf trouble starts with tons
of processes existing to begin with in arbitrary states (not with racing
against fork), requring a retry with preceeded by a sleep:
/*
* We need to retry, but first give the freezing tasks some
* time to enter the refrigerator. Start with an initial
* 1 ms sleep followed by exponential backoff until 8 ms.
*/
usleep_range(sleep_usecs / 2, sleep_usecs);
if (sleep_usecs < 8 * USEC_PER_MSEC)
sleep_usecs *= 2;
For a race against fork to have any effect, the new thread has to be
linked in to the global list -- otherwise the todo var wont get bumped.
But then if it gets added in a state which is freezable, the racing fork
did not cause any trouble.
If it gets added in a state which is *NOT* freezable by the current
code, maybe it should be patched to be freezable.
All in all I'm not confident any of this warrants any work -- do you
have a setup where the above causes a real problem?
next prev parent reply other threads:[~2025-06-08 15:50 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-06 6:25 Zihuan Zhang
2025-06-06 7:20 ` David Hildenbrand
2025-06-08 7:22 ` zhangzihuan
2025-06-08 15:50 ` Mateusz Guzik [this message]
2025-06-09 3:46 ` zhangzihuan
2025-06-06 8:22 ` Peter Zijlstra
2025-06-09 4:05 ` zhangzihuan
2025-06-10 10:50 ` David Hildenbrand
2025-06-13 2:37 ` Zihuan Zhang
2025-06-13 7:05 ` Michal Hocko
2025-06-16 3:46 ` Zihuan Zhang
2025-06-16 7:45 ` David Hildenbrand
2025-06-16 11:24 ` Michal Hocko
2025-06-18 11:30 ` Zihuan Zhang
2025-06-18 11:54 ` David Hildenbrand
2025-07-28 13:06 ` Zihuan Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5mj4mc7asiplmgbqyl2uaw5cdpt6dpdrhtapi63dcrowozcwuq@c4cxyaxwe6aw \
--to=mjguzik@gmail.com \
--cc=Liam.Howlett@oracle.com \
--cc=akpm@linux-foundation.org \
--cc=bsegall@google.com \
--cc=david@redhat.com \
--cc=dietmar.eggemann@arm.com \
--cc=juri.lelli@redhat.com \
--cc=kees@kernel.org \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-pm@vger.kernel.org \
--cc=lorenzo.stoakes@oracle.com \
--cc=mgorman@suse.de \
--cc=mhocko@suse.com \
--cc=mingo@redhat.com \
--cc=pavel@kernel.org \
--cc=peterz@infradead.org \
--cc=rafael@kernel.org \
--cc=rostedt@goodmis.org \
--cc=rppt@kernel.org \
--cc=surenb@google.com \
--cc=vbabka@suse.cz \
--cc=vincent.guittot@linaro.org \
--cc=vschneid@redhat.com \
--cc=zhangzihuan@kylinos.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox