Ich habe ein benutzerdefiniertes Board, auf dem ein Marvell 3700 mit aktiviertem SMP ausgeführt wird. Aufgrund von Treiberanpassungen musste ich einen Spinlock in die Funktion ndo_start_xmit (TX-Funktion) des Treibers implementieren, um zu verhindern, dass die beiden Kerne miteinander konkurrieren. (Meine Treiberanpassung verwendet einige gemeinsam genutzte Variablen, die nicht vermieden werden können.)

Beim Testen mit iperf3 und TCP stelle ich oft fest, dass eine Schnittstelle hängt und nicht mehr sendet. Dies geschieht nicht immer, sondern nur nach anhaltendem Iperf. Die ifconfig-TX-Statistik der Schnittstelle erhöht sich nicht, wenn ich versuche, einen Host auf dieser Schnittstelle zu pingen. Ich denke, was passiert ist, dass die Skbs nicht in einem Race-Zustand zwischen 2 Kernen freigegeben werden, was dazu führt, dass die Skbs irgendwann erschöpft werden.

Ich habe XPS versucht, indem ich für alle Schnittstellen und TX-Qs echo 1> / sys / class / net / ethX / queues / txN / xps_cpus gesetzt habe. Mein Verständnis war, dass jeder dieser TX-Qs von der CPU Nr. 1 bedient werden würde, was den Rennzustand verhindern sollte. Ist das korrekt? Alle anderen Vorschläge / Hinweise wären hilfreich.

Vielen Dank.

Schnellvorlauf
quelle