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.
@ 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. –