Почему спин-блокировка должна быть заменена raw_spinlock в этом патче для Linux? - PullRequest
2 голосов
/ 24 мая 2019

Я пытаюсь понять этот коммит в 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;
 }
...