Что может вызвать «мертвую петлю», указанную печатью «Мертвая петля на виртуальном устройстве» в ядре Linux? - PullRequest
0 голосов
/ 17 декабря 2009

Печать происходит, когда «текущий владелец блокировки» ресурса ядра является текущим процессором. Я не знаю, что может привести к этому состоянию. Не могу найти много в сети. Кто-нибудь отлаживал это?

Ответы [ 3 ]

2 голосов
/ 15 января 2010

Это диагностическое сообщение, предназначенное для привлечения внимания к возможному тупику.

В этом конкретном случае существует очередь передачи, которая защищена спин-блокировкой. В дополнение к этой блокировке очередь передачи также поддерживает поле «владелец», которое содержит CPUID, который устанавливается, когда удерживается эта спин-блокировка.

Как вы, вероятно, знаете, спин-блокировка всегда будет вращаться на процессоре, если запрошенная блокировка уже была взята.

То есть в этом месте код проверяет, является ли процессор тем же, который заблокировал спин-блокировку.

Если он не находится на том же процессоре, он выполняет операции, для которых может потребоваться блокировка.

С другой стороны, если это тот же процессор, что-то не так, то есть мы должны вращаться в ожидании блокировки. Возможно, мы попали сюда из-за неправильного обработчика прерываний / нижней половины.

Поскольку это указывает на потенциальную тупиковую ситуацию, выводится диагностическое сообщение:).

0 голосов
/ 21 декабря 2009

Хорошо, понял.

Обычно это происходит, когда вы вводите одну и ту же функцию дважды, ссылаясь на один и тот же ресурс ядра, в одном контексте выполнения ядра Linux (например, один экземпляр softIRQ и т. Д.). Выход из этого - убедиться, что вы не вводите функцию дважды в одном и том же контексте выполнения. Это ошибка в вашем коде, если это произойдет.

0 голосов
/ 20 декабря 2009

Debug? Вы имеете в виду, нужно знать , где в источнике ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...