[LINUX] Einfrieren von Aufgaben (2/2)

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

V. Gibt es Probleme im Zusammenhang mit dem Einfrieren von Aufgaben?

Ja, das gibt es. (Ja, das gibt es)

.

First of all, the freezing of kernel threads may be tricky if they depend one on another.

Erstens kann das Einfrieren des Kernel-Threads schwierig sein, wenn Sie etwas anderes anfordern.

For example, if kernel thread A waits for a completion (in the TASK_UNINTERRUPTIBLE state) that needs to be done by freezable kernel thread B and B is frozen in the meantime, then A will be blocked until B is thawed, which may be undesirable. Wenn beispielsweise Kernel-Thread A auf den Abschluss durch den einfrierbaren Kernel-Thread B wartet (im Status TASK_UNINTERRUPTIBLE) und B in der Zwischenzeit einfriert, wird A blockiert, bis B aufgetaut ist, was unerwünscht wäre.

That’s why kernel threads are not freezable by default.

Aus diesem Grund macht der Kernel-Thread ihn standardmäßig nicht einfrierbar.

.

Second, there are the following two problems related to the freezing of user space processes:

Als nächstes gibt es zwei Gründe, die mit dem Einfrieren von Benutzerraumprozessen zusammenhängen.

.

Putting processes into an uninterruptible sleep distorts the load average.

Wenn Sie den Prozess in einen ununterbrochenen Schlaf versetzen, wird die durchschnittliche Belastung verzerrt.

