Torvalds corrige en el kernel un fallo de VRAM en GPUs Intel Battlemage con ayuda de una IA

Fuentes: drm/xe: Don't hand out the flat CCS storage as usable VRAM

Linus Torvalds ha integrado en el kernel Linux el commit 818bebe, que corrige un error en el controlador drm/xe mediante el cual una porción de la memoria CCS (Compression Control Storage) de las GPUs Intel Battlemage se entregaba al asignador de VRAM como memoria utilizable. El origen estaba en la función get_flat_ccs_offset(), que redondeaba al alza, a múltiplos de 128 KiB, el inicio del almacenamiento CCS. Ese redondeo publicaba como libres los pocos bytes — 2 KiB en una Battlemage G21 de 16 GiB — que separan el límite real del múltiplo siguiente, y esos bytes pertenecen al hardware de compresión.

En la práctica, en ese equipo la tabla de páginas de nivel 3 de una máquina virtual Mesa aterrizaba en esa página en cada arranque en frío. La entrada que cubría el 'batch-buffer heap' del compositor se sobrescribía con metadatos de compresión, por lo que el compositor fallaba al buscar su lote y gdm lo reiniciaba sin cesar: pantalla en negro en una máquina que, por lo demás, funcionaba.

El parche sustituye el redondeo al alza por uno a la baja, alineado al tamaño de página del asignador, lo que excluye exactamente una página de la zona de VRAM en esa configuración. También reemplaza una aserción que comparaba el desplazamiento con GSMBASE - ccs_size — siempre alineado a 128 KiB, incapaz de detectar el caso que pretendía cazar y compilada solo con CONFIG_DRM_XE_DEBUG — por una comprobación que sí puede fallar: el almacenamiento CCS no debe invadir GSM.

Torvalds reconoce en el mensaje que el diagnóstico fue una sesión de depuración larga, con 24 parches intermedios y 18 arranques del kernel hasta dar con la causa, y que contó con la ayuda de una IA como asistente. Aunque la herramienta se rindió varias veces al calificar el problema de imposible, continuó añadiendo código de depuración y analizándolo cuando se le insistió. El cambio se reduce a una línea: sustituir round_up() por round_down(). El commit va firmado por Torvalds, dirigido a stable y etiquetado como Fixes para la regresión introducida en 3717339.