2016-04-05 4 views
0

Angenommen, Sie haben ein PCIE-Gerät, das einen einzelnen BAR- und einen DMA-Bereich darstellt, der mit pci_alloc_consistent (..) deklariert wurde. Die Flags der BAR geben nicht speicherbare Speicherbereiche an, die nicht im Cache gespeichert werden können.Latenz in ioread

Was sind die Hauptursachen für die Latenz beim Lesen des DMA-Bereichs und was sind die Ursachen für die Latenz beim Lesen des BAR?

Vielen Dank für die Beantwortung dieser einfachen Frage: D!

Antwort

1

Das riecht ein wenig wie Hausaufgaben, aber ich vermute, dass die Konzepte von vielen nicht gut verstanden werden, also werde ich eine Antwort hinzufügen.

Der beste Weg, um darüber nachzudenken, ist zu überlegen, was passieren muss, damit ein Lesevorgang abgeschlossen ist. Die CPU und das Gerät befinden sich auf separaten Seiten der PCIe-Verbindung. Es ist hilfreich, PCI-Express als Mini-Netzwerk anzusehen. Jeder Link ist Punkt-zu-Punkt (wie Ihr PC mit einem anderen PC verbunden). Es kann auch Zwischenschalter (aka Brücken in PCI) geben. In diesem Fall ist Ihr PC mit einem Switch verbunden, der wiederum mit dem anderen PC verbunden ist.

Wenn also die CPU ihren eigenen Speicher lesen möchte (die "DMA" -Region, die Sie zugewiesen haben), ist sie relativ schnell. Es hat einen Hochgeschwindigkeitsbus, der entworfen wurde, um das schnell zu machen. Außerdem sind mehrere Cachespeicher integriert, um häufig verwendete Daten (oder kürzlich) in der Nähe der CPU zu halten.

Wenn die CPU jedoch vom BAR im Gerät lesen möchte, muss die CPU (eigentlich der mit der CPU integrierte PCIe-Root-Komplex) eine PCIe-Leseanforderung erstellen, die Anforderung senden und warten, während das Gerät die Anforderung decodiert , greift auf den BAR-Standort zu und sendet die angeforderten Daten zurück. Tick ​​Tack. Ihre CPU tut nichts anderes, während sie darauf wartet, dass dies abgeschlossen wird.

Dies ist so ziemlich analog zu einer Webseite von einem anderen Computer zu fragen. Sie formulieren eine HTTP-Anfrage, senden diese und warten, bis der Webserver auf den Inhalt zugreift, formuliert ein Rückpaket und sendet es an Sie.

Wenn das Gerät auf Speicher zugreifen möchte, der sich in der CPU befindet, ist es genau das Gleiche. ("Direkter Speicherzugriff" bedeutet nur, dass es die CPU nicht unterbrechen muss, um damit umzugehen, aber etwas [der Wurzelkomplex hier] ist immer noch verantwortlich für das Decodieren der Anfrage, das Erfüllen des Lesens und das Zurücksenden der resultierenden Daten.)

Wenn Zwischen-PCIe-Switches zwischen CPU und Gerät vorhanden sind, können diese zusätzliche Puffer-/Warteschlangenverzögerungen hinzufügen (genau wie ein Switch oder Router in einem Netzwerk). Und solche Verzögerungen werden verdoppelt, da sie in beiden Richtungen entstehen.

Natürlich ist PCIe sehr schnell, das alles passiert in wenigen Nanosekunden, aber das ist immer noch Größenordnungen langsamer als ein "lokaler" Lesevorgang.

+0

Gil danke für die Antwort. Ich hatte nicht gewürdigt, dass ein BAR nicht der tatsächliche Speicher ist, sondern nur eine Adresse für den Root-Komplex, um ein TLP für das Gerät zu generieren und das Lesen von BARs aus der CPU ist also immer eine nicht gepostete Angelegenheit. Gibt es eine Möglichkeit, ein Ioread als nicht unterbrechbar zu definieren, da ein Lesevorgang in den meisten Fällen 2 us dauert, in manchen Fällen aber 15 ms. Dies könnte eine Aufgaben-Vorbelegung sein, wie auch in dem Bereich des HZ-Werts, der 100 ist (single task isolated cpu). Ich wäre glücklich mit 10usec, aber nicht 15ms: D. – toomanychushki

+0

Ein einziges Lesen der BAR ist nicht unterbrechbar (zumindest bei jeder Architektur, an der ich gearbeitet habe). Sie machen nur eine Ladeanweisung aus der Sicht der CPU. Der Interrupt wird nicht mitten in einer Maschinenanweisung erkannt. Die Frage ist also: Wohin geht die Zeit? Ich würde zuerst herausfinden, auf welcher Seite die Verzögerung ist.Könnte vielleicht den Zeitstempel-Zähler (oder was auch immer in Ihrem Arch vorhanden ist) vor und nach dem Lesen lesen, um herauszufinden, wie lange die eigentliche PCIe-Transaktion dauert - mit Unterbrechungen, die für die gesamte Sequenz deaktiviert sind. –