Nel kernel Linux 6.0, il cui rilascio è previsto per lunedì prossimo, è stata adottata una modifica che risolve i problemi di prestazioni dei sistemi basati su processori AMD Zen. La causa del calo delle prestazioni è stato un codice aggiunto 20 anni fa per aggirare un problema hardware in alcuni chipset. Il problema hardware è stato da tempo risolto e non si manifesta nei chipset attuali, ma il vecchio workaround è stato dimenticato ed è diventato una fonte di diminuzione delle prestazioni sui sistemi con i moderni CPU AMD. Le nuove sistemi con CPU Intel non sono interessati dal vecchio workaround, poiché in esse l'accesso all'ACPI avviene tramite un driver separato intel_idle, anziché attraverso il driver comune processor_idle.
Il workaround è stato aggiunto al kernel nel marzo 2002 per bloccare l'emergere di un errore nei chipset, legato alla mancanza di un corretto stato di inattività (idle) a causa di un ritardo nel trattamento del segnale STPCLK#. Per aggirare il problema nell'implementazione dell'ACPI, è stata aggiunta un'istruzione WAIT che rallentava il processore per consentire al chipset di passare correttamente allo stato di inattività. Durante il profiling utilizzando le istruzioni IBS (Instruction-Based Sampling) sui processori AMD Zen3, è emerso che il processore trascorre una quantità significativa di tempo eseguendo un fill, che porta a una scorretta interpretazione dello stato di carico del processore e all'impostazione di modalità di sonno più profonde (C-State) da parte del gestore cpuidle.
Questo comportamento si riflette in una diminuzione delle prestazioni sotto carichi in cui alternano frequentemente stati di inattività (idle) e attività (busy). Ad esempio, utilizzando una patch che disabilita il workaround, i punteggi medi del test tbench aumentano da 32191 MB/s a 33805 MB/s.
Fonte: opennet.ru
