Разработчик из Red Hat спустя 292 612 перезагрузок нашёл редкую ошибку в ядре Linux 6

kamxjrf2fnklocvqrv6ckwyrl7a.jpeg

Разработчик из Red Hat Ричард Джонс рассказал, как он спустя 292 612 перезагрузок виртуальных машин в течение 21 часа нашёл редкую ошибку в ядре Linux 6, которая приводила к случайному зависанию системы при загрузке на разных процессорах (на Intel реже, на AMD чаще) и происходила примерно один раз на тысячу загрузок ОС. Причём на одном и том же раннем этапе загрузки ОС и при запуске последней версии qemu. Джонс сообщил мейнтейнерам ядра Linux об этой проблеме.

Ранее Джонс столкнулся с этим багом, когда проводил ряд программных тестов с протоколом nbdkit. У него рандомно зависали системы при работе с инструментом libguestsfs для доступа к образам дисков виртуальной машины и их модификации.

Джонс несколько дней пытался понять причины зависания, а потом решил проверить свою догадку при проверке версий загрузок виртуальных машин с разными версиями Linux 6 от Linux 6.0 до Linux 6.4-rc6. Он написал скрипт, запускавший ОС и отслеживавший результат в несколько потоков.

В итоге Джонсу удалось выявить источник возникновения бага. Это была регрессия функции printk. Разработчик пояснил, что планировал сделать 1 млн перезагрузок, но ему хватило 292 тысяч на выявление проблемы, вероятно, было где-то в этом коммите. После этого он вручную отменил каждый коммит, прикреплённый к проблемному коммиту слияния, и, наконец, нашёл единственный коммит, который вызывает проблему, связанный с printk.

Сообщество разработчиков ядра Linux поблагодарило Джонса за столь скрупулёзное тестирование и выявление причины бага. Патч по этой ошибке находится в работе.

© Habrahabr.ru