Esiste un meccanismo diretto per identificare se una determinata funzione viene chiamata in un contesto di interrupt o dal contesto del processo. Questa è la prima parte della domanda. La seconda parte è: Come sincronizzare 2 processi, uno che è nel contesto di interrupt e l'altro che è nel contesto del processo. Se la mia comprensione è giusta, non possiamo usare mutex per il processo nel contesto di interrupt poiché non è permesso di dormire. D'altra parte, se utilizzo spinlock, l'altro processo utilizzerà i cicli della CPU. Qual è il modo migliore per sincronizzare questi 2 processi. Correggimi se la mia comprensione è totalmente sbagliata.Quale contesto viene chiamata una funzione in Linux Kernel
risposta
È possibile determinare se la funzione è stata eseguita come gestore IRQ utilizzando la funzione in_irq(). Ma non penso che sia una buona pratica usarlo. Dovresti vedere solo dal codice in quale contesto viene eseguita la tua funzione. Altrimenti direi che il tuo codice ha un cattivo design.
Come per il meccanismo di sincronizzazione - hai ragione, devi usare spinlock, perché devi fare la sincronizzazione in contesto atomico (ad esempio l'interruzione) - non che tu abbia molta scelta qui. Hai anche ragione che molti cicli di CPU saranno sprecati quando aspetti lo spinlock, quindi dovresti provare a ridurre al minimo la quantità del tuo codice sotto chiave.
In aggiunta alla risposta di Sam, è necessario progettare il gestore di interruzioni con metà inferiore e metà superiore. Ciò consente di avere un codice minimo (metà superiore) nel gestore di interrupt (che si registra quando si richiede l'irq nel driver) e il resto (metà inferiore) è possibile pianificare utilizzando una coda di lavoro. Si può avere questa metà superiore (dove si sta gestendo l'interrupt e si eseguono alcuni minimi red/write dal dispositivo) all'interno del contesto atomico protetto da spinlock, in modo che un numero inferiore di cicli della CPU venga sprecato in attesa dello spinlock.