Oryginalny kod w jądrze Linux:Linux Kernel: Spinlock SMP: Dlaczego istnieje wersja preempt_disable() w wersji 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);
}
myślę, że nie ma ścieżki wykonanie może wywłaszczyć bieżącą ścieżkę po lokalny IRQ jest wyłączone.
Ponieważ wszystkie popularne twarde przerwań IRQ są wyłączone, nie powinno występować żadne zmiękczenie, a także nie ma znacznika wyboru, aby kopać kółko harmonogramu. Myślę, że obecna ścieżka jest bezpieczna. Dlaczego więc istnieje preempt_disable()?
Dziękuję.
@ cnicutar.Na pewno? Nie sądzę. Każdy rdzeń procesora używa harmonogramu() do wybrania zadania do uruchomienia. W systemie SMP z wieloma procesorami każdy rdzeń ma dedykowaną ścieżkę wykonywania, podobnie jak system UP. W tym przypadku lokalny przerwań IRQ jest wyłączony, więc koło harmonogramu na tym rdzeniu jest zablokowany. Może być preemption na innym CPU, ale to nie wpłynie na ścieżkę wykonania na tym, myślę, że są one dedykowane na poziomie wykonania. –