Now that we have FUSE, plus the framework for doing device drivers in userspace, it gets even more complicated because some userspace processes are now doing the sorts of things that kernel threads do (https://lists.linux-foundation.org/pipermail/linux-pm/2007-May/012309.html).

Derzeit gibt es FUSE und zusätzlich ein Framework zum Ausführen von Gerätetreibern im Benutzerbereich. Dies wird durch die Tatsache weiter erschwert, dass einige Userspace-Prozesse die Art der Verarbeitung ausführen, die der Kernel-Thread ausführt. (https://lists.linux-foundation.org/pipermail/linux-pm/2007-May/012309.html)

The problem 1. seems to be fixable, although it hasn’t been fixed so far.

Problem 1 scheint lösbar zu sein, ist es aber nicht.

The other one is more serious, but it seems that we can work around it by using hibernation (and suspend) notifiers

Das andere Problem ist schwerwiegender. Dies kann jedoch vermieden werden, indem die Problemumgehung verwendet wird, die in Benachrichtigungen für den Ruhezustand (und für das Anhalten) verwendet wird.

(in that case, though, we won’t be able to avoid the realization by the user space processes that the hibernation is taking place).

(In diesem Fall kann die Realisierung jedoch nicht durch den Benutzerbereichsprozess vermieden werden, in dem der Ruhezustand stattfindet.)

.

There are also problems that the freezing of tasks tends to expose, although they are not directly related to it.

Es gibt auch ein Problem, das nicht direkt mit dem Einfrieren von Aufgaben zusammenhängt, sondern eher aufgrund von Einfrieren von Aufgaben auftritt.

For example, if request_firmware() is called from a device driver’s .resume() routine, it will timeout and eventually fail, because the user land process that should respond to the request is frozen at this point.

Wenn beispielsweise request_firmware () von der Routine resume () des Gerätetreibers aufgerufen wird, tritt eine Zeitüberschreitung auf und schlägt schließlich fehl. Weil der Benutzerbereichsprozess, der auf diese Anforderung antworten muss, zu diesem Zeitpunkt eingefroren ist.

So, seemingly, the failure is due to the freezing of tasks.

Auf den ersten Blick ist die Ursache des Fehlers das Einfrieren der Aufgabe.

Suppose, however, that the firmware file is located on a filesystem accessible only through another device that hasn’t been resumed yet.

Die Firmware-Datei befindet sich jedoch im Dateisystem. Auf das Dateisystem kann nur über ein anderes Gerät zugegriffen werden, das den Lebenslauf noch nicht abgeschlossen hat.

In that case, request_firmware() will fail regardless of whether or not the freezing of tasks is used.

In diesem Fall schlägt request_firmware () fehl, unabhängig davon, ob das Einfrieren von Aufgaben verwendet wird.

Consequently, the problem is not really related to the freezing of tasks, since it generally exists anyway.

Infolgedessen treten normalerweise Probleme auf, die nicht mit dem Einfrieren von Aufgaben zusammenhängen.

.

A driver must have all firmwares it may need in RAM before suspend() is called.

Der Treiber muss die gesamte Firmware im RAM haben, bevor suspend () aufgerufen wird.

If keeping them is not practical, for example due to their size, they must be requested early enough using the suspend notifier API described in Documentation/driver-api/pm/notifiers.rst.

Wenn es beispielsweise nicht praktikabel ist, die Größe beizubehalten, sollten Sie eine frühzeitige Anforderung mithilfe der Suspend-Notifier-API stellen (siehe Dokumentation / driver-api / pm / notifiers.rst).

VI. Sind Vorkehrungen zu treffen, um Einfrierfehler zu verhindern? (Gibt es Vorkehrungen, um Einfrierfehler zu verhindern?)

Ja, das gibt es. (Ja, das gibt es)

.

First of all, grabbing the ‘system_transition_mutex’ lock to mutually exclude a piece of code from system-wide sleep such as suspend/hibernation is not encouraged.

Es wird nicht empfohlen, zuerst die Sperre "system_transition_mutex" zu aktivieren und dann den Code vom systemweiten Ruhezustand wie "Suspend / Hibernation" auszuschließen.

If possible, that piece of code must instead hook onto the suspend/hibernation notifiers to achieve mutual exclusion.

Wenn möglich, sollten Sie stattdessen Benachrichtigungen über Suspend / Hibernation verwenden, um einen gegenseitigen Ausschluss zu erreichen.

Look at the CPU-Hotplug code (kernel/cpu.c) for an example.

Ein Beispiel finden Sie unter CPU-Hotplug-Code (kernel / cpu.c).

.

However, if that is not feasible, and grabbing ‘system_transition_mutex’ is deemed necessary, it is strongly discouraged to directly call mutex_[un]lock(&system_transition_mutex) since that could lead to freezing failures,

Wenn dies jedoch nicht möglich ist und Sie der Meinung sind, dass Sie "system_transition_mutex" benötigen, rufen Sie mutex_ [un] lock (& system_transition_mutex) nicht direkt auf. Ein Gefrierfehler kann auftreten.

because if the suspend/hibernate code successfully acquired the ‘system_transition_mutex’ lock, and hence that other entity failed to acquire the lock, then that task would get blocked in TASK_UNINTERRUPTIBLE state.

Wenn der Suspend / Hibernate-Code die Sperre "system_transition_mutex" erfolgreich erhält, kann keine andere Entität die Sperre erhalten und die Task wird im Status "TASK_UNINTERRUPTIBLE" blockiert.

As a consequence, the freezer would not be able to freeze that task, leading to freezing failure.

Infolgedessen kann der Gefrierschrank die Aufgabe nicht einfrieren, was zu einem Einfrierfehler führt.

.

However, the [un]lock_system_sleep() APIs are safe to use in this scenario, since they ask the freezer to skip freezing this task, since it is anyway “frozen enough” as it is blocked on ‘system_transition_mutex’, which will be released only after the entire suspend/hibernation sequence is complete.

In diesem Szenario kann die API [un] lock_system_sleep () jedoch sicher verwendet werden. Bitten Sie den Gefrierschrank, das Einfrieren für diese Aufgabe zu überspringen. Der system_transition_mutex ist ohnehin blockiert und eingefroren genug (frozon enogh), sodass er nach Abschluss der Suspend / Hibernation-Sequenz freigegeben wird.

So, to summarize, use [un]lock_system_sleep() instead of directly using mutex_[un]lock(&system_transition_mutex). That would prevent freezing failures.

Zusammenfassend kann man also, anstatt mutex_ [un] lock (& system_transition_mutex) direkt zu verwenden, [un] lock_system_sleep () verwenden. Dies verhindert Einfrierfehler.

V. Verschiedenes (Sonstiges)

/sys/power/pm_freeze_timeout controls how long it will cost at most to freeze all user space processes or all freezable kernel threads, in unit of millisecond.

/ sys / power / pm_freeze_timeout enthält Informationen zu den maximalen Kosten, die zum Einfrieren aller User Space-Prozesse und aller einfrierbaren Kernel-Threads erforderlich sind. Das Gerät ist Millisekunden.

The default value is 20000, with range of unsigned integer.

Der Standardwert ist 20000 und der Bereich ist eine nicht definierte Ganzzahl.

Recommended Posts

Einfrieren von Aufgaben (1/2)
Einfrieren von Aufgaben (2/2)
Verwaltungsaufgaben