28.08.2017: Поиск ошибок, связанных с гонками по данным, в ядре ОС Linux

Антон Волков закончил проект “Поиск ошибок, связанных с гонками по данным, в ядре ОС Linux”, выполненный в рамках Google Summer of Code 2017 под эгидой The Linux Foundation. Целями проекта были:

  1. поиск ошибок, связанных с состояниями гонки, в ядре ОС Linux;
  2. уведомление разработчиков модулей ядра об этих ошибках.

Ошибки, связанные с состояниями гонки по данным, очень сложно обнаружить. Обычно к таким ошибкам приводит некорректное использование существующих примитивов синхронизации или использование нестандартных методов синхронизации. Гонки по данным не обязательно являются ошибками, но могут быть их причиной.

Для поиска ошибок был использован инструмент под названием Klever, который является новой версией инструмента LDV Tools. Запуск инструмента был произведен на папке drivers/ ядра ОС Linux v4.2.6. Несмотря на то, что ядро является достаточно старым, в нем содержатся ошибки, которые присутствовали в последней стабильной версии ядра.

Антон Волков проанализировал около 500 предупреждений о возможных состояниях гонки по данным. 70% из них были ложными предупреждениями из-за неточностей анализа. Остальным 30% предупреждений соответствовали как серьезные ошибки (разыменование нулевого указателя), так и безобидные гонки. Несколько предупреждений обычно имели одну и ту же причину. Таким образом, предупреждениям соответствовало 28 реальных ошибок.

В течение проекта Антон Волков общался с разработчиками модулей ядра ОС Linux, в которых были найдены ошибки, и обсуждал возможные исправления указанных ошибок. Исправление ошибок, связанных с состоянием гонки, является достаточно сложной задачей. Из-за этого не все сообщения об ошибках получили соответствующие патчи: даже разработчики иногда не могли предложить подходящего решения для указанной проблемы. Ниже приведен полный список сообщений об ошибках и патчей, отправленных разработчикам.

Сообщения об ошибках, на которые пока не было получено ответа:

  1. ks8851_mll: https://lkml.org/lkml/2017/8/15/484
  2. ibmasm: https://lkml.org/lkml/2017/8/18/621
  3. apds990x: https://lkml.org/lkml/2017/8/10/515
  4. bh1770glc: https://lkml.org/lkml/2017/8/8/536
  5. via-ircc: https://lkml.org/lkml/2017/8/8/777
  6. cafe_ccic: https://lkml.org/lkml/2017/8/22/569
  7. isp1760: https://lkml.org/lkml/2017/8/7/570
  8. iowarrior: https://lkml.org/lkml/2017/8/22/490

Сообщения об ошибках, которые разработчики считают невозможными из-за аппаратной защиты устройства:

  1. xilinx-xadc: https://lkml.org/lkml/2017/8/18/705
  2. c4: https://lkml.org/lkml/2017/8/15/369

Сообщения об ошибках, которые были признаны возможными:

  1. rcar-dmac: https://lkml.org/lkml/2017/8/8/480
  2. spi-tegra114, spi-tegra20-slink, spi-tegra20-sflash: https://lkml.org/lkml/2017/7/24/253
  3. mlx5_ib (benign race): https://lkml.org/lkml/2017/8/18/709
  4. ucb1400_ts: https://lkml.org/lkml/2017/8/15/384
  5. adutux: https://lkml.org/lkml/2017/8/15/360
  6. loop: https://lkml.org/lkml/2017/7/28/482
  7. hysdn: https://lkml.org/lkml/2017/7/27/480
  8. pc87413_wdt: https://lkml.org/lkml/2017/8/7/454
  9. cypress_m8: https://lkml.org/lkml/2017/8/22/358
  10. nsc-ircc: https://lkml.org/lkml/2017/8/25/378

Список патчей:

  1. rcar-dmac: https://patchwork.kernel.org/patch/9911629/
  2. hysdn (применен в v4.13-rc5): https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commi...
  3. loop (появится в v4.14): https://patchwork.kernel.org/patch/9885335/
  4. spi-tegra114: https://patchwork.kernel.org/patch/9915305/