Linux 7.3 защитит систему от зависших вызовов EFI-прошивки
В ядро Linux 7.3, находящееся в разработке, приняли обновления подсистемы EFI. Главное нововведение — тайм-аут на завершение вызовов runtime-сервисов EFI. Раньше ядро могло ждать ответа прошивки бесконечно; теперь, если отведённое время истекает, прошивка объявляется «заклинившей» (wedged). Это помогает справляться с ошибками в EFI/прошивке на некоторых платформах, где сбой в итоге способен обрушить всё остальное пользовательское пространство.
В чём была проблема
Над набором патчей работал Брено Лейтао, разработчик Debian и инженер ядра в Meta. Поводом стал случай на сервере на базе NVIDIA Grace. Как объясняет автор в сопроводительном письме, при зависании вызова runtime-сервиса EFI в прошивке рабочий поток kworker на очереди efi_rts_wq застревает внутри вызова и не может быть отменён. Ядро при этом ждёт завершения неограниченно долго, а вызывающая сторона всё это время удерживает блокировку efi_runtime_lock.
В результате «заклинивает» любой последующий обращающийся к EFI компонент — efivarfs, запись в NVRAM, set_wakeup_time, обработчики ACPI PRM и другие — вплоть до перезагрузки. Единственным внешним симптомом оказывается сообщение о «workqueue lockup», а пользовательские процессы один за другим намертво повисают на семафоре.
В описанном инциденте счётчики команд и адреса возврата указывали внутрь памяти прошивки runtime-сервисов: прошивка так и не вернула управление, а поток оставался заблокированным на протяжении отчётов о зависании через 127, 157 и 188 секунд — пока внешний мониторинг в конце концов не перезагрузил хост.
Что делает патч
Лейтао подчёркивает, что серия патчей не исправляет саму ошибку прошивки — это зона ответственности производителя. Задача скромнее и практичнее: не позволить одному застрявшему вызову EFI утянуть за собой всё пользовательское пространство. Вдобавок изменение превращает загадочный «зависший поток» в однозначный сигнал в dmesg о том, что виновата именно прошивка EFI. Особенно ценно это в масштабах парка серверов, где тот же симптом иначе можно было бы списать на десятки не связанных между собой причин.
Порог тайм-аута установлен в 120 секунд — заведомо больше, чем любой правдоподобный легитимный вызов в runtime-сервисы EFI. Нововведение вошло в Linux 7.3 в рамках слияния EFI-функций.
Источник: Phoronix
Комментарии
Войдите, чтобы комментировать.