Per darvi un contesto completo la mia discussione è iniziata con l'osservazione che sto eseguendo un SMP linux (3.0.1-rt11) su ARM cortex SoC basato su A8 che è un uniprocessore. Ero curioso di sapere se ci saranno dei vantaggi in termini di prestazioni disabilitando il supporto SMP. E se sì quale impatto avrà sui miei driver e gestori di interrupt.Informazioni sul collegamento tra CONFIG_SMP, Spinlocks e CONFIG_PREEMPT nel più recente (3.0.0 e sopra) kernel Linux
Ho fatto qualche lettura e ho incontrato due argomenti correlati: spinlock e preemption del kernel. Ho fatto un po 'più di googling e di lettura, ma questa volta ho solo alcune risposte stantie e contraddittorie. Quindi ho pensato di provare StackOverflow.
origine dei miei dubbi/domande è questa para da driver di periferica Linux 3a edizione Capitolo 5:
spinlocks sono, per loro natura, destinato a circolare su multiprocessore sistemi, anche se una workstation monoprocessore esecuzione un preemptive kernel si comporta come SMP, per quanto riguarda la concorrenza. Se un sistema uniprocessore non invasivo è andato in un giro su un blocco, lo girerebbe per sempre; nessun altro thread sarebbe mai stato in grado di ottenere la CPU per rilasciare il blocco. Per questo motivo, le operazioni spinlock sui sistemi uniprocessore senza preemption abilitato sono ottimizzate per fare nulla, ad eccezione di quelle che modificano lo stato di mascheramento IRQ . A causa della preventiva, anche se non ti aspetti mai che il tuo codice sia eseguito su un sistema SMP, devi ancora implementare il blocco appropriato.
I miei dubbi/domande sono:
a) è Linux kernel preemptive nello spazio kernel di default? In caso affermativo, questa preemption è limitata ai soli processi o ai gestori di interrupt possono anche essere preventivati?
b) Il kernel di Linux (su ARM) supporta interrupt annidato? Se sì, ogni gestore di interrupt (metà superiore) avrà il proprio stack o condivideranno lo stesso stack in modalità kernel 4k/8k?
c) Se disattivo SMP (Config_SMP) e preemption (Config_preempt) i blocchi di spin nei miei driver e gli interrupt handler hanno senso?
d) In che modo il kernel gestisce gli interrupt generati durante l'esecuzione della metà superiore, verranno disabilitati o mascherati?
Dopo un po 'googling ho trovato questo:
Per i kernel compilati senza CONFIG_SMP, e senza CONFIG_PREEMPT non esistono spinlocks affatto. Questa è una decisione di progettazione eccellente: quando nessun altro può essere eseguito allo stesso tempo, non c'è motivo di avere un blocco.
Se il kernel viene compilato senza CONFIG_SMP, ma CONFIG_PREEMPT è insieme, quindi spinlocks sufficiente disattivare prelazione, che è sufficiente per evitare corse. Per la maggior parte degli scopi, possiamo pensare alla prelazione come equivalente a SMP, e non ci preoccupiamo separatamente.
Ma non c'è nessuna versione o data del kernel su source.Qualcuno può confermare se è ancora valido per gli ultimi kernel di Linux?
Ecco quattro domande, quindi dividerlo in quanto potrebbero non essere risolti insieme. –