Я потратил весь сегодняшний день на поиск этой проблемы, в перерывах между работой по окну слияния, поскольку она наконец стала воспроизводимой.
И исправление оказалось, по сути, однострочным, хотя сеанс отладки, чтобы до него дойти, таким не был.
Драйвер Xe берет адрес памяти, используемый для выделенной памяти для CCS, и округляет его до ближайшей области 128 КБ.
И это очень-очень неправильно, потому что это означает, что драйвер Xe затем будет *использовать* ту часть памяти, которая не находится на границе 128 КБ. И аппаратный движок тоже будет использовать и записывать в нее.
И когда эта память оказывается использованной для страниц таблиц GPU, происходят очень плохие вещи.
Я подозреваю, что это также объясняет некоторые случайные случайные повреждения экрана, которые я видел — когда память не используется для чего-то столь важного, как таблица страниц, она «лишь» повреждает случайную растровую память и тому подобное.
Я закоммитил исправление как коммит 818bebeb63dd («drm/xe: Don't hand out the flat CCS storage as usable VRAM»).
Добавляю некоторых людей из коммита 37173392741c («drm/xe/vram: fix ccs offset calculation») в копию, потому что именно оттуда пришла проблема. Два года назад. Я не уверен, почему теперь она стала для меня такой воспроизводимой, но, очевидно, изменение поведения пользовательского пространства теперь запускает ее практически при каждом запуске.
Линус
https://github.com/torvalds/linux/commit/818bebeb63dd6bf5f4e07e145f6cdbace520a34c
[И это был адский сеанс отладки, которому чрезвычайно помог искусственный интеллект, выполнявший большую часть черновой работы.
Я бы хотел назвать это своим неустающим помощником, но ИИ несколько раз прямо заявлял, что это невозможно и неразрешимо, и что мы должны просто написать отчет об этом.
Я подозреваю, что этим вещам обучены люди, которые, возможно, не такие упрямые, как я.
Но хотя ИИ несколько раз был готов сдаться, он продолжал добавлять отладочный код и тщательно анализировать его, когда я нажимал на него. Так что отдавайте должное, и я позволил ИИ написать сообщение о фиксации, приведенное выше.
Это, по сути, однострочное исправление фиктивного "round_up()" на "round_down()", но было выпущено 24 исправления, добавляющих все больше и больше отладочной информации, и 18 загрузок ядра, чтобы, наконец, сузить поиск до этого. - Linus ]
Linux / Линукс 🥸