2016-07-08 27 views
-2

Ich arbeite an Kontrollsystem Zeug, wo der NIC-Interrupt als Auslöser verwendet wird. Dies funktioniert sehr gut für Zykluszeiten von mehr als 3 Mikrosekunden. Nun möchte ich einige Leistungstests durchführen und die Übertragungszeit bzw. die kürzeste Zeit zwischen zwei Interrupts messen.RealTek 8168 (r8169 Linux-Treiber) - Rx-Deskriptor Ring Verwirrung

Der Absender sendet 60-Byte-Pakete so schnell wie möglich. Der Empfänger sollte einen Interrupt pro Paket generieren. Ich teste mit 256 Paketen die Größe des Rx-Deskriptor-Rings. Die Paketdaten werden während des Tests nicht behandelt. Nur der Interrupt ist interessant.

Das Problem ist, dass der Empfang zwischen zwei Unterbrechungen sehr schnell bis zu weniger als 1 Mikrosekunde ist, aber nur für etwa 70 Unterbrechungen/Deskriptoren. Dann setzt die NIC das RDU-Bit (Rx Descriptor Unavailable) und stoppt den Empfang, bevor das Ende des Rings erreicht wird. Die verwirrende Sache ist, wenn ich die Größe des Rx-Deskriptorrings auf bis zu 2048 (z.B.) vergrößere, dann steigt auch die Anzahl der Unterbrechungen (um 800). Ich verstehe dieses Verhalten nicht. Ich dachte, er sollte nach 70 Unterbrechungen wieder aufhören.

Es scheint ein Zeitproblem zu sein, aber warum? Ich übersehe etwas, aber was? Kann mir jemand helfen?

Vielen Dank im Voraus!

Antwort

0

Was ich denke ist, dass aufgrund Ihrer großen RX-Paketrate Ihre Empfangsinterrupts fehlen. Zählen Sie keine Interrupts, um zu sehen, wie viele Pakete empfangen werden. Gehen Sie nur auf "eigenes" Bit von Empfangsdeskriptoren. Receive Descriptor unavailable wird nur eingestellt, wenn das Ende des Ringes erreicht wird, außer Sie haben einen Fehler bei der Programmierung von RX-Deskriptoren gemacht (zB vergessen, das Ownership-Bit zu setzen) Wenn Ihr RX-Ring 256 Deskriptoren hat, sollten Sie 256 Pakete erhalten ohne RX-Deskriptoren zu recyceln. Wenn Sie zweifelhaft sind, ob Sie das Ende des Klingelns erreichen oder nicht, versuchen Sie, das Interrupt-Bit des letzten RX-Deskriptors zu setzen. Auf diese Weise erhalten Sie nur einen Interrupt am Ende des Rings.

+0

Danke, Sie haben Recht! Ich erkannte, dass das PCIe-System zu langsam ist, die Latenz ist zu hoch. Der Empfang der Pakete ist zu schnell, daher ist der Deskriptorring voll, bevor der Besitz geändert werden kann. – Billy

+0

Das ist toll! @ Billy – Adi06411