История одной ошибки в ядре.

Я думаю, мало кому приходилось видеть segmentation fault на боевом сервере со стабильным Debian и исправным железом.

В один не очень прекрасный день меня будят и говорят,что сервер не работает. На пинги не отвечает. Захожу через iLo и вижу такую картину:

Начал разбираться. Завел баг, на "ядерной" багзилле: http://bugzilla.kernel.org/show_bug.cgi?id=11571

Краткое описание проблемы. Segfault возникает при использовании шейпера сетевего трафика в ядре Linux. Мы создаем классовый qdisc с алгоритмом HTB, создаем кучу классов трафика и классифицируем выходящий из интерфейса трафик при помощи u32_cls фильтра, т.е. по ip адресу. Классов достаточно много >2k, каждому классу соотвествует фильтр. При удалении фильтра из дерева фильтров tcf_tree, оно не блокируется. Если пакет, проходящий по этому дереву, должен попасть в уже удаленный фильтр, то мы получаем segmentaion fault.

До выяснения причин и появления патча решением стало использовать iptables -j MARK и использование фильтра cls_fw.

На данный момент Jarek Poplawski написал патч, который уже закоммитили в stable ветку ядра.