Frage

Ich habe einen Linux-Gerätetreiber für ein PCI-Gerät geschrieben. Diese Vorrichtung führt eine DMA-Operationen. Ein Problem entsteht, wenn das Programm stürzt ab, wenn eine DMA-Operation ausgeführt wird.

Wenn nämlich abstürzt, wird die device_remove() Funktion vom System aufgerufen (als ob close() genannt wurden). Diese Funktion führt die Bereinigung auf den Speicherbereichen von dem PCI-Gerät verwendet wird, befreit korrekt die zugewiesenen Speicher. Ich meine, es richtig unter normalen Umständen funktioniert.

Aber wenn ein DMA läuft, wenn es tatsächlich beenden, es wird nicht in der Lage sein, die DMA-Bereinigung durchzuführen, da sie keinen Zugriff mehr auf die Gerätedaten, die freigegeben wurden. Eine einfache Lösung wäre in der close () Funktion warten. (Das ist mein Verständnis, aber vielleicht der letzte Teil der DMA-Funktion wird nie ausgeführt?)

Ist es eine gute Idee zu jammern für die DMA zu beenden, tatsächlich in den device_remove() (aka close()) Funktion eines Gerätetreiber? Gibt es andere Mittel mit diesem Problem umgehen?

War es hilfreich?

Lösung

Ja, warten sollte funktionieren, aber:

Wenn Sie zu Testplötzliches Entfernen Verhalten Ihres PCI-Geräts versuchen, denke ich, ein Anruf () entfernen sollte fehlschlagen, wenn Sie DMA auf vom Gerät zu / haben werden. Auch ich glaube nicht, close () kann auf die gleiche Weise wie remove () behandelt werden. Letzteres wird vollständig alle gerätebezogenen Datenstrukturen aus dem Speicher entfernen (zum Beispiel: siehe einen des Netzwerk-Gerätetreiber). Also, mit anderen Worten, was ich bin versucht zu sagen ist: wait () auf close () aber nicht () auf remove ()

Auch je nach Ihrer Situation, könnte man auch einen Blick auf Referenzzählung der gerätebezogenen Ressourcen frei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top