Я пытаюсь понять этот коммит в Linux (идентификатор фиксации 830eec24673a982bff4df85ba4d17e4a6ff201a7 ). Он преобразует спинлок в raw_spinlock. Но мне непонятно, почему спинлок делает пробуждение к заблокированной неработающей задаче. И почему raw_spinlock может решить эту проблему.
Я прочитал код Linux и обнаружил, что spin_lock - это просто оболочка raw_spin_lock. И spinlock_t - это обертка raw_spinlock_t. Кажется, что они не имеют существенной разницы. Я также узнал, что у них могут быть различия в приоритетах, но я не уверен, что это связано с этим патчем.
@@ -32,7 +32,7 @@ static void write_pen_release(int val)
sync_cache_w(&pen_release);
}
-static DEFINE_SPINLOCK(boot_lock);
+static DEFINE_RAW_SPINLOCK(boot_lock);
void versatile_secondary_init(unsigned int cpu)
{
@@ -45,8 +45,8 @@ void versatile_secondary_init(unsigned int cpu)
/*
* Synchronise with the boot thread.
*/
- spin_lock(&boot_lock);
- spin_unlock(&boot_lock);
+ raw_spin_lock(&boot_lock);
+ raw_spin_unlock(&boot_lock);
}
int versatile_boot_secondary(unsigned int cpu, struct task_struct *idle)
@@ -57,7 +57,7 @@ int versatile_boot_secondary(unsigned int cpu, struct task_struct *idle)
* Set synchronisation state between this boot processor
* and the secondary one
*/
- spin_lock(&boot_lock);
+ raw_spin_lock(&boot_lock);
/*
* This is really belt and braces; we hold unintended secondary
@@ -87,7 +87,7 @@ int versatile_boot_secondary(unsigned int cpu, struct task_struct *idle)
* now the secondary core is starting up let it run its
* calibrations, then wait for it to finish
*/
- spin_unlock(&boot_lock);
+ raw_spin_unlock(&boot_lock);
return pen_release != -1 ? -ENOSYS : 0;
}