2012-11-07 20 views
7

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.

+0

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

Antwort

6

Soweit ich sagen kann, preempt_disable() Anrufe wurden ziemlich viele Sperrgrundelemente, einschließlich spin_lock_irq, von Dave Miller am 4. Dezember 2002 hinzugefügt und in 2.5.51 veröffentlicht. Die Commit-Nachricht ist nicht hilfreich. es sagt nur "[SPINLOCK]: Fix Nicht-SMP Nopping Spin/Rwlock-Makros."

Ich glaube, die Proper Locking Under a Preemptible Kernel Dokumentation erklärt dies gut genug. Der letzte Abschnitt mit dem Titel „VERHINDERN PREEMPTION weiter verwenden INTERRUPT DISABLING“ beginnt,

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

, Ihr Kommentar ist sehr hilfreich.Vielen Dank. :) –

1

ich entrahmte die patch von Sharp erwähnt und festgestellt, dass irq deaktivieren Vorkaufsrecht implizit deaktivieren können, ist aber riskant.

Beachten Sie jedoch, dass auf Irqs deaktiviert ist ein riskantes Geschäft. Eine beliebige spin_unlock(), die die Vorbelegungsanzahl auf 0 verringert, kann eine Neuplanung auslösen. Selbst ein einfacher printk() könnte so einen einen neuen Termin auslösen. Also verlassen Sie sich auf implizite Preemption-Deaktivierung nur, wenn Sie wissen, dass diese Art von Sache nicht in Ihrem Code-Pfad passieren kann. Die beste Richtlinie ist, sich auf implizite Vorkaufssperre zu verlassen, nur für kurze Zeiten und nur so lange, wie Sie in Ihrem eigenen Code bleiben.