Wie können Tasks das Einfrieren beim Anhalten ablehnen?

17

Als ich gestern meinen Laptop schloss, ging er nicht sofort in den Standby-Modus. Laut den Protokollen hat es versucht, aber eine Aufgabe hat sich geweigert einzufrieren:

Freezing of tasks failed after 20.005 seconds (1 tasks refusing to freeze, wq_busy=0):

Dies dauerte einige Stunden, bis das System tatsächlich angehalten wurde. Das syslogwar voller Nachrichten wie in dieser Frage , weil systemdimmer wieder versucht wurde.

Wie kann das passieren? Warum kann der Scheduler die Planung dieser Anwendung nicht einfach stoppen? und dann ist es effektiv eingefroren? Ich habe gelesen, dass es mehrere STOPBefehle gibt, von denen einer freundlich fragt und einer das Einfrieren erzwingt. Warum haben Sie das systemdnicht genutzt oder warum hat das hier nicht funktioniert?

Piegames
quelle

Antworten:

25

Das Einfrieren von Tasks wird in der Kernel-Dokumentation ausführlich dokumentiert .

User-Space-Prozesse können das Einfrieren nicht ablehnen. Sie werden zwar eingefroren, aber die Signalisierung zwischen Kernel und Prozessen wird automatisch vom Code für die Signalverarbeitung übernommen (Einfrieren verwendet ein falsches Signal).

Wenn Sie sehen, dass "Aufgaben das Einfrieren ablehnen", bedeutet dies, dass ein Kernel-Thread das Einfrieren ablehnt, normalerweise, weil er etwas tut, das nicht überprüft werden kann. Es ist jedoch nicht normal, mehrere Stunden darauf warten zu müssen, dass der Kernel angehalten wird. Die Stapelspuren in den Protokollnachrichten helfen dabei, eine Vorstellung davon zu bekommen, was falsch läuft.

Stephen Kitt
quelle