Linux 7.3 защитит систему от зависших вызовов EFI-прошивки

· Linux и open source
В разрабатываемое ядро Linux 7.3 внесли изменения EFI: теперь на выполнение вызовов runtime-сервисов прошивки устанавливается тайм-аут, чтобы одна «зависшая» операция не тянула за собой всё пользовательское пространство.

cover.svg

В ядро 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

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.