2012-09-25 18 views
6

Si el código es la siguientespin_lock_irqsave anidada

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); 
} 

Habrá algún problema con el código? cuando se llama al spin_unlock_irqrestore en func1, ¿la interrupción ya estará habilitada? Lo que quiero lograr es test() La rutina se puede ejecutar sin ninguna interrupción por programador o interrupciones. Muchas gracias

+1

En realidad, ese es el punto de tener 'spin_lock_irqsave()/spin_unlock_irq_restore()' además de 'spin_lock_irq()/spin_unlock_irq()'. – ninjalj

Respuesta

6

Por lo que he encontrado en la documentación, y no he agotado completamente mi búsqueda, flag guardará el estado de los bits que establecen las diferentes banderas y luego apaga las interrupciones, luego restaura de punta. Si la primera llamada test ha interrumpido las interrupciones y luego realiza otra llamada, supongo (y nada indica que he encontrado) que dejaría las interrupciones desactivadas, almacene el flags y recupérelas dentro de func() y luego restaurarlos al estado flag tiene en test.

Las interrupciones solo deben volver a habilitarse después de su función test.

Yo diría que su única pega es que no puede usar la misma variable flag en ambas funciones, de lo contrario sobrescribirá la primera en su llamada interna y luego la reinicia, y si alguna bandera cambia entre sus llamadas, puede restablecer el exterior al estado incorrecto.

+1

Esto es correcto. Anidado spin_lock_irqsave() está perfectamente bien, siempre que uses diferentes variables "flags". – Roland