Thinkfan Portierung

JochenF

Well-Known Member
Ich hab mir mal den Source Code von Thinkfan angesehen. Das Ding ist ja eine eierlegende Wollmilchsau und kann alle Arten von Sensoren und Lüftern kontrollieren. Das geschieht natürlich alles über das Linux /proc Filesystem, während FreeBSD mit der Kernel MIB arbeitet.

Jetzt habe ich 2 Möglichkeiten: entweder ich erweitere das um eine weitere Methode zum Sensor auslesen und Lüfter steuern via MIB, oder ich entschlacke das ganze Ding um alles was Linux-typisch ist, und baue es so um dass man damit nur die Thinkpad Lüfter unter FreeBSD steuern kann. Letzteres wäre mir fast lieber, allerdings verliert man dann womöglich Dinge die man später für andere Lüfter wieder brauchen könnte.

Was meint ihr?
 
Nach weiteren 2 Stunden Studium des Codes habe ich mich entschlossen das ganze abzuspecken, das ist viel zu komplex. Wenn ich etwas mache, dann möchte ich das zu 100% verstehen, um Fehler weitestgehend ausschliessen zu können. Allein schon dass der Code vollgepflastert ist mit likely() und unlikely() macht ihn völlig unlesbar.
 
Ich hab den Code noch nicht gesehen, aber du solltest schon in Betracht ziehen, eine Zwischenschicht einzubauen, wenn der Entwickler schon nicht an der Portabilität gedacht hat. Dann führen die nicht unterstützten Features eben ins leere. Ist zmd. einfacher und wartbarer evtl. beteiligen sich andere noch an den Kram.
 
Ich hab den Code noch nicht gesehen, aber du solltest schon in Betracht ziehen, eine Zwischenschicht einzubauen, wenn der Entwickler schon nicht an der Portabilität gedacht hat.
Ich sehe da keinen Sinn drin. Erstens hat sich an Thinkfan seit einem Jahr nichts mehr geändert, und zweitens wüsste ich auch gar nicht was man an einer funktionierenden Lüftersteuerung noch verbessern will. Ich habe auch schon überlegt das Teil komplett neu zu schreiben. Der Parser für das Config-File ist gelinde gesagt "ein bisschen merkwürdig" programmiert. Das würde ich komplett anders machen und einen vorhandenen xml- oder yaml-Parser verwenden. Das Ganze ist ziemlicher Spaghetti-Code, viele Goto's und globale Variablen, alles vollgepflastert mit likely() und unlikely() Compiler-Direktiven. Alles mit der Begründung "möglichst effizient zu sein". Als ob ein Programm, welches alle 3 Sekunden mal ein halbes Dutzend Integerzahlen (Temperaturen) vergleicht, in der Hinsicht kritisch wäre.

Hätte ich mehr Zeit würde ich es von Grund auf neu schreiben. Da ich die aber nicht habe, und möglichst schnell zu einer funktionierenden Lösung kommen möchte (mein Lüfter nervt!), habe ich mich entschieden überflüssigen Ballast über Bord zu werfen, und den Rest wenigstens teilweise sauberer umzuschreiben (dabei sind mir auch schon einige Fehler aufgefallen, z.B. wird an vielen Stellen anstatt dem ACPI-Device aus dem Config-File eine globale Konstante verwendet, die eigentlich nur als Default-Einstellung gedacht war). Vielleicht mache ich später mal, wenn mir langweilig ist, eine komplett neue Lüftersteuerung. Im Grunde ist so ein Programm ja recht simpel: alle paar Sekunden ein paar Temperaturen vergleichen und den Lüfter ggf. schneller oder langsamer drehen lassen. Was es kompliziert macht ist das parsen des Config-Files (dafür gibts aber funktionierende Bibliotheken) und die Berücksichtigung verschiedenster Sensoren und Lüftertypen. Das brauchen wir hier aber gar nicht, da unter FreeBSD sowieso nur der acpi_ibm Part funktioniert (FreeBSD hat z.B. keine libatasmart um Festplatten-Temperaturen auszulesen).
 
Rein aus Interesse, was sind normale Temperaturen / Lüfterdrehzahlen bzw. auf welche Werte willst Du am Ende kommen ?
 
