20.08.2021: Анализ и исправление состояний гонок в ядре ОС Linux

Saubhik Mukherjee успешно завершил GSoC 2021 “Анализ и исправление ошибок, связанных с состояниями гонки, в ядре ОС Linux” под эгидой The Linux Foundation. Его основная задача заключалась в поиске ошибок, связанных с состоянием гонки в драйверах операционной системы Linux версии 5.4. Статическая верификация проводилась с помощью инфраструктуры Klever. С помощью веб-интерфейса полученные трассы ошибок анализировались и классифицировались на реальные ошибки и ложные предупреждения. В случае реальных ошибок подготавливался патч или отчет и посылался разработчикам. Причины ложных предупреждений также определялись для возможности улучшения инструмента.

Из 311 проанализированных предупреждений 30 были признаны реальными ошибками, в т.ч. безобидными (benign). Это дает процент истинных ошибок около 9.6%. Многие ошибки были найдены в устаревших драйверах, которые уже рассматривались в рамках GSoC прошлых лет. Из 281 ложных предупреждений 154 (55%) были связаны с неточной моделью окружения, а 128 (45%) - с проблемами в инструменте верификации. Модель окружения отвечает за взаимодействие активностей драйвера, например, за последовательность вызова обработчиков. Анализ исходного кода - это задача для инструмента статической верификации.

Saubhik является студентом Технологического Института Джорджии, Атланта. Его интересы включают в себя системное программное обеспечение, он выразил желание в дальнейшем продолжать вносить вклад в ядро ОС Linux.

GSoC 2021 был выполнен в режиме частичной занятости за 10 недель. Saubhik начал знакомиться с проектом за две недели до официального старта GSoC. После этого Saubhik распределил свое время между исследованием предупреждений, подготовкой патчей и обсуждением вопросов с ментором и разработчиками.

Для управлением процессом верификации и анализа верификационных результатов Klever предоставляет многопользовательский интерфейс. Он содержит некоторые детали, например, покрытие кода, и трассу ошибки, которая включает в себя возможные значения переменных, аргументы функций и все операторы программы от начальной точки до найденной ошибки. Особенностью просмотра исходного кода является возможность быстрой навигации по нему. Трасса ошибки также содержит полезную информацию о регистрации/дерегистрации различных обработчиков драйвера и прерываний, захваты и освобождения примитивов синхронизации и др. Различные потоки отображаются различными цветами на протяжении всей трассы: один поток для функций инициализации модуля, другой - для обработчиков драйвера. Как только трасса ошибки отмечена как ложное предупреждение или ошибка, похожие трассы автоматически размечаются тем же самым тегом и описанием. Также эксперты могут сравнивать результаты верификации, полученные в разное время.

Saubhik также предложил некоторые возможности по улучшению инструмента Klever. Были найдены проблемы в спецификациях platform driver, в частности, модель окружения не завершала поток с обработчиками power management при удалении родительского platform driver. Это было исправлено. Также была обнаружена проблема с драйверами Industrial I/O, которая также была исправлена. Это улучшило результаты верификации.

Saubhik выражает благодарность менторам Павлу Андрианову и Илье Захарову. Обсуждения сложных трасс, возможных исправлений и вопросов разработчикам были чрезвычайно полезны.

Патчи и обсуждения в списках рассылки:

  1. [PATCH] net: appletalk: cops: Fix data race in cops_probe1 (Принятно)
  2. [PATCH] tty: serial: owl: Fix data race in owl_uart_remove (Отклонено)
  3. [question] Is it possible to remove an active port (without shutdown)?
  4. [question] De-registration does not remove port
  5. [PATCH v2] char: tpm: vtpm_proxy: Fix race in init (Принято & протестировано)
  6. [question] potential race between capinc_tty_init & capi_release