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

Madhuparna Bhowmik успешно завершила проект GSoC 2020 “Анализ и исправление ошибок, связанных с состояниями гонки, в ядре ОС Linux” под эгидой The Linux Foundation. Проект включал в себя использование интерфейса Клевер для поиска ошибок, связанных с некорректной синхронизацией потоков, в ядре ОС Linux v4.18. Большая их часть все еще присутствовала в последней версии ядра v5.9. Из 301 проанализированного предупреждения около 44 были признаны либо реальными проблемами, либо безобидными (benign) ошибками, что составляет 14.6% истинных предупреждений.

Madhuparna - студентка последнего года обучения в Национальном институте технологий Карнатаки. Она начала изучение ядра ОС Linux и работу с сообществом Linux в октябре 2019 года. Раньше она работала над исправлением ошибок, связанных с некорректным использованием интерфейса RCU, в рамках программы Linux Kernel Mentorship. Madhuparna планирует продолжить работу с сообществом ОС Linux и в дальнейшем стать разработчиком ядра.

В рамках GSOC было проанализировано более 300 предупреждений о потенциальных состояниях гонки в драйверах устройств ядра Linux. Истинные ошибки были сообщены разработчикам, кроме того, для некоторых ошибок были подготовлены патчи с исправлениями. Оставшиеся ложные предупреждения были классифицированы по различным категориям, что позволит на их основе улучшать инструмент.
Более 28 предупреждений были идентифицированы как реальные ошибки. 18 из них были успешно исправлены, а оставшиеся ошибки либо находились в устаревших драйверах, либо ответ от разработчиков не был получен. Так как некоторые ошибки имели несколько проявлений на различных переменных одного драйвера, они были исправлены одним патчем.

Проект GSoC 2020 продолжался три месяца и работа студентки была разделена на три части. Она анализировала по 100 трасс к каждому отчетному периоду, что в сумме и дало 300 предупреждений. В течение первого месяца было найдено несколько ошибок и было принято четыре патча. В течение второго месяца Madhuparna работала над фильтрацией ложных предупреждений, которые были основной частью работы. А к последнему месяцу она работала над исправлением найденных ошибок и еще 4 патча были приняты.

Так как Madhuparna активно работала над проектом, она выделила много потенциальных возможностей для улучшения инструмента Клевер. В том числе, улучшение и исправление спецификаций, автоматическая разметка безобидных ошибок и добавление строки поиска по имени драйвера. При этом инструмент является полезным для определения ошибок, он предоставляет удобный доступ к трассе и подробную информацию о переменных и именах функций. Возможность сокрытия нерелевантного кода с помощью кнопки очень полезна для быстрого просмотра трассы. Возможность автоматического применения оценок к похожим трассам является полезной в общем случае, хотя временами вызывает определенные проблемы.

Madhuparna выражает благодарность всем ее менторам: Вадиму Мутилину, Алексею Хорошилову и Павлу Андрианову. Общение по почте и обсуждение различных случаев, включая сомнения, сообщения об ошибках и патчи, были очень полезны.

Принятые патчи:

  1. usb: host: u132-hcd: Remove u132_static_list and list head u132_list
  2. drivers: char: tlclk.c: Avoid data race between init and interrupt handler
  3. drivers: dma: pch_dma.c: Avoid data race between probe and irq handler
  4. rapidio: Avoid data race between file operation callbacks and mport_cdev_add()
  5. drivers: watchdog: rdc321x_wdt: Fix race condition bugs
  6. drivers: crypto: picoxcell_crypto: Fix potential race condition bug
  7. drivers: mmc: host: via-sdmmc: Fix data race bug
  8. drivers/dma/dma-jz4780: Fix race condition between probe and irq handler

Другие патчи:

  1. drivers: isdn: capi: Fix data-race bug - неизбежная гонка
  2. drivers: char: applicom.c: Add lock for protecting DeviceErrorCount - безобидная гонка, так как переменная используется для отслеживания количества ошибок
  3. drivers: watchdog: pc87413_wdt: Fix Race condition bug - устаревший драйвер
  4. usb/c67x00/c67x00-drv: Fix Data Race bug - нет ответа