2012-09-25 19 views
6

Wenn der Code wie untenNested spin_lock_irqsave

void test(void) 
{ 
    spin_lock_irqsave(&lock1, flag); 
    ... 
    func1(); 
    ... 
    spin_unlock_irqrestore(&lock1, flag); 
} 

void func1(void) 
{ 
    spin_lock_irqsave(&lock2, flag); 
    ... 
    spin_unlock_irqrestore(&lock2, flag); 
} 

Wird es Problem sein, mit dem Code? Wenn der spin_unlock_irqrestore in func1 aufgerufen wird, wird der Interrupt bereits aktiviert? Was ich erreichen möchte, ist test() Routine kann ohne Unterbrechung durch Scheduler oder Interrupts ausgeführt werden. Vielen Dank

+1

Eigentlich ist das der spring_lock_irqsave()/spin_unlock_irq_restore() 'zusätzlich zu' spin_lock_irq()/spin_unlock_irq() '. – ninjalj

Antwort

6

Soweit ich in der Dokumentation gefunden habe, und ich habe meine Suche nicht vollständig erschöpft, die flag wird den Zustand der Bits, die die verschiedenen Flags setzen und dann Interrupts deaktivieren, dann wiederherstellen es am Ende. Wenn Interrupts durch den ersten Anruf test ausgeschaltet wurden und Sie dann einen anderen Anruf ausführen, würde ich annehmen (und nichts anderes zeigt, dass ich gefunden habe), dass die Interrupts ausgeschaltet bleiben würde, speichern Sie die flags und wiederherstellen sie innerhalb func() und dann stellen Sie sie wieder in den Zustand flag hat in test.

Interrupts sollten nur nach Ihrer test Funktion wieder aktiviert werden.

Ich würde sagen, Ihr einziger Haken ist, dass Sie nicht die gleiche flag Variable in beiden Funktionen verwenden können, sonst werden Sie die erste in Ihrem inneren Anruf überschreiben und dann zurücksetzen, und wenn Flags zwischen Ihren Aufrufen geändert werden, Sie können den äußeren in den falschen Zustand zurücksetzen.

+1

Das ist richtig. Verschachtelte spin_lock_irqsave() ist völlig in Ordnung, solange Sie verschiedene "Flags" Variablen verwenden. – Roland