После полного выключения и включения компьютера Linux показывал чёрный экран. Графическая оболочка постоянно перезапускалась, хотя сама система продолжала работать. Лечилось перезапуском оболочки.Фиксом занялся сам Линус Торвальдс. И в помощники он взял себе AI.Сама причина находилась в драйвере Intel Xe и расчёте границы видеопамяти. Часть VRAM видеокарта резервирует для служебных данных аппаратного сжатия. Драйвер получает адрес, с которого начинается эта закрытая область, и передаёт всю память ниже него обычным приложениям.Но адрес не всегда совпадал с границей страницы памяти.Легаси код использовал round_up() – округлял адрес вверх. Из-за этого граница свободной памяти сдвигалась внутрь зарезервированной области.На компьютере Линуса граница проходила посередине страницы размером 4 КБ: последние 2 КБ уже принадлежали механизму сжатия, но драйвер мог отдать всю страницу приложению.По итогу видеокарта записывала служебные данные поверх размещённой там таблицы страниц. Графическая оболочка теряла доступ к нужной области памяти и падала.Исправлением послужила замена round_up() на round_down().Теперь адрес округляется вниз до начала страницы. Если хотя бы часть страницы занята служебными данными видеокарты, драйвер исключает из доступной памяти всю страницу. Теряется несколько килобайт VRAM, зато приложения больше не получают память, которую может перезаписать оборудование.Само исправление уместилось всего в одну строку. Но для его поиска потребовались 24 диагностических патча и 18 перезагрузок ядра. Читать далее