2012-11-07 10 views
7

Il codice originale nel kernel di Linux è:Kernel Linux: Spinlock SMP: Perché esiste una versione preventiva() nella versione SMP spin_lock_irq?

static inline void __raw_spin_lock_irq(raw_spinlock_t *lock) 
{ 
    local_irq_disable(); 
    preempt_disable(); 
    spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); 
    LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock); 
} 

penso che ci sia alcun percorso di esecuzione può prevenire percorso corrente dopo IRQ locale è disattivato.

Poiché tutti gli IRQ hardware comuni sono disabilitati, non dovrebbe verificarsi alcun softirq e anche nessun segno di spunta da assegnare alla rotellina di pianificazione. Penso che il percorso attuale sia sicuro. Quindi, perché c'è un preempt_disable()?

Grazie.

+0

@ cnicutar.Are sicuro? Io non la penso così Ogni core della CPU utilizza schedule() per selezionare un lavoro da eseguire. In un sistema SMP con multicore, ogni core ha un percorso di esecuzione dedicato proprio come il sistema UP. In questo caso, l'IRQ locale è disabilitato, quindi la rotellina di pianificazione su questo core è bloccata. Probabilmente la preemption si verifica su un'altra CPU, ma questo non influirà sul percorso di esecuzione su questo, penso che siano dedicati al livello di esecuzione. –

risposta

6

Per quanto posso dire, le chiamate preempt_disable() sono state aggiunte a un paio di primitive di blocco, tra cui spin_lock_irq, da Dave Miller il 4 dicembre 2002 e rilasciate in 2.5.51. Il messaggio di commit non è utile; dice semplicemente "[SPINLOCK]: Correzione di macro spin/rwlock non SMP nopping."

Credo che la documentazione Proper Locking Under a Preemptible Kernel lo spieghi abbastanza bene. L'ultima sezione intitolata "PREVENIRE prelazione usando l'interrupt DISATTIVAZIONE" inizia,

It is possible to prevent a preemption event using local_irq_disable and 
local_irq_save. Note, when doing so, you must be very careful ... 
+0

, il tuo commento è molto utile. Grazie mille. :) –

1

Ho scremato il patch citato da Sharp e ha scoperto che disattivando IRQ può disattivare prelazione implicitamente, ma è rischioso.

Tuttavia, tenere presente che affidarsi alle irq disattivate è un'attività rischiosa . Qualsiasi spin_unlock() che diminuisce il conteggio di prelazione a 0 può attivare una riprogrammazione. Anche un semplice printk() potrebbe far scattare un tale da riprogrammare. Quindi, fai affidamento sulla disabilitazione implicita della prelazione solo se tu sei il a sapere che questo genere di cose non può accadere nel tuo percorso di codice. La politica migliore di consiste nel basarsi sulla disattivazione implicita della sospensione preventiva solo per e per il tempo in cui rimangono all'interno del proprio codice.

Problemi correlati