Что может привести к изменению preempt_count или к запуску очереди задач в атомарном контексте? - PullRequest
1 голос
/ 06 февраля 2012

Я выполняю какую-то работу с модулем, и у меня возникают сбои, которые происходят случайным образом (обычно в течение 10 часов после загрузки).

Сообщения журнала ядра могут варьироваться от одного сбоя к другому, но вв некоторых случаях я получаю это:

<4>huh, entered c90390a8 with preempt_count 0000010d, exited with c0340000?

Код, который генерирует этот журнал, взят из ядра 2.6.14, kernel / timer.c:

            int preempt_count = preempt_count();
            fn(data);
            if (preempt_count != preempt_count()) {
                printk(KERN_WARNING "huh, entered %p "
                       "with preempt_count %08x, exited"
                       " with %08x?\n",
                       fn, preempt_count,
                       preempt_count());
                BUG();
            }

Чтобы это условие произошло,что должно было произойти (очевидно, preempt_count изменилось, но что может это вызвать)?

Другой признак сбоя заключается в том, что я вижу scheduling while atomic при выполнении i2c из рабочей очереди (которая должнаконечно не быть атомным, верно?).Что может быть причиной этого?

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

1 Ответ

4 голосов
/ 25 февраля 2012

Просто отвечая от всего сердца: «preempt_count» - это 32-битное поле, которое для различных целей разбито на подполевые поля.Подбитовые поля подробно описаны в О'Рейли «Понимание ядра Linux».Опять же, в макушке головы, я не знаю, что означает "c0340000".Но так как вы начали с «0000010d» и должны были закончиться с «0000010d», то, что бы ни делал ваш код таймера, довольно запутано.

Одна распространенная причина - если ваш код таймера сделал что-то вроде spin_lock_bh (), нозабыл сделать spin_unlock_bh ().Но обычно это приводит только к 1-битной разнице между начальным и конечным значением preempt_count.Но в вашем случае ваши начальные и конечные значения показывают значительные изменения.

Майкл

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