Existem três funções spin_lock no kernel com as quais estou ocupado atualmente.
- spin_lock
- spin_lock_irq
- spin_lock_irqsave
Eu só encontro contribuições cobrindo apenas dois deles (incluindo a documentação do Linux).
Em seguida, as respostas ou explicações são formuladas de forma ambígua ou contrárias umas às outras ou mesmo contêm comentários dizendo que a explicação está errada. Isso torna difícil obter uma visão geral.
Alguns conceitos básicos são claros para mim, como por exemplo, no contexto de interrupção, um simples spin_lock() pode resultar em um deadlock. Mas eu realmente apreciaria uma imagem completa sobre este assunto.
Eu preciso entender:
- Quando devemos ou devemos usar qual versão, quando não devemos?
- Quando não é necessário usar uma versão mais segura, mas não prejudica (exceto para desempenho)?
- Qual é o motivo para usar uma versão em uma situação específica?
Uma breve descrição é fornecida no Capítulo 5. Condições de concorrência e corrida de drivers de dispositivo Linux, terceira edição
As
spin_lock_irq*
funções são importantes se você espera que o spinlock possa ser mantido no contexto de interrupção. A razão é que, se o spinlock for mantido pela CPU local e, em seguida, a CPU local atender a uma interrupção, que também tentará bloquear o spinlock, você terá um deadlock.