
La compilazione del kernel Linux rappresenta da sempre una delle attività più impegnative per sviluppatori, manutentori e distribuzioni che devono produrre numerose varianti del sistema operativo. Con configurazioni particolarmente estese e processori dotati di decine o centinaia di core, però, non sempre la potenza hardware disponibile viene sfruttata in modo efficace.
Un nuovo insieme di 23 patch, inviato alla mailing list del kernel Linux da un ingegnere ARM, affronta proprio questo problema. Il lavoro è stato realizzato con l’assistenza di una LLM utilizzata per individuare i principali colli di bottiglia della compilazione e proporre una prima implementazione delle ottimizzazioni.
Il risultato è particolarmente interessante perché non riguarda un semplice miglioramento del compilatore. Gli interventi agiscono direttamente su diversi componenti dell’infrastruttura di build del kernel, cercando di ridurre le operazioni seriali e distribuire meglio il lavoro tra i thread disponibili.
Secondo i test pubblicati dall’autore, la compilazione completa allmodconfig può beneficiare di una riduzione dei tempi fino al 36%. Il risultato migliore è stato registrato su una macchina con due processori AMD EPYC 9754 e 256 core complessivi, utilizzando GCC.
Anche un sistema con Threadripper 9980X mostra miglioramenti importanti: il tempo necessario passa da circa 345 secondi a 275 secondi con GCC, mentre con Clang si scende da circa 345 a 266 secondi.
Ancora più interessante è il comportamento delle compilazioni successive alla prima. Quando è necessario ricompilare soltanto una parte del kernel dopo una modifica, il risparmio può arrivare intorno al 70%. Nel caso del Threadripper, una compilazione incrementale allmodconfig passa da 46,4 a 15,3 secondi.
Le ottimizzazioni coinvolgono kbuild, kallsyms, modpost e Rust
Il cuore del progetto riguarda soprattutto le fasi della compilazione che tendono a essere eseguite in modo seriale. Su workstation moderne con molti core, queste operazioni possono diventare un vero collo di bottiglia: mentre una parte del sistema lavora su un singolo thread, numerosi core rimangono inutilizzati.
La LLM coinvolta nel progetto ha contribuito a individuare queste aree problematiche e a produrre una prima versione del codice. L’autore ha però sottolineato apertamente che una parte significativa del codice generato non era adatta a essere inviata direttamente al kernel e ha quindi riscritto e verificato manualmente numerosi componenti.
Gli interventi interessano 47 file, con 2.884 righe aggiunte e 682 rimosse. Tra le modifiche più importanti troviamo:
mksysmapviene riscritto in C, mentrekallsymspuò leggere direttamente la tabella dei simboli ELF evitando passaggi attraversonm;kbuildconserva maggiori informazioni nella cache e riduce il numero di verifiche ripetute durante la compilazione;modpostutilizza una gestione più efficiente degli hash e calcolasrcversionin parallelo;- i descrittori dei moduli vengono generati tramite codice assembly invece di passare da una fase C più costosa;
objtoolriduce il lavoro associato alle informazioni DWARF e può elaborare oggetti di grandi dimensioni utilizzando più thread;- la compilazione del codice Rust viene sovrapposta a quella del codice C;
- alcune fasi iniziali di
rustcvengono parallelizzate; - quando disponibile,
pigzpuò essere utilizzato per la compressione al posto digzip.
L’obiettivo generale è quindi sfruttare meglio le moderne CPU multicore senza modificare il risultato finale prodotto dalla compilazione.
Un dettaglio particolarmente significativo riguarda le build senza alcuna modifica al codice sorgente. Su EPYC con GCC, il tempo di un nuovo make dopo una compilazione completata scende da 25,92 a soli 1,52 secondi. Sul Threadripper si passa invece da 12,97 a 1,18 secondi. In questi casi il miglioramento raggiunge rispettivamente circa il 94% e il 91%.
Le patch includono inoltre una correzione relativa a mksysmap e kallsyms, dove un cambiamento nel formato dei simboli MODULE_INFO() aveva impedito a una precedente espressione regolare di filtrare correttamente alcune voci. Secondo l’analisi allegata alle patch, il problema introduceva migliaia di simboli aggiuntivi nelle tabelle kallsyms delle configurazioni interessate.
Il lavoro è stato testato su diverse architetture, tra cui x86, arm64, arm, RISC-V, PowerPC64, s390 e LoongArch. Sono stati inoltre eseguiti test con QEMU e verifiche sul caricamento e scaricamento dei moduli.
Tutte le patch riportano il tag Assisted-by: LLM, in linea con le indicazioni del progetto Linux per il codice sviluppato con l’aiuto di strumenti basati sull’intelligenza artificiale. La responsabilità finale rimane però in capo allo sviluppatore umano, che deve verificare codice, licenza, correttezza e comportamento delle modifiche.
Il set non è ancora stato sottoposto alla normale revisione necessaria per l’integrazione nel kernel Linux. Non è quindi ancora possibile sapere in quale versione futura del kernel potranno eventualmente arrivare queste ottimizzazioni. Il lavoro rappresenta comunque un esperimento interessante: l’IA non viene utilizzata soltanto per scrivere codice, ma anche per analizzare una procedura complessa, individuare colli di bottiglia e suggerire interventi capaci di sfruttare meglio l’hardware moderno.