2014-01-07 4 views
5

Viele Anleitungen zur Gerätetreiber-Programmierung legen nahe, dass das Streaming von DMA-Zuordnungen (dh von dma_map_single() und Freunden) so kurz wie möglich offengehalten wird, da sie Ressourcen verbrauchen (dh IOMMU-Zuordnungsressourcen, wenn die Plattform einen oder hat) ein Bounce-Puffer, wenn erforderlich).Linux Kernel: Ist es in Ordnung, ein Streaming-DMA-Mapping unbegrenzt offen zu lassen?

In meinem Fall arbeite ich mit einem PCIe-Gerät, das 64-Bit-DMA unterstützt, daher sollte ein Bounce-Buffer nicht notwendig sein (und es scheint auch keine spezielle Behandlung von der IOMMU erforderlich zu sein, richtig?). Die Daten kommen vom Gerät (d. H. Es ist mit DMA_TO_CPU abgebildet), und das Gerät benachrichtigt mich, wenn neue Daten über Interrupt verfügbar sind. An diesem Punkt trigger ich einen dma_sync_for_cpu(), bevor ich auf die Daten zugreife, die mir gerade gesendet wurden.

Gibt es andere Gründe, warum ich das Mapping nicht auf unbestimmte Zeit offen lassen sollte (bis der Datenverbraucher natürlich heruntergefahren wird)?

+0

Ich denke, dass diese beiden Situationen nur Beispiele sind. Lässt sich der geöffnete DMA möglicherweise mit anderen Anwendungen über den PCI-Bus in Konflikt bringen? Nur ein Gedanke. – prmottajr

+0

Wenn das PCIe-Gerät im DMA-Modus arbeitet, habe ich keine andere Wahl, als dieses Mapping beizubehalten, während das Gerät in Betrieb ist. –

+0

Es ist eine lange Zeit her, seit ich irgendeine DMA-Arbeit gemacht habe, also leugne emptor. Ist es möglich, dass die DMA-Engine Ihrer Geräte für den Fall, dass sie nicht für Ihr Gerät verwendet wird, für einige Vorgänge außerhalb des Geräts (z. B. eine Kopie zwischen Arbeitsspeichern) reserviert ist? – Speed8ump

Antwort

1

Ich habe mindestens eine Instanz in den Linux-Kernel-Quellen gefunden, wo ein Streaming-DMA-Mapping kann für eine unbestimmte Zeit offen gelassen werden:

im FireWire-Treiber-Code für isochronen DMA Handling (drivers/firewire/core-iso.c), Eine DMA-Zuordnung wird erstellt, wenn Benutzerbereich mmap() aufruft. Offenbar bleibt diese Zuordnung so lange geöffnet, wie der Benutzerbereich das Gerät geöffnet hält.

Verwandte Themen