Secondo quanto ho letto finora, "quando il kernel riceve un interrupt, vengono invocati tutti i gestori registrati".
Comprendo che i gestori registrati per ciascun IRQ possono essere visualizzati tramite /proc/interrupts
e capisco anche che i gestori registrati provengono dai driver che hanno invocato il request_irq
passaggio in una richiamata all'incirca del modulo:
irqreturn_t (*handler)(int, void *)
Sulla base di ciò che so, ciascuno di questi callback del gestore di interrupt associato al particolare IRQ dovrebbe essere invocato, e spetta al gestore determinare se l'interrupt debba effettivamente essere gestito da esso. Se il gestore non deve gestire l'interrupt particolare, deve restituire la macro del kernel IRQ_NONE
.
Quello che ho difficoltà a capire è come ci si aspetta che ciascun driver determini se deve gestire l'interrupt o meno. Suppongo che possano tenere traccia internamente se dovrebbero aspettarsi un interrupt. In tal caso, non so come sarebbero in grado di affrontare la situazione in cui più driver dietro lo stesso IRQ si aspettano un interrupt.
Il motivo per cui sto cercando di capire questi dettagli è perché sto facendo confusione con il kexec
meccanismo per rieseguire il kernel nel mezzo del funzionamento del sistema mentre sto giocando con i pin di reset e vari registri su un bridge PCIe e un PCI downstream dispositivo. E nel fare ciò, dopo un riavvio, ricevo il panico del kernel o altri driver che si lamentano del fatto che stanno ricevendo interruzioni anche se non è stata eseguita alcuna operazione.
Come il gestore ha deciso che l'interrupt dovrebbe essere gestito da esso è il mistero.
Modifica: nel caso sia rilevante, l'architettura della CPU in questione è x86
.