Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Technologie

Jádro Linuxu obchází chybu procesorů Zen 5 druhým zavoláním instrukce TLBSYNC

Procesor Zen 5 nemusí při dvojici instrukcí INVLPGB a TLBSYNC zneplatnit záznam ve vyrovnávací paměti překladů TLB. Linus Torvalds začlenil 11. října 2026 obezličku: jádro se podívá do CPUID, jestli chybu opravuje mikrokód, a kde ji neopravuje, pošle TLBSYNC ještě jednou.

· 119 zhlédnutí

Rozptylovač tepla procesoru AMD Ryzen 9 9950X s popisem typu
Rozptylovač tepla procesoru AMD Ryzen 9 9950X s popisem typu. Foto: 4300streetcar, Wikimedia Commons (CC BY 4.0)

Linus Torvalds začlenil 11. října 2026 do hlavní větve jádra balík oprav x86-urgent-2026-10-11 od Inga Molnára. Je v něm jediná položka a zabere třináct přidaných řádků: obezlička pro chybu procesorů AMD Zen 5, kvůli které stroj nemusí zneplatnit záznam ve vyrovnávací paměti překladů TLB, přestože mu to jádro přikázalo. Den nato vyšla verze 7.3-rc7, která už opravu obsahuje.

INVLPGB rozešle příkaz, TLBSYNC čeká na dokončení

Každé jádro procesoru si pamatuje nedávné překlady virtuálních adres na fyzické v malé vyrovnávací paměti TLB. Když operační systém změní stránkovací tabulky, musí staré záznamy zneplatnit i na ostatních jádrech, ne jen na tom svém. Dlouho se to dělalo rozesláním přerušení: každé jádro dostalo zprávu a uklidilo si svůj TLB samo.

AMD na to přidala dvojici instrukcí. INVLPGB rozešle příkaz ke zneplatnění všem jádrům v systému, takže přerušení nejsou potřeba. Instrukce ale podle komentáře ve zdrojovém souboru arch/x86/include/asm/tlb.h nedrží pořadí a víc zneplatnění může probíhat souběžně. Druhá instrukce, TLBSYNC, proto počká, až se všechna zneplatnění vyslaná z téhož jádra dokončí. Bez ní by systém pokračoval dál, zatímco procesor má úklid teprve rozdělaný.

Linux takhle uklízí jaderné překlady od verze 6.15. Patch Rika van Riela x86/mm: Use INVLPGB for kernel TLB flushes se do hlavní větve dostal 19. března 2025 a smyslem bylo zbavit se právě těch přerušení.

Procesor občas záznam nezruší

Popis commitu x86/CPU/AMD: Fix AMD TLBI Erratum #1718 je na dva řádky. Procesor může při vykonávání dvojice INVLPGB a TLBSYNC selhat ve zneplatnění záznamu TLB (v originále „The processor may fail to invalidate a TLB entry while executing an INVLPGB/TLBSYNC instruction pair“). V TLB pak může zůstat překlad adresy, který už neplatí.

Chybu opravuje mikrokód procesoru. Jádro se o tom dozví z CPUID: nový příznak X86_FEATURE_TLBSYNC_SFW_NO odpovídá bitu 4 v registru EAX listu 0x80000021 a jeho komentář v souboru cpufeatures.h zní doslova „TLBI Erratum #1718 fixed in microcode“. Příznak tedy říká, že mikrokód tu opravu obsahuje.

Třináct řádků ve třech souborech

Oprava nemaže ani jeden řádek. V cpufeatures.h přibyly dvě definice, zmíněný příznak a chyba X86_BUG_TLBI. V souboru amd.c dostala funkce init_amd_zen5() tři řádky: umí-li procesor INVLPGB a příznak o opravě v mikrokódu nemá, jádro mu tu chybu nastaví. A v tlb.h pak funkce __tlbsync() u takového procesoru pošle TLBSYNC podruhé.

Rozdíl mezi oběma novými značkami je vidět i zvenčí. Chyba X86_BUG_TLBI má v komentáři uvozený řetězec „tlbi“, takže ji jádro vypíše v řádku bugs v /proc/cpuinfo. Příznak o opraveném mikrokódu uvozený řetězec nemá, a v /proc/cpuinfo se proto neobjeví vůbec. Pravidlo o tom stojí hned v hlavičce téhož souboru.

Koho se to týká

Detekce sedí ve funkci pro Zen 5, takže na starší generace nedosáhne. Podle amd.c jádro mezi Zen 5 řadí procesory rodiny 0x1a s modely 0x00 až 0x2f, 0x40 až 0x4f, 0x60 až 0x7f a 0xd0 až 0xd7; Zen 6 je z téže rodiny, ale má modely jiné a touhle větví neprochází. Druhá podmínka je samotná instrukce INVLPGB, třetí pak zapnutá volba jádra CONFIG_BROADCAST_TLB_FLUSH, bez které se celá dvojice instrukcí nepoužívá.

Záplatu napsal Borislav Petkov z AMD, posoudil ji Rik van Riel a vyzkoušeli ji Lorenzo Stoakes a Rik van Riel. Nese značku Cc: stable@kernel.org, takže má zamířit i do starších udržovaných řad. Seznamy změn jádra 7.2.10 a 6.18.56, obě z 11. října 2026, erratum #1718 nezmiňují.

Zdroje

Technologie

Linux AMD procesory jádro Zen 5

← zpět na výpis