Der ursprüngliche Code in Linux-Kernel ist:Linux Kernel: Spinlock SMP: Warum gibt es eine preempt_disable() in spin_lock_irq SMP-Version?
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);
}
Ich denke, es kein Ausführungspfad ist, kann Strompfad preempt nach lokalen IRQ deaktiviert ist.
Da alle gängigen harten IRQs deaktiviert sind, sollte keine Softirq auftreten und auch kein Häkchen zum Kickscheduler. Ich denke, der aktuelle Weg ist sicher. Warum gibt es also eine preempt_disable()?
Vielen Dank.
@ cnicutar.Sind Sie sicher? Ich denke nicht. Jeder CPU-Kern verwendet schedule(), um einen auszuführenden Job auszuwählen. In einem SMP-System mit Multicores hat jeder Kern einen dedizierten Ausführungspfad genau wie UP-System. In diesem Fall ist der lokale IRQ deaktiviert, daher ist das Zeitplan-Rad auf diesem Kern blockiert. Möglicherweise tritt eine Vorbelegung in einer anderen CPU auf, aber dies hat keinen Einfluss auf den Ausführungspfad in diesem, ich denke, sie sind auf Ausführungsebene dediziert. –