
A Linux 6.18 fejlesztése a végéhez közeledik, és a vasárnapra várt első kiadásjelölt (Linux 6.18-rc1) előtt még egy fontos x86-os javításcsomag is beolvadásra került. Ebbe a frissítésbe bekerült egy Retpoline-optimalizáció is, amelyet kifejezetten az Intel E-magok (E cores) hatékonyabb működése érdekében készítettek. A módosítást Peter Zijlstra, az Intel egyik vezető fejlesztője készítette, és az x86 architektúra magkódját (x86 core code) érinti.
Mi az a Retpoline és miért fontos?
A Retpoline (return trampoline) technológia a Spectre Variant 2 sebezhetőség elleni védekezés része. Ez a biztonsági hiba a spekulatív utasításvégrehajtás (speculative execution) mellékhatásait használta ki, és évekkel ezelőtt komoly biztonsági rést jelentett az Intel és AMD processzoroknál.
A Retpoline lényege, hogy az indirekt hívásokat (indirect calls) úgynevezett „visszatérési ugrásokon” (return trampolines) keresztül hajtja végre, ezzel elkerülve a spekulatív végrehajtásból adódó adatkiszüremléseket. Bár a módszer biztonságos, teljesítményveszteséggel járhat, különösen olyan CPU-kon, amelyeknél a mikrokód (microcode) vagy a vezérlési prefixek (instruction prefixes) dekódolása lassabb.
Az új optimalizálás célja
Peter Zijlstra a mostani patchben a patch_retpoline() függvény működését optimalizálta a Linux kernelben. A módosítás célja, hogy a Retpoline utasításláncok felesleges NOP (no operation) utasításait elhagyja, ezáltal csökkentve a végrehajtási ciklusokat az Intel E-magok (Atom architektúra) esetében.
A fejlesztő a változtatást így magyarázza:
„A gyakori retpoline minta – például CS CALL __x86_indirect_thunk_r11 – a CALL *R11; NOP3 formára alakul át az eIBRS/BHI_NO architektúrákon.
Felismertük, hogy a CS prefix beillesztése lehetővé teszi a felesleges NOP eltávolítását. Ugyanakkor figyelni kell arra, hogy ne alkalmazzunk túl sok prefixet, mivel a prefix-dekódolás költsége több ciklust is igénybe vehet.”
Zijlstra hozzátette, hogy az E-magok esetében (vagyis az Atom típusú CPU-knál) jellemzően prefix-dekódolási késleltetések lépnek fel, míg a P-magok (Performance cores) általában mentesek ettől. A Linux kernel kódjának azonban a hibrid architektúrákhoz kell igazodnia, ezért az optimalizálásnak mindkét magtípushoz megfelelőnek kell lennie.
Technikai részletek és kiegészítések
A javítás több technikai módosítást tartalmaz a Retpoline implementációjában. Ha az utasításlánc egy tail-call (azaz utolsó függvényhívás), akkor a JMP *%reg utasítást mostantól egy INT3 utasítás követi, ami a straight-line speculation mitigation része – vagyis megakadályozza, hogy a CPU a következő utasítást spekulatívan előre végrehajtsa.
Zijlstra a levelezőlistán megjegyezte, hogy a pontos prefix-dekódolási késleltetések meghatározása az eIBRS/BHI_NO architektúrákon „nem túl szórakoztató”, és többféle mikroarchitektúrához (microarchitecture) kellett igazítani az optimalizálást. A fejlesztő ironikusan így zárta kommentárját:
„Utálom az egészet.”
A Retpoline-optimalizáló javítás bekerült a Linux Git főágába az x86/core pull request részeként. Ez azt jelenti, hogy a Linux 6.18-rc1 már tartalmazni fogja az új Retpoline-kezelést, amely hatékonyabb futást biztosít az Intel E-magokat használó hibrid processzorokon, például az Alder Lake, Raptor Lake és az újabb Meteor Lake CPU-kon. A változtatás jól példázza, hogyan próbál a Linux kernel-közösség egyensúlyt találni a biztonsági mitigációk és a teljesítménymegőrzés között – különösen a modern, heterogén architektúrák világában, ahol a P- és E-magok közös optimalizálása komoly kihívást jelent.
