Message ID | 20250624115244.19260-1-zhangzihuan@kylinos.cn |
---|---|
State | New |
Headers | show |
Series | [v1,RFC] PM / freezer: skip kernel threads with PF_NOFREEZE to reduce freeze overhead | expand |
diff --git a/kernel/power/process.c b/kernel/power/process.c index dc0dfc349f22..49dc6545a099 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -51,6 +51,8 @@ static int try_to_freeze_tasks(bool user_only) todo = 0; read_lock(&tasklist_lock); for_each_process_thread(g, p) { + if ((p->flags & PF_KTHREAD) && !(p->flags & PF_NOFREEZE)) + continue; if (p == current || !freeze_task(p)) continue;
Hi Rafael, We are exploring performance optimizations in the freezer subsystem, and would like to submit this RFC patch for your feedback. On modern systems, the number of kernel threads can easily reach several hundred. However, during suspend or hibernate, only a small fraction of them are actually freezable. Most kernel threads are marked with `PF_NOFREEZE`. Despite this, the freezer still traverses every task in the system and calls `freeze_task()` on all of them. To reduce this overhead, we propose skipping kernel threads that are guaranteed non-freezable (`PF_KTHREAD && PF_NOFREEZE`) earlier in the traversal. While studying the freezer behavior, we noticed that some kernel threads had `PF_FROZEN` set but never actually entered `refrigerator()`. This is confusing, and may indicate subtle races or incomplete freeze logic. We also observed that some kernel threads are marked as freezable (i.e. not `PF_NOFREEZE`) but never actually enter the frozen state — likely because they never reach `try_to_freeze()` within the freeze window. This further calls into question whether we should treat such threads as true freeze targets. One concern is that kernel threads may **dynamically change state** during the freeze window. This makes it non-trivial to decide statically which threads are safe to skip. This RFC patch adds a preliminary filter to skip kernel threads that are both: - Marked with `PF_KTHREAD`; and - Marked with `PF_NOFREEZE`; These threads will no longer go through `freeze_task()` or count toward the `todo` counter. The goal is to reduce traversal time and avoid unnecessary bookkeeping for threads we know will always be skipped. We would like to hear your thoughts on whether: 1. This change is acceptable and aligns with the freezer model's design; 2. It's worth pursuing as a real optimization (even if the gain is modest); 3. We should further investigate dynamic kernel thread behavior during suspend. here is the S3 log: grep -E "entered|freezable:1|set_task" dmesg [ 134.344100] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.344138] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.344144] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.344147] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.344150] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.344182] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.344328] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.344334] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.344343] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.346411] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.346434] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.346438] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.346440] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.346442] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.346465] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.346567] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.346571] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.346577] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.348282] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.348303] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.348306] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.348308] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.348310] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.348331] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.348421] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.348424] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.348429] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.352330] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.352351] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.352354] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.352356] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.352358] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.352379] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.352469] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.352473] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.352478] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.360328] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.360349] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.360353] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.360354] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.360356] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.360377] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.360467] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.360471] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.360476] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.368321] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.368342] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.368345] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.368347] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.368349] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.368370] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.368460] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.368463] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.368469] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.376307] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.376329] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.376332] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.376334] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.376336] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.376356] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.376446] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.376450] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.376455] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.385070] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.385093] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.385097] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.385106] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.385108] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.385136] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.385238] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.385242] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.385247] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.385755] current kernel process name:kauditd pid:101 freezable:1 frozen:0 [ 134.385756] set_task_frozen kernel thread name:kauditd pid:101 [ 134.385778] current kernel process name:oom_reaper pid:113 freezable:1 frozen:0 [ 134.385779] set_task_frozen kernel thread name:oom_reaper pid:113 [ 134.385782] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:0 [ 134.385783] set_task_frozen kernel thread name:kcompactd0 pid:115 [ 134.385785] current kernel process name:ksmd pid:116 freezable:1 frozen:0 [ 134.385786] set_task_frozen kernel thread name:ksmd pid:116 [ 134.385788] current kernel process name:khugepaged pid:117 freezable:1 frozen:0 [ 134.385789] set_task_frozen kernel thread name:khugepaged pid:117 [ 134.385810] current kernel process name:kswapd0 pid:129 freezable:1 frozen:0 [ 134.385849] kswapd0 entered refrigerator [ 134.385911] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:0 [ 134.385917] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:0 [ 134.385917] jbd2/sdb3-8 entered refrigerator [ 134.385926] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:0 [ 134.385953] jbd2/sdb2-8 entered refrigerator [ 134.385963] jbd2/sda1-8 entered refrigerator [ 134.387526] current kernel process name:kauditd pid:101 freezable:1 frozen:1 [ 134.387549] current kernel process name:oom_reaper pid:113 freezable:1 frozen:1 [ 134.387553] current kernel process name:kcompactd0 pid:115 freezable:1 frozen:1 [ 134.387555] current kernel process name:ksmd pid:116 freezable:1 frozen:1 [ 134.387557] current kernel process name:khugepaged pid:117 freezable:1 frozen:1 [ 134.387581] current kernel process name:kswapd0 pid:129 freezable:1 frozen:1 [ 134.387682] current kernel process name:jbd2/sdb3-8 pid:446 freezable:1 frozen:1 [ 134.387686] current kernel process name:jbd2/sdb2-8 pid:505 freezable:1 frozen:1 [ 134.387692] current kernel process name:jbd2/sda1-8 pid:510 freezable:1 frozen:1 Signed-off-by: Zihuan Zhang <zhangzihuan@kylinos.cn> --- kernel/power/process.c | 2 ++ 1 file changed, 2 insertions(+)