2012-11-07 16 views
7

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ę.

+0

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

Odpowiedz

6

O ile mi wiadomo, połączenia preempt_disable() zostały dodane do kilku prostych operacji blokowania, w tym spin_lock_irq, przez Dave'a Millera 4 grudnia 2002 r. I wydane w wersji 2.551. Komunikat zatwierdzenia nie jest pomocny; po prostu mówi "[SPINLOCK]: Napraw makra non-SMP spin/rwlock".

Uważam, że dokumentacja Proper Locking Under a Preemptible Kernel wyjaśnia to wystarczająco dobrze. Końcowa sekcja zatytułowana „ZAPOBIEGANIE wywłaszczania KORZYSTANIA INTERRUPT WYŁĄCZENIE” rozpoczyna

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

, Twój komentarz jest bardzo pomocny. Dziękuję bardzo. :) –

1

I odtłuszczonego patch wspomniany przez Sharpa i stwierdził, że wyłączenie przerwań może wyłączyć pierwokupu niejawnie ale jest ryzykowne.

jednak pamiętać, że opierając się na IRQ będących wyłączona jest ryzykowne biznesu. Każdy spin_unlock(), który zmniejsza liczbę pierwszeństwa do 0 , może wywołać zmianę harmonogramu. Nawet prosty printk() może wywołać zmianę harmonogramu na . Dlatego polegaj na domyślnym wyłączaniu - wyłączanie tylko wtedy, gdy wiesz, że tego typu rzeczy nie mogą się zdarzyć w ścieżce kodu. Najlepszą zasadą jest poleganie na domyślnym wyłączaniu - wyłączanie tylko dla krótkich czasów i tylko tak długo, jak długo pozostajesz w swoim własnym kodzie.