Ursprünglich ist es Teil des Quellcodes des Linux-Kernels, daher wird es als GPLv2 behandelt (Anerkennung, dass es sein sollte).
https://www.kernel.org/doc/html/latest/index.html
Licensing documentation
The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.
https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing
https://www.kernel.org/doc/html/latest/power/freezing-of-tasks.html
Docs » Power Management » Freezing of tasks
Freezing of tasks 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL
The freezing of tasks is a mechanism by which user space processes and some kernel threads are controlled during hibernation or system-wide suspend (on some architectures).
Das Einfrieren von Aufgaben ist die Steuerung von Userspace-Prozessen und einigen Kernel-Threads während des Ruhezustands oder des systemweiten Systemaufwands (in einigen Architekturen).
There are three per-task flags used for that, PF_NOFREEZE, PF_FROZEN and PF_FREEZER_SKIP (the last one is auxiliary).
Es werden drei Arten von Task-Task-Flags verwendet. PF_NOFREEZE, PF_FROZEN, PF_FREEZER_SKIP (der letzte ist ein Hilfsmittel).
The tasks that have PF_NOFREEZE unset (all user space processes and some kernel threads) are regarded as ‘freezable’ and treated in a special way before the system enters a suspend state as well as before a hibernation image is created
Aufgaben (alle Userspace-Prozesse und einige Kernel-Threads), für die PF_NOFREEZE nicht festgelegt ist, werden als "einfrierbar" betrachtet. Sie werden auf besondere Weise verarbeitet, bevor das System in den Syspend-Status übergeht, bevor das Ruhezustand-Image generiert wird.
(in what follows we only consider hibernation, but the description also applies to suspend).
(Im Folgenden wird nur der Ruhezustand berücksichtigt, die Beschreibung kann jedoch auch auf die Unterbrechung angewendet werden.)
.
Namely, as the first step of the hibernation procedure the function freeze_processes() (defined in kernel/power/process.c) is called.
Das heißt, die Funktion freeze_processes () wird als erster Schritt in der Ruhezustandsprozedur aufgerufen (wie in kernel / power / process.c beschrieben).
A system-wide variable system_freezing_cnt (as opposed to a per-task flag) is used to indicate whether the system is to undergo a freezing operation.
Die systemweite Variable system_freezing_cnt (anstelle des Pro-Task-Flags) gibt an, ob das System eingefroren wird.
And freeze_processes() sets this variable.
freeze_processes () setzt diese Variable.
After this, it executes try_to_freeze_tasks() that sends a fake signal to all user space processes, and wakes up all the kernel threads.
Danach wird try_to_freeze_tasks () ausgeführt, um ein Pseudosignal an alle User Space-Prozesse und alle Kernel-Threads zu senden.
All freezable tasks must react to that by calling try_to_freeze(), which results in a call to __refrigerator() (defined in kernel/freezer.c), which sets the task’s PF_FROZEN flag, changes its state to TASK_UNINTERRUPTIBLE and makes it loop until PF_FROZEN is cleared for it.
Alle einfrierbaren Aufgaben müssen mit dem Aufruf von try_to_freeze () reagieren. Dadurch wird das PF_FROZEN-Flag der Task gesetzt, der Status der Task in TASK_UNTERRRUPTIBLE geändert und eine Schleife ausgeführt, bis PF_FROZEN gelöscht wird.
Then, we say that the task is ‘frozen’ and therefore the set of functions handling this mechanism is referred to as ‘the freezer’
Und da die Aufgabe "eingefroren" ist, wird der Satz von Funktionen, die diesen Mechanismus handhaben, "der Gefrierschrank" genannt.
(these functions are defined in kernel/power/process.c, kernel/freezer.c & include/linux/freezer.h).
(Diese Funktionen sind in kernel / power / process.c, kernel / freezer.c und include / linux / freezer.h beschrieben.)
User space processes are generally frozen before kernel threads
Benutzerräumliche Prozesse werden grundsätzlich vor dem Kernel-Thread eingefroren. ..
.
__refrigerator() must not be called directly.
Sie können __refrigerator () nicht direkt aufrufen.
Instead, use the try_to_freeze() function (defined in include/linux/freezer.h), that checks if the task is to be frozen and makes the task enter __refrigerator().
Verwenden Sie stattdessen die Funktion try_yo_freeze () (definiert in include / linux / freezer.h), mit der überprüft wird, ob die Aufgabe überwacht werden soll und die Aufgabe nach __refrigerator () verschoben wird. Machen.
.
For user space processes try_to_freeze() is called automatically from the signal-handling code, but the freezable kernel threads need to call it explicitly in suitable places or use the wait_event_freezable() or wait_event_freezable_timeout() macros (defined in include/linux/freezer.h) that combine interruptible sleep with checking if the task is to be frozen and calling try_to_freeze().
In Userspace-Prozessen wird try_yo_freeze () automatisch aus dem Signalverarbeitungscode aufgerufen. Der Freezable-Kernel-Thread muss jedoch explizit an Ort und Stelle aufgerufen werden oder das Makro wait_event_freezable () oder wait_event_freezable_timeout () verwenden (definiert in include / linux / freezer.h). Dies ist ein Makro für unterbrechbaren Ruhezustand, um zu bestimmen, ob eine Aufgabe einfrieren soll, und um try_to_freeze () aufzurufen.
The main loop of a freezable kernel thread may look like the following one:
Die Hauptschleife des einfrierbaren Kernel-Threads hat die folgende Form.
set_freezable();
do {
hub_events();
wait_event_freezable(khubd_wait,
!list_empty(&hub_event_list) ||
kthread_should_stop());
} while (!kthread_should_stop() || !list_empty(&hub_event_list));
(from drivers/usb/core/hub.c::hub_thread()).
If a freezable kernel thread fails to call try_to_freeze() after the freezer has initiated a freezing operation, the freezing of tasks will fail and the entire hibernation operation will be cancelled.
Der freezablekernel-Thread schlägt fehl, wenn Sie try_to_freeze () aufrufen, nachdem der Freezer den Freezing-Prozess initialisiert hat. Das Einfrieren der Aufgabe schlägt fehl und der Übergang zur Verarbeitung im Ruhezustand wird abgebrochen.
For this reason, freezable kernel threads must call try_to_freeze() somewhere or use one of the wait_event_freezable() and wait_event_freezable_timeout() macros.
Aus diesem Grund muss der Freezable-Kernel-Thread entweder try_to_freeze () für eines aufrufen oder eines der Makros wait_event_freezable () und wait_event_freezable_timeout () verwenden.
.
After the system memory state has been restored from a hibernation image and devices have been reinitialized, the function thaw_processes() is called in order to clear the PF_FROZEN flag for each frozen task. Then, the tasks that have been frozen leave __refrigerator() and continue running.
Wenn der Systemspeicherstatus aus dem Ruhezustand wiederhergestellt wird und das Gerät neu initialisiert werden kann, wird thaw_processes () aufgerufen. Dadurch wird das PF_FROZEN-Flag für jede eingefrorene Aufgabe gelöscht. Infolgedessen wird die Aufgabe von __refrigerator () getrennt und kann weiter verarbeitet werden. ..
Rationale behind the functions dealing with freezing and thawing of tasks
Die Beziehung zwischen dem Einfrieren und Auftauen von Aufgaben ist wie folgt.
freeze_processes():
freezes only userspace tasks
Frieren Sie nur Benutzerbereichsaufgaben ein.
freeze_kernel_threads():
freezes all tasks (including kernel threads) because we can’t freeze kernel threads without freezing userspace tasks
Frieren Sie alle Aufgaben ein, einschließlich des Kernel-Threads. Dies liegt daran, dass User-Space-Aufgaben nicht eingefroren werden können und Kernel-Threads nicht eingefroren werden können.
thaw_kernel_threads():
thaws only kernel threads; this is particularly useful if we need to do anything special in between thawing of kernel threads and thawing of userspace tasks, or if we want to postpone the thawing of userspace tasks
Stellen Sie den Kernel-Thread wieder her. Dies ist nützlich, wenn Sie zwischen dem Entpacken des Kernel-Threads und dem Entpacken der Userspace-Aufgabe etwas Besonderes tun möchten oder wenn Sie das Entpacken der Userspace-Aufgabe verschieben möchten.
thaw_processes():
thaws all tasks (including kernel threads) because we can’t thaw userspace tasks without thawing kernel threads
Beantworten Sie alle Aufgaben, einschließlich des Kernel-Threads. Dies liegt daran, dass Userspace-Aufgaben nicht entpackt werden können, ohne den Kernel-Thread zu entpacken.
Kernel threads are not freezable by default.
Der Kernel-Thread kann standardmäßig nicht eingefroren werden.
However, a kernel thread may clear PF_NOFREEZE for itself by calling set_freezable() (the resetting of PF_NOFREEZE directly is not allowed).
Der Kernel-Thread kann jedoch seinen eigenen PF_NOFREEZE löschen, indem er set_freezable () aufruft. (Das direkte Zurücksetzen von PF_NOFREEZE ist nicht zulässig).
From this point it is regarded as freezable and must call try_to_freeze() in a suitable place.
Ab diesem Zeitpunkt gilt es als einfrierbar und Sie müssen try_to_freeze () an der entsprechenden Stelle aufrufen.
.
Generally speaking, there is a couple of reasons to use the freezing of tasks:
Im Allgemeinen gibt es mehrere Gründe, warum Sie das Einfrieren von Aufgaben verwenden sollten.
.
The principal reason is to prevent filesystems from being damaged after hibernation.
Der Hauptgrund besteht darin, eine Beschädigung des Dateisystems nach dem Ruhezustand zu verhindern.
At the moment we have no simple means of checkpointing filesystems, so if there are any modifications made to filesystem data and/or metadata on disks, we cannot bring them back to the state from before the modifications.
Derzeit gibt es keine einfache Möglichkeit, einen Dateisystemprüfpunkt festzulegen. Wenn Sie Änderungen an den Daten oder Metadaten auf der Festplatte vornehmen, können Sie sie daher nicht in ihren ursprünglichen Zustand zurückversetzen.
At the same time each hibernation image contains some filesystem-related information that must be consistent with the state of the on-disk data and metadata after the system memory state has been restored from the image
Zu diesem Zeitpunkt enthält jedes Ruhezustand-Image dateisystembezogene Informationen, die mit dem Status der Daten und Metadaten auf der Festplatte übereinstimmen müssen, nachdem der Status des Systemspeichers aus dem Image wiederhergestellt wurde.
(otherwise the filesystems will be damaged in a nasty way, usually making them almost impossible to repair).
(Andernfalls wird das Dateisystem auf umständliche Weise beschädigt und kann normalerweise kaum wiederhergestellt werden.)
We therefore freeze tasks that might cause the on-disk filesystems’ data and metadata to be modified after the hibernation image has been created and before the system is finally powered off.
Daher wird ein Ruhezustand-Image erstellt, um potenziell veränderbare Aufgaben in den Daten und Metadaten des Dateisystems auf der Festplatte einzufrieren, bevor das System endgültig ausgeschaltet wird.
The majority of these are user space processes, but if any of the kernel threads may cause something like this to happen, they have to be freezable.
Viele davon sind User-Space-Prozesse, aber sie können auch eingefroren werden, wenn Sie einen Kernel-Thread haben, der etwas tut, das dies verursacht.
.
Next, to create the hibernation image we need to free a sufficient amount of memory (approximately 50% of available RAM) and we need to do that before devices are deactivated, because we generally need them for swapping out.
Zweitens müssen Sie genügend Speicher freigeben, um ein Ruhezustand-Image zu erstellen (ungefähr 50% des verfügbaren Arbeitsspeichers). Dies muss vor dem Deaktivieren des Geräts erfolgen. Weil es notwendig ist, auszutauschen.
Then, after the memory for the image has been freed, we don’t want tasks to allocate additional memory and we prevent them from doing that by freezing them earlier.
Nachdem der Speicher für das Bild freigegeben wurde, wird dies daher durch früheres Einfrieren verhindert, sodass die Aufgabe nicht mehr Speicher anfordert.
[Of course, this also means that device drivers should not allocate substantial amounts of memory from their .suspend() callbacks before hibernation, but this is a separate issue.]
[Dies bedeutet natürlich, dass Sie nicht viel Speicher für jeden Suspend () - Rückruf zuweisen sollten, bevor der Gerätetreiber in den Ruhezustand wechselt. Dies ist eine andere Sache] .
The third reason is to prevent user space processes and some kernel threads from interfering with the suspending and resuming of devices.
Der dritte Grund besteht darin, sicherzustellen, dass Userspace-Prozesse und einige Kernel-Threads das Anhalten und Fortsetzen des Geräts nicht beeinträchtigen.
A user space process running on a second CPU while we are suspending devices may, for example, be troublesome and without the freezing of tasks we would need some safeguards against race conditions that might occur in such a case.
Beispielsweise kann ein Userspace-Prozess, der auf einer zweiten CPU ausgeführt wird, beim Versuch, ein Gerät anzuhalten, ärgerlich sein. Ohne die Aufgabe einzufrieren, benötigen Sie Schutz vor widersprüchlichen Bedingungen, die solche Fälle verursachen.
.
Although Linus Torvalds doesn’t like the freezing of tasks, he said this in one of the discussions on LKML (http://lkml.org/lkml/2007/4/27/608):
Linus Torvalds hasst Gefrieraufgaben. Ich habe dies in einer der Diskussionen über LKML erwähnt (http://lkml.org/lkml/2007/4/27/608).
.
“RJW:> Warum frieren wir Aufgaben überhaupt ein oder warum wir Kernel-Threads einfrieren?” (Warum alle Aufgaben einfrieren oder warum wir Kernel-Threads einfrieren?)
Linus: In vielerlei Hinsicht "überhaupt". (Oft "alle") I do realize the IO request queue issues, and that we cannot actually do s2ram with some devices in the middle of a DMA.
Ich verstehe das Problem mit der E / A-Anforderung. Sie können auch nicht mit einem Gerät in der Mitte von DMA s2ram.
So we want to be able to avoid that, there’s no question about that.
Es gibt also keine Frage, um dies zu vermeiden.
And I suspect that stopping user threads and then waiting for a sync is practically one of the easier ways to do so.
Das Stoppen des Benutzer-Threads und das anschließende Warten auf die Synchronisierung ist tatsächlich eine der einfachsten Möglichkeiten.
So in practice, the ‘at all’ may become a ‘why freeze kernel threads?’ and freezing user threads I don’t find really objectionable.”
In Wirklichkeit wird "überhaupt" zu "Warum den Kernel-Thread einfrieren" und friert den Benutzer-Thread ein, was ich nicht wirklich unangenehm finde.
.
Still, there are kernel threads that may want to be freezable.
Trotzdem habe ich einen Kernel-Thread, den ich einfrieren möchte.
For example, if a kernel thread that belongs to a device driver accesses the device directly, it in principle needs to know when the device is suspended, so that it doesn’t try to access it at that time.
Wenn der Kernel-Thread beispielsweise zum Gerätetreiber gehört und direkt auf das Gerät zugreift, müssen Sie wissen, ob es Zeit für das Gerät ist, suspend auszusetzen, und Sie dürfen zu diesem Zeitpunkt nicht auf das Gerät zugreifen.
However, if the kernel thread is freezable, it will be frozen before the driver’s .suspend() callback is executed and it will be thawed after the driver’s .resume() callback has run, so it won’t be accessing the device while it’s suspended.
Wenn der Kernel-Thread jedoch eingefroren werden kann, wird er eingefroren, bevor der Rückruf des Treibers suspend () ausgeführt wird. Es wird dann beantwortet, bevor der Rückruf des Treibers resume () ausgeführt wird. Der Zugriff auf das Gerät stirbt während des Suspendierens.
Another reason for freezing tasks is to prevent user space processes from realizing that hibernation (or suspend) operation takes place.
Ein weiterer Grund für das Einfrieren einer Aufgabe besteht darin, den Benutzerbereichsprozess nicht darauf aufmerksam zu machen, dass die Verarbeitung im Ruhezustand (oder im Ruhezustand) stattfindet.
Ideally, user space processes should not notice that such a system-wide operation has occurred and should continue running without any problems after the restore (or resume from suspend).
Im Idealfall sollten Userspace-Prozesse nach einer Wiederherstellung (oder einer Wiederaufnahme nach dem Anhalten) problemlos weiterarbeiten können, ohne zu wissen, dass eine solche systemweite Operation stattfindet.
Unfortunately, in the most general case this is quite difficult to achieve without the freezing of tasks.
Leider ist es in den meisten Fällen sehr schwierig, dies zu erreichen, ohne die Aufgabe einzufrieren. ..
Consider, for example, a process that depends on all CPUs being online while it’s running.
Stellen Sie sich beispielsweise einen Prozess vor, der von allen CPUs abhängt, die online ausgeführt werden.
Since we need to disable nonboot CPUs during the hibernation, if this process is not frozen, it may notice that the number of CPUs has changed and may start to work incorrectly because of that.
Wenn Sie eine nicht startende CPU im Ruhezustand stoppen möchten, können Sie diesen Prozess nicht einfrieren. Es wird festgestellt, dass sich die Anzahl der CPUs geändert hat und nicht ordnungsgemäß funktioniert.