Sono nuovo al kernel ma da ciò che raccolgo dal libro di Robert Love "Kernel Development Linux", se gli interrupt sono già disabilitati sul processore prima che il codice inizi a bloccarsi, quando chiami spin_unlock_irq rilascerai il blocco in un modo errato. Se salvi i flag e li rilasci con i flag, la funzione spin_lock_irqsave restituirà l'interrupt al suo stato precedente.
Esempio 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
Esempio con spin_lock_irq
(senza 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...
Questa risposta è errata. spin_lock_irq disabiliterà incondizionatamente gli interrupt, mentre le varianti irqsave salveranno lo stato di interruzione nei casi in cui non puoi sapere in quale stato ti trovi attualmente. –
@NoahWatkins Questo è il punto dell'ultima porzione. Dice * Potrebbe causare un errore di sblocco * in un commento. 'Spin_lock_irq' mostra che l'IRQ è abilitato quando non dovrebbe essere. La risposta non è errata; solo non molto chiaro. –
@artlessnoise Quando diciamo che gli irq sono disabilitati, tutti gli irq del sistema sono disabilitati? Questo non è molto chiaro per me. Puoi spiegare? –