Linux 7.3 apvienošanas logā 21. augustā parādījās ielāps Intel Xe grafikas draiverim, ko uzrakstīja un pats iesūtīja Linuss Torvalds. Pati izmaiņa ir viena vārda gara: funkcijā get_flat_ccs_offset() round_up() vietā tagad stāv round_down(). Lai līdz tai nonāktu, vajadzēja 24 atkļūdošanas ielāpus un 18 kodola startus.
Torvalds grafikas draiverus labo reti. Šoreiz iemesls bija viņa paša dators ar Battlemage G21 karti un 16 GiB video atmiņas, kur pēc katras aukstās startēšanas ekrāns palika melns, kaut visa pārējā sistēma strādāja.
ko draiveris atdeva atmiņas sadalītājam
get_flat_ccs_offset() no aparatūras nolasa saspiešanas metadatu apgabala (flat CCS) sākuma adresi, pareizina to ar ieslēgto L3 mezglu skaitu un noapaļo rezultātu uz augšu līdz 128 KB. Viss, kas atrodas zem šīs adreses, tiek nodots VRAM sadalītājam kā izmantojama atmiņa.
Tur arī slēpjas kļūda. Adrese nozīmē “šeit izmantojamā atmiņa beidzas”. Kad tādu adresi noapaļo uz augšu, starpība starp īsto sākumu un noapaļoto vērtību sadalītāja acīs kļūst par brīvu atmiņu. Torvalda kartē tā nav 128 KB robežā: nolasītā bāze ir 0x3fafff800, noapaļotā 0x3fb000000. Starp tām ir 2 KB.
Tas nozīmē, ka lapas 0x3fafff000 pēdējie 2 KB ir CCS krātuve, kas nonākusi sadalītāja pūlā. Ko vien tur ieliktu, saspiešanas aparatūra šo asti pārraksta. Tai nav vajadzīgs ne lapu tabulas ieraksts, ne bufera objekts, ne GPU uzdevums. Tā to izdara vēl pirms startē pirmais lietotāja telpas process.
kā no diviem kilobaitiem izauga melns ekrāns
Uz Torvalda mašīnas tieši šajā lapā katrā aukstajā startēšanā nokļuva Mesa virtuālās mašīnas trešā līmeņa lapu tabula. Tā pazaudēja ierakstu, kas apraksta kompozitora batch bufera apgabalu. Kompozitora pirmais uzdevums avarēja, mēģinot nolasīt savu batch buferi. Gdm to startēja atkal un atkal. Iznākums ir melns ekrāns uz datora, kas citādi strādā.
Gdm pārstartēšana ar roku simptomu novērsa, jo nākamās virtuālās mašīnas lapu tabulas jau tika izvietotas citur. Tas paskaidro arī, kāpēc kļūda tik ilgi palika neatrasta. Tā izlec tikai tad, kad sakrīt konkrēts atmiņas apjoms, konkrēts L3 mezglu skaits un konkrēta izvietošanas secība pēc aukstās startēšanas.
Kad rezervētā lapa pēc labojuma tika nolasīta, tajā bija redzams, kas to rakstīja: vērtības 0xcccc000000000000 un 0xcc77000000000000, saspiešanas metadati ar diviem baitiem uz katriem sešpadsmit.
pārbaude, kas nevarēja nostrādāt
Draiverī bija apgalvojums, kuram vajadzēja tieši šo situāciju noķert. Tas salīdzināja nobīdi ar GSMBASE - ccs_size uz vienādību. Šī vērtība vienmēr ir 128 KB robežā, tāpēc tā sakrita ar uz augšu noapaļoto nobīdi tieši tajos gadījumos, kad īstā bāze robežā nebija. Pārbaude nevarēja nostrādāt tajā vienā situācijā, kurai tā bija radīta. Turklāt bez CONFIG_DRM_XE_DEBUG tā vispār netika kompilēta.
Jaunais apgalvojums pārbauda citu lietu: offset + ccs_size nedrīkst pārsniegt GSMBASE. Noapaļošana tagad iet uz leju līdz 4 KB, tas ir, līdz lapas izmēram, ar kuru strādā sadalītājs. Uz Torvalda kartes tas izslēdz tieši vienu lapu.
ko šeit izdarīja AI
Komitēšanas ziņojumu draiverim uzrakstīja AI. Torvalds to atzīst un beigās pieliek savu piezīmi kvadrātiekavās:
Šī bija atkļūdošanas sesija no elles, kurā milzīgu palīdzību sniedza AI, izdarot lielu daļu rutīnas darba. Es to labprāt sauktu par savu nenogurdināmo palīgu, bet AI vairākas reizes tieši pateica, ka tas ir neiespējami un neatrisināmi un ka mums vienkārši vajadzētu par to uzrakstīt atskaiti. Man ir aizdomas, ka šīs lietas ir apmācījuši cilvēki, kuri varbūt nav tik stūrgalvīgi kā es.
Torvalds piebilst, ka AI, lai gan vairākkārt bija gatavs padoties, turpināja pievienot atkļūdošanas kodu un godprātīgi analizēt rezultātus, kad viņš uzstāja. Tas ir diezgan precīzs apraksts tam, ko šis darbs prasīja: pielikt vēl vairāk izvades, pārstartēt kodolu, izlasīt, ko tas izmeta. Divdesmit četras reizes.
kļūda ir tikpat sena kā funkcija
Fixes rinda norāda uz 2024. gada 16. septembra ielāpu, ko rakstīja Intel inženieris Metjū Aulds. Tas noapaļošanu uz augšu ieviesa apzināti, atsaucoties uz Intel specifikāciju BSpec 68023: programmatūrai nobīde jānoapaļo uz augšu līdz tuvākajiem 128 KB, ja tā jau nav robežā. Aulda ielāps pats bija labojums vēl vecākam aprēķinam un tika sūtīts uz stabilajiem zariem no 6.10 versijas. Kļūdainā rēķināšana tātad ir bijusi izlaistajos kodolos gandrīz divus gadus. Torvalda labojums arī ir atzīmēts stabilajiem zariem.
Šis nav vienīgais stāsts par AI šajā apvienošanas logā. Tīkla apakšsistēmas uzturētājs Jakubs Kicinskis, sūtot 632 ielāpus net kokā un 648 net-next kokā, rakstīja, ka komanda ir pilnībā pārslogota un ka aptuveni trešdaļa līdz puse net-next ielāpu izskatās pēc zemas prioritātes labojumiem un koda tīrīšanas, ko sagatavojis AI. Kicinskis negrasās tos noraidīt. Viņa plāns ir pašam sākt lietot Meta piešķirtos modeļus ielāpu pārvaldībai un komitēšanas ziņojumu rediģēšanai.
Divas dažādas ainas no vienas nedēļas. Vienā AI 18 startu garumā izseko vienu lapu 16 gigabaitos, jo cilvēks atteicās to laist vaļā. Otrā AI ģenerē tūkstošiem rindu kosmētisku labojumu, kas cilvēkiem jāizlasa. Torvalda labojums skar vienu failu, drivers/gpu/drm/xe/xe_vram.c: 18 pievienotas rindas un 5 izņemtas.
Avoti
- drm/xe: Don’t hand out the flat CCS storage as usable VRAM (Linux kodola komitējums 818bebeb63dd)
- Linus Torvalds Endures A Debug Session From Hell, “Enormously Helped” By AI (Phoronix)
- drm/xe/vram: fix ccs offset calculation (Metjū Aulds, 2024. gada septembris)
- Linux 7.3 Network Changes Merged But Developers “Completely Overwhelmed” Due To AI/LLMs (Phoronix)
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.