2013-07-11 11 views
5

Sto sviluppando un modulo del kernel che condivide strutture dati tra un softirq (hook di pre-routing di netfilter) e un contesto utente (all'interno di una chiamata ioctl).Condivisione di dati tra softirq e contesto di processo

Dopo aver letto questa link, so devo disattivare il software interrompe nel contesto utente quando si modificano i dati (utilizzando spin_lock_bh o spin_lock_irqsave) e riattivare loro volta le operazioni sui dati di azioni sono completate.

Tuttavia, non sono sicuro se è necessario prendere il blocco nella funzione di gestione softirq. Ho bisogno di prendere il blocco anche qui (con spin_lock)?

È a mia conoscenza che è necessario utilizzare uno spin lock in un gestore softirq se si condividono dati con un altro softirq o hardirq. La mia comprensione è corretta?

risposta

4

È necessario ottenere un blocco se si condividono dati con qualsiasi codice, che possono essere eseguiti nello stesso momento. Il kernel potrebbe eseguire sia il tuo softirq che il tuo gestore ioctl, quindi devi ottenere ottenere un blocco.

Quando si disattivano gli interrupt con spin_lock_bh o spin_lock_irqsave, gli interrupt sono disabilitati solo sul processore corrente. Quindi, è OK gestire gli interrupt su un altro.