programmatūra · 6 min · 30.08.2026

Mutter atgūstas no GPU atiestatīšanas: 94 mainīti faili, GNOME Shell vēl neatjaunojas

GNOME kompozitors Mutter tagad prot pārdzīvot GPU atiestatīšanu, nenogalinot sesiju. Kods atrodas apvienošanas pieprasījumā !5247, ko 17. augustā atvēra Google Summer of Code dalībnieks Toluwaleke Ogundipe. Tajā ir 36 komiti, kas skar 94 failus: 2314 pievienotas rindas pret 559 izņemtām.

GPU atiestatīšana notiek tad, kad draiveris konstatē iestrēgušu darbu uz grafikas procesora un pilnībā pārstartē ierīci. Visa GPU atmiņā izvietotā informācija tajā brīdī pazūd. Windows šo situāciju apstrādā kopš Vista laikiem ar Timeout Detection and Recovery mehānismu: ekrāns uz mirkli nomirgo, darbvirsma paliek. GNOME sesijā līdz šim tas nozīmēja darba dienas beigas.

Kāpēc atiestatīšana nogalina Wayland sesiju

Mesa radeonsi un amdgpu draiveri apzināti nogalina procesu, ja atiestatīšanas brīdī pastāv nerobusts GL konteksts. Tā kā šis process ir Mutter, līdzi aiziet visa sesija ar visām atvērtajām lietotnēm. Citos draiveros process paliek dzīvs, tikai Mutter turpina zīmēt uz nederīga konteksta. Skartajam GPU pieslēgtie monitori tad iesalst pēdējā kadrā pirms atiestatīšanas. Rezultāts lietotājam ir tāds pats.

X11 sesijā kompozitors ir atsevišķs process blakus X serverim. Ja tas nokrīt, logi paliek, jo klientu savienojumus tur X serveris. Wayland kompozitors pats ir displeja serveris. Katrs klients ir pieslēdzies tieši tam, tāpēc kompozitora nāve aizrauj līdzi visas lietotnes uzreiz. Nesaglabāts darbs pazūd bez brīdinājuma.

Cik bieži tas notiek, atkarīgs no dzelzs un slodzes. amdgpu draiveris ziņo par atiestatīšanu, kad komandu gredzens neatbild noteiktā laikā. Iemesls mēdz būt kļūdains ēnotājs pārlūkprogrammas WebGL saturā, nestabila pārtaktēšana vai vienkārši draivera kļūda konkrētā spēlē. Uz X11 lietotājs tādā gadījumā dabū nomirgojušu ekrānu. Uz Wayland viņš dabū pieteikšanās logu.

Robusts konteksts un GetGraphicsResetStatus

Atklāšana balstās uz OpenGL ES paplašinājumu EXT_robustness un tā EGL pusi EXT_create_context_robustness. Konteksta izveides brīdī tiek uzstādīts EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY ar vērtību EGL_LOSE_CONTEXT_ON_RESET. Pēc tam GetGraphicsResetStatus() atgriež atiestatīšanas statusu tad, kad atiestatīšana ir notikusi. Konteksts kļūst nederīgs paredzamā veidā.

Tas ir tikai signāls. Visu pārējo vajag uzbūvēt no jauna.

Deviņi signāli stingrā secībā

Atgūšanos vada jauna klase ClutterGraphicsRecoveryContext. Apvienošanas pieprasījums pievieno divus jaunus failus mapē clutter/clutter/. Klase izsūta deviņus signālus noteiktā secībā trīs fāzēs: atiestatīšana, nojaukšana, atkalizveide. Kļūdīties drīkst tikai viens solis. Ja neizdodas recreate-context, atgūšanās tiek pārtraukta un tiek izsūtīts recovery-failed.

Saraksts ar to, kas jāuzbūvē no jauna, ir garš:

  • kadru buferi un izvades konfigurācija;
  • logu un virsmu saturs, atjaunots līdz pēdējam uzzīmētajam kadram;
  • kursoru tekstūras gan Xcursor, gan Wayland klientu variantā;
  • ClutterOffscreenEffect konveijeri aizmiglošanai, krāsu noņemšanai, deformācijai un ēnotājiem;
  • MetaOverlay konveijeri un tekstūras;
  • PipeWire plūsmas ekrāna ierakstam un attālinātajai darbvirsmai.

Atsevišķa problēma bija nosauktie CoglPipeline objekti, kas piederēja klasei, nevis konkrētam kontekstam. Tos nācās pārcelt, pirms atgūšanās vispār varēja strādāt.

Kas atjaunojas un kas paliek melns

Pēc autora apraksta logi, fons, kursori un teksts atgriežas acumirklī. Sesija turpinās, procesi netiek nogalināti.

Atgūšanās notiek automātiski, bez lietotāja iejaukšanās un bez paziņojuma. Mutter pamana atiestatīšanas statusu, nojauc veco stāvokli un uzbūvē to no jauna. Logu saturs nāk no pēdējā uzzīmētā kadra, tāpēc pāris kadru pazūd, taču lietotņu procesi par notikušo neuzzina.

Nepabeigta paliek pati GNOME Shell. Saskarnes hroms, pārskata režīms, logrīki, ikonas un efekti pēc atiestatīšanas neatjaunojas. Darbvirsmas fona attēla ielāde tagad ir pārcelta uz Shell pusi, tāpēc arī tā ir atkarīga no Shell atgūšanās. Praksē tas nozīmē sesiju, kurā lietotnes strādā, bet augšējā josla un aktivitāšu pārskats vairs ne.

Projekta noslēguma ierakstā Ogundipe savu darbu vērtē šādi:

Atgūšanās mehānisms ir stabils. Mutter pārdzīvo GPU atiestatīšanu, sesija paliek dzīva un stāvoklis atjaunojas pareizi. Daži robežgadījumi ar ātri sekojošām atiestatīšanām vēl tiek meklēti, taču tie nav arhitektūras problēma.

Testēšana bez īstas dzelzs

Lielākā daļa pārbaužu notika virtuālajās mašīnās ar programmatūras renderētāju llvmpipe, kur atiestatīšanu izsauc mākslīgi, sekojot faila izmaiņu laikam. Uz reālām kartēm gāja sliktāk. AMD noklusētā MODE2 atiestatīšanas metode neanulē EGL kontekstus, tāpēc ar to pārbaudīt atgūšanos nevar. llvmpipe simulācijas iekļaušana nepārtrauktās integrācijas testos vēl ir priekšā, tāpat kā pārbaude uz reālas atiestatīšanas.

Pirms augšupielādes Ogundipe visu darbu pārkomitēja no tīras lapas. Izstrādes vēsture viņa paša atzarojumā bija par daudz sajaukta, lai to sūtītu apskatei tādu, kāda tā radās.

GSoC posms beidzās 28. augustā. Mentori bija Jonas Ådahl, Robert Mader un Carlos Garnacho. This Week in GNOME raksta, ka izstrāde turpināsies arī pēc programmas beigām. 30. augustā apvienošanas pieprasījums joprojām bija atvērts, ar septiņiem komentāriem un bez melnraksta atzīmes.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie