Безопасно ли вызывать printk внутри spin_lock_irqsave?

Я написал примерно такой код:

Это в контексте без прерывания:

spin_lock_irqsave(&lock, flags);
printk("some message blah...\n");
spin_unlock_irqrestore(&lock, flags);

Я запускаю этот код и «выглядит» безопасно, потому что не вижу сбоев. Но я не уверен, что это действительно безопасный код или нет. Потому что это может вызвать сбой системы с вероятностью 1/100000.

Кроме того, я хотел бы знать, безопасен ли вызов функции «сна» внутри spin_lock_irqsave (в контексте без прерывания).


person jaeyong    schedule 18.12.2014    source источник
comment
Что-нибудь еще приобретает lock?   -  person    schedule 18.12.2014
comment
Да, может быть. И я хотел бы поместить процедуру ожидания события между spin_lock_irq...   -  person jaeyong    schedule 18.12.2014


Ответы (1)


Код ядра не должен засыпать, удерживая спин-блокировку. В Драйверы устройств Linux, третье издание, " В разделе «Спин-блокировки и атомарный контекст» главы 5 говорится:

Therefore, the core rule that applies to spinlocks is that any code must,
while holding a spinlock, be atomic. It cannot sleep; in fact, it cannot
relinquish the processor for any reason except to service interrupts (and
sometimes not even then).

Что касается printk, я считаю, что безопасно вызывать в критической секции. Комментарии в исходном коде даже упомянуть:

This is printk(). It can be called from any context. We want it to work.
person ctuffli    schedule 18.12.2014
comment
На самом деле это не код драйвера. Контекст — это поток ядра, а не контекст прерывания. Но почему-то хотелось отключить прерывание с удержанием спин-блокировки. - person jaeyong; 19.12.2014
comment
И драйверы, и обычные потоки ядра следуют примерно одним и тем же правилам, но я обновил ответ, чтобы уточнить. - person ctuffli; 22.12.2014