Rein aus Interesse, was sind normale Temperaturen / Lüfterdrehzahlen bzw. auf welche Werte willst Du am Ende kommen ?
Das kann man so pauschal nicht sagen. Da musst du im Datenblatt deiner CPU schauen was die verträgt, das ist sehr unterschiedlich. Und dann sind da noch die anderen Komponenten, die ja auch nicht zu heiss werden dürfen (das ist das schöne bei Thinkfan, der kann mehrere Sensoren berücksichtigen). Ich hab das bei mir unter Linux mal so hin optimiert, dass der Lüfter dauerhaft aus ist wenn der Rechner Idle ist. Da werden die Grenzen gerade so eingehalten. Am besten geht man von der mitgelieferten Beispielkonfiguration aus und optimiert die dann. Dazu ist es hilfreich wenn man ein Panel-Applet hat welches einem alle Temperaturen anzeigt. Sowas fehlt mir unter FreeBSD auch noch.
 
Bin fast fertig. Funktioniert schon. Ein paar Dinge müssten noch geklärt werden:
  1. Der Linux ACPI-Treiber liefert 16 Temperaturen, die hier beschrieben sind. Unserer liefert nur 8, ich vermute es sind die ersten 8. Zumindest erscheint das bei meinem T61 plausibel. Kann das wer bestätigen?
  2. Der Linux ACPI-Treiber kennt neben den Fanlevel 0-7 noch 2 weitere: "Auto" und "Disengaged". Disengaged ist mir klar, aber was macht Auto? Schaltet das die manuelle Steuerung aus? Brauchen wir das?
  3. Der Linux ACPI-Treiber hat einen Watchdog, der schaltet automatisch auf Hardware-Steuerung zurück, wenn eine gewisse Zeit lang keine Befehle mehr geschickt wurden. Daher muss der Thinkfan so ca. nach 5 Messungen den Fan-Level neu setzen, auch wenn er sich nicht verändert hat. Unser Treiber hat keinen Watchdog (oder?), somit könnte man diese Code-Teile komplett entfernen. Macht es übersichtlicher, effizienter und sicherer.
Als nächstes will ich noch ein komplettes Code-Review machen und versuchen ihn komplett zu verstehen. Da sind noch ein paar "seltsame" Teile in der Logik die ich (noch) nicht verstehe. Ich möchte das zu 100% verstehen, und sicher sein dass er mir nicht irgendwann meine CPU grillt. Wahrscheinlich werde ich es dabei auch noch mal umschreiben und versuchen ohne die globalen Variablen auszukommen, denn da weiß man nie wann die wo wie gesetzt werden. Ziemlich unübersichtlich.
 
Bin fast fertig. Funktioniert schon. Ein paar Dinge müssten noch geklärt werden:
  1. Der Linux ACPI-Treiber liefert 16 Temperaturen, die hier beschrieben sind. Unserer liefert nur 8, ich vermute es sind die ersten 8. Zumindest erscheint das bei meinem T61 plausibel. Kann das wer bestätigen?
  2. Der Linux ACPI-Treiber kennt neben den Fanlevel 0-7 noch 2 weitere: "Auto" und "Disengaged". Disengaged ist mir klar, aber was macht Auto? Schaltet das die manuelle Steuerung aus? Brauchen wir das?
Das kennt acpi_ibm aber auch. Nur das es in 2 MIB Objekte unterteilt ist:

Code:
dev.acpi_ibm.0.fan
Indicates whether the fan is in automatic (1) or manual (0) mode.
Default is automatic mode. This sysctl should be used with
extreme precaution, since disabling automatic fan control might
overheat the ThinkPad and lead to permanent damage if the
fan_level is not set accordingly.

dev.acpi_ibm.0.fan_level
Indicates at what speed the fan should run when being in manual
mode. Values are ranging from 0 (off) to 7 (max). The resulting
speed differs from model to model. On a T41p this is as follows:

0 off
1, 2 ~3000 RPM
3, 4, 5 ~3600 RPM
6, 7 ~4300 RPM

Ausser beim T410 funktioniert die Hardware Steuerung aber ziemlich optimal. Jedenfalls war das so bei meinem T420 und T440s
 
Das kennt acpi_ibm aber auch. Nur das es in 2 MIB Objekte unterteilt ist:

Code:
dev.acpi_ibm.0.fan
dev.acpi_ibm.0.fan_level

Das ist mir schon klar, das ein/ausschalten des manuellen Modus ist ja Grundvoraussetzung für eine eigene Lüftersteuerung. Unklar ist mir, ob dieser "Level Auto" im Linux genau das ist, oder ewas anderes. In der Linux-Version kann man "Level Auto" in die Limit-Tabelle eintragen, so wie die Level 0-7. Wenn es das gleiche ist, stellt sich die Frage nach dem Sinn.

