2014-12-18 5 views
0

나는 다음과 같은 코드 뭔가를 작성했습니다 :spin_lock_irqsave에서 printk를 호출해도 안전합니까?

그것은 비 인터럽트 맥락에서이다 : 나는이 코드를 실행하고 "보이는"하고

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

안전 나는 어떤 충돌이 표시되지 않기 때문에. 하지만이 코드가 실제로 안전한 코드인지는 확실하지 않습니다. 왜냐하면 1/100000 확률의 시스템 충돌을 유발할 수 있습니다.

또한, "sleep"함수를 spin_lock_irqsave 내부에서 호출하는 것이 안전한지 (인터럽트가없는 상황에서) 안전한지를 알고 싶습니다.

+0

'잠금'을 얻는 방법이 있습니까? – duskwuff

+0

예,있을 수 있습니다. 그리고, spin_lock_irq ... – jaeyong

답변

0

스핀 록을 가지고있는 동안 커널 코드가 잠자기해서는 안됩니다. Linux Device Drivers, Third Edition에서, 제 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에 관해서는, 나는 중요 섹션 내에서 호출하는 것이 안전합니다 생각합니다. source code의 의견 :

This is printk(). It can be called from any context. We want it to work. 
+0

사이에 이벤트 대기 루틴을 넣고 싶습니다. 사실, 드라이버 코드가 아닙니다. 컨텍스트는 인터럽트 컨텍스트가 아닌 커널 스레드입니다. 그러나 어떤 이유로 스핀 락을 가지고 인터럽트를 비활성화하고 싶습니다. – jaeyong

+0

드라이버와 "정상적인"커널 스레드는 거의 동일한 규칙을 따르지만 명확히하기 위해 대답을 업데이트했습니다. – ctuffli