Was ist der Unterschied zwischen spin_lock und raw_spin_lock ()?

8

Es gibt eine rohe Variante jedes Spin-Locks, die im Linux-Kernel verfügbar ist. Ich möchte wissen, wie es funktioniert. zB:

raw_spin_lock (), raw_spin_lock_irqsave () usw.

    
Saurabh Sengar 02.11.2015, 17:32
quelle

2 Antworten

6

spin_lock* -Funktionen machen dasselbe wie raw_spin_lock* eins plus, wenn Sperrdebugging aktiviert ist (CONFIG_DEBUG_LOCK_ALLOC), führen Sie zusätzliche Laufzeitprüfungen für Sperroperationen durch, z. B. Prüfungen auf Deadlock . Diese Prüfungen werden von lockdep subsystem durchgeführt.

In der Regel sollten spin_lock* -Funktionen verwendet werden, wann immer es möglich ist .

Nur in seltenen Fällen einer sehr kniffligen Sperrrichtlinie können lockdep -Funktionen verwendet werden, wenn raw_spin_lock* falsche Warnungen ausgeben kann.

Außerdem können raw_* -Funktionen den üblichen Funktionen vorgezogen werden, um Speicherauslastung oder Performance-Gründe zu reduzieren. Aber es sollte tatsächliche Zeit / Raum Messungen, reflektierte signifikante Gewinne von diesen Optimierungen verwendet werden.

    
Tsyvarev 02.11.2015 19:28
quelle
3

Der Hauptunterschied besteht darin, dass spin_lock variants auf raw_spin_lock variants für nicht-RT abgebildet werden, während wenn CONFIG_PREEMPT_RT gesetzt ist, dann werden sie auf rt_spin_lock abgebildet, die schlafen können.

Durch die Entkopplung der spin_lock von schlafenden vs nicht-schlafenden Variationen, abhängig davon, ob wir RT sind oder nicht, kann die spin_lock API über den Kernel-Code hinweg konsistent gehalten werden.

    
Joel Fernandes 17.09.2016 21:08
quelle