Ausser beim T410 funktioniert die Hardware Steuerung aber ziemlich optimal. Jedenfalls war das so bei meinem T420 und T440s
Beim T61 leider nicht. "optimal" ist halt auch Geschmackssache. "optimal" heisst bei mir, dass der Lüfter dauerhaft aus ist wenn der Rechner grad nix anderes zu tun hat als auf neue Mails oder Chatnachrichten zu warten. Immerhin kriegt man das beim T61 mit Thinkfan hin, ohne in gefährliche Temperaturbereiche zu kommen. Bei meinem Acer Netbook schaffe ich das leider nicht, der wird ständig zu heiss, auch wenn er nix tut.
 
Das hab ich doch weiter oben schon mal geschrieben. Dem fehlt die Hysterese. Und außerdem reagiert er nur auf die Coretemp-Temperaturen, nicht auf die anderen im Thinkpad verbauten Sensoren.

Hmm, ich kann unter OpenBSD mit sysctl hw.sensors die Sensorwerte auslesen. Mit FreeBSD geht nur sysctl hw.acpi ... gibt es nur bei mir keine Sensorwerte (hab es auch mit grep probiert) ?
 
Das Modul sollte geladen sein, war jedenfalls so, als ich letzes mal nachgesehen habe. Die Variante werde ich einmal probieren.
 
Das coretemp Kernelmodul gibt's für FreeBSD auch noch.
coretemp misst halt nur die CPU (geht das eigentlich auch für AMD CPUs?), während das acpi_ibm auch andere sensible Stellen misst, z.B. Northbridge oder GPU. Wenn man acpi_ibm zum steuern des Lüfters nimmt, kann man auch seine Sensor-Funktion nutzen. Gibts eigentlich auch andere Lüftersteuerungen, für andere Systeme? Unter Linux gibt's z.B. auch ein Modul für Acer Notebooks.
 
Es gibt für Apple Rechner macfanctld. Da der Portbetreuer asmc(4) nicht updated, funktioniert es auf neueren Modellen nicht mehr (Apple steuer so ziemlich alles ... Lüfter, Tastaturbeleuchtung usw. ... über den System Management Controller). powerd funktioniert zwar, aber es lassen sich keine Temperaturen auslesen.
 
Das hab ich doch weiter oben schon mal geschrieben. Dem fehlt die Hysterese. Und außerdem reagiert er nur auf die Coretemp-Temperaturen, nicht auf die anderen im Thinkpad verbauten Sensoren.

Das mit der Hysterese konnte ich nicht finden, aber ist ja auch deine Sache. Ich hätte höchstens gedacht, dass der Code eine sauberere und einfachere Ausgangslage geben würde als Tkinkfan.
Die richtigen Sensoren sollten sich ja mit dem Abändern weniger MIBs auslesen lassen, da sehe ich kein Problem.
 
Das "weiter oben" war im Vorgänger-Thread, wo wir auch schon diskutiert hatten. ;)

Neben dem Punkt mit der Hysterese hat Thinkfan auch den Vorteil dass es eben viele Sensoren parallel prüfen kann, auch mit unterschiedlichen Schaltschwellen (die GPU verträgt vielleicht eine andere Temperatur als die CPU, usw.). Und dann ist da noch eine Logik drin die ich noch nicht so ganz verstehe wie sie tickt: bei schnellen Temperaturänderungen wird das Abfrageintervall dynamisch kürzer gemacht, um bei schnellen Temperaturanstiegen schneller reagieren zu können. Die Features von Thinkfan sind schon ganz nett, nur der Code gehört halt mal überarbeitet.
 
coretemp misst halt nur die CPU (geht das eigentlich auch für AMD CPUs?), während das acpi_ibm auch andere sensible Stellen misst, z.B. Northbridge oder GPU. Wenn man acpi_ibm zum steuern des Lüfters nimmt, kann man auch seine Sensor-Funktion nutzen. Gibts eigentlich auch andere Lüftersteuerungen, für andere Systeme? Unter Linux gibt's z.B. auch ein Modul für Acer Notebooks.
Ja, aber leider zeigt acpi_ibm bei den neueren Thinkpad-Modellen (wie meinem X230) keine Termperaturen mehr an. :(
 
Und dann ist da noch eine Logik drin die ich noch nicht so ganz verstehe wie sie tickt: bei schnellen Temperaturänderungen wird das Abfrageintervall dynamisch kürzer gemacht, um bei schnellen Temperaturanstiegen schneller reagieren zu können.
Das macht regelungstechnisch gar keinen Sinn.
 
Zurück
Oben