f.zz.de
posts /

SMP mit unterschiedlicher Cache Linesize

Posted Tue 13 Sep 2016 06:40:17 PM CEST Florian Lohoff
in

Von Fefe - Sehr spannender Bug. Mono Apps crashen randommäßig wenn sie auf BIG.little ARM SOCs laufen. BIG.little Architekturen kann man sich so vorstellen als würde man eine Multicore CPU bauen die zum einen Intel Xeons drauf hat und zum anderen Intel Mobile Celerons. Je nachdem wieviel Power das System braucht schaltet man dann die Cores ab. Wenn also das Phone im Standby ist läuft nur ein "little" core und sobald man das Telefon aufweckt werden 2-3 BIG cores gestartet die das Screen rendering übernehmen und die ganzen Apps befeuern.

Der Linux Kernel scheduled dann die Apps auf den Cores wie sie es halt brauchen. Wenn eine App ihre Timeslice immer schön aufbraucht wird sie irgendwann vom little auf den BIG core verschoben.

Jetzt gibt es "atomic" primitiven oder stack trampolines die davon ausgehen das es eine bestimmte cache linesize gibt. Wenn ich also einen stack trampoline erzeuge oder einen atomic Bereich schreibe muss ich dann mit Instructions dafür sorgen das die Cacheline zurückgeschrieben wird.

Wenn ich also von einer 64byte Cacheline ausgehe - Der Stack trampoline 40 byte hat und ich die Cacheline zurückschreibe gehe ich davon aus das alles aus dem D-Cache im Speicher landet und dann mit einem I-Cache invalidate alles neu gefetched wird. Wenn ich jetzt aber plötzlich auf einem "little" System bin das eine kleinere cacheline size hat, sagen wir mal 32 byte, dann flushe ich die letzten 8 byte meines Stack trampolines nicht in den Speicher und invalidiere auch 8 byte zu wenig im I-Cache. Führt dazu das wenn ich das dann ausführe die letzten 8 byte quasi "random" content haben.

Beliebig fies das zu finden.

Aber so ist das halt wenn SMP eben nicht mehr Symmetric ist.

http://www.mono-project.com/news/2016/09/12/arm64-icache/