Soy nuevo en el kernel pero por lo que recojo del libro de Robert Love "Linux Kernel Development", si las interrupciones ya están deshabilitadas en el procesador antes de que el código comience a bloquearse, cuando llame a spin_unlock_irq liberará el bloqueo en un manera errónea. Si guarda los indicadores y los suelta con los indicadores, la función spin_lock_irqsave devolverá la interrupción a su estado anterior.
Ejemplo con spin_lock_irqsave
spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;
spin_lock_irqsave(&mLock, flags); // save the state, if locked already it is saved in flags
// Critical section
spin_unlock_irqrestore(&mLock, flags); // return to the formally state specified in flags
Ejemplo con spin_lock_irq
(sin irqsave):
spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;
spin_lock_irq(&mLock); // Does not know if already locked
// Critical section
spin_unlock_irq(&mLock); // Could result in an error unlock...
Esta respuesta es incorrecta. spin_lock_irq deshabilitará las interrupciones por un segundo, mientras que las variantes irqsave guardarán el estado de interrupción en casos en que no se puede saber en qué estado se encuentra actualmente. –
@NoahWatkins Ese es el punto de la última parte. Dice * Podría dar lugar a un desbloqueo de error * en un comentario. El 'spin_lock_irq' es para mostrar que el IRQ está habilitado cuando no debería ser. La respuesta no es incorrecta; simplemente no muy claro. –
@artlessnoise Cuando decimos que los irq están deshabilitados, ¿están inhabilitados todos los irq del sistema? Esto no es muy claro para mí. ¿Puedes explicar? –