16.08.2016: Анализ потенциальных состояний гонок на ядре ОС Linux

user warning: Got error 28 from storage engine query: SELECT t.*,v.weight AS v_weight_unused FROM term_node r INNER JOIN term_data t ON r.tid = t.tid INNER JOIN vocabulary v ON t.vid = v.vid WHERE r.vid = 269 ORDER BY v.weight, t.weight, t.name in /opt/drupal-6.33/modules/taxonomy/taxonomy.module on line 640.

Павел Андрианов закончил проект "Анализ потенциальных состояний гонок на ядре ОС Linux", выполненный в рамках Google Summer of Code 2016 под эгидой The Linux Foundation.

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

Инструмент LDV производит анализ модулей ядра ОС Linux и обнаруживает ошибки, связанные с некорректным использованием интерфейсов между модулем и сердцевиной ядра, а также состояния гонки - ситуации, при которых два или более потоков могут получить одновременный доступ к одним и тем же разделяемым данным. Состояния гонок не всегда приводят к ошибкам, но часто являются их симптомами.

В результате своей работы инструмент LDV выдает множество предупреждений относительно потенциальных состояний гонок в модулях ядра ОС Linux. Не все предупреждения являются истинными ошибками из-за неточностей в анализе и предположений об окружении модуля. Задача Павла была проанализировать предупреждения для ядра ОС Linux и сообщить о найденных ошибках разработчикам ядра.

Сначала Павел запустил LDV на папке drivers/net/wireless. Он проанализировал около 100 предупреждений и обнаружил около двадцати подозрительных случаев. После тщательного изучения он сообщил о двух реальных состояниях гонки разработчикам. Эти ошибки были подтверждены и исправлены.

После этого Павел запустил инструмент на всех драйверах ОС Linux 4.5. Инструмент выдал предупреждения для 400 модулей ядра. В течение GSOC 2016 Павел успел проанализировать 100 модулей и выявил, что большая часть ложных предупреждений связана с неточностью моделирования окружения, обработкой примитивов синхронизации, анализом разделяемых данных, анализом условий и др. Также были обнаружены около 20 реальных состояний гонки, но не все из них были сообщены разработчикам, так как некоторые были обнаружены в старых неподдерживаемых модулях. Полный список ошибок, о которых было сообщено разработчикам, приведен ниже.

7 принятых патчей:

  1. 30462b5 ("rtlwifi: Remove unused parameter from rtl_ps_set_rf_state()")
  2. 204e2ab ("rtlwifi: rtl8188ee: Fix potential race condition")
  3. c3ae8ec4 ("rtlwifi: rtl8192ee: Fix potential race condition")
  4. 31c2e76 ("rtlwifi: rtl8723be: Fix potential race condition")
  5. 4f29b34 ("rtlwifi: rtl8723ae: Fix potential race condition")
  6. 300c32c ("rtlwifi: rtl8821ae: Fix potential race condition")
  7. f52b041 ("libertas: Add spinlock to avoid race condition")

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

  1. 2016/6/14/488 ("wcn36xx: potential race condition")
  2. 2016/7/1/492 ("A potential race")
  3. 2016/8/2/158 ("wl3501_cs: Add spinlock to wl3501_reset")
  4. 2016/8/8/84 ("A potential race in drivers/atm/eni.ko")
  5. 2016/8/12/113 ("A potential data race in drivers/net/ethernet/smsc/smc91c92_cs.ko")
  6. 2016/8/12/143 ("A potential race in drivers/scsi/megaraid.ko")
  7. 2016/8/12/217 ("A potential data race in drivers/scsi/mvumi.ko")
  8. 2016/8/15/246 ("Potential data race in drivers/net/ethernet/sis/sis190.ko")
  9. 2016/8/15/291 ("A potential data race in drivers/isdn/hardware/eicon/diva_mnt.ko")

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