Почему система зависает, когда я делаю рекурсивную спин-блокировку в ядре Linux - PullRequest
1 голос
/ 21 сентября 2019

Я знаю, что ядро ​​Linux не поддерживает рекурсивные спин-блокировки, и оно будет тупиковым.

Я написал пример кода, чтобы увидеть поведение, и даже если у меня несколько процессоров, система зависает.Это ожидаемое поведение

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/spinlock.h>

MODULE_LICENSE("GPL");

DEFINE_SPINLOCK(my_lock);

static int __init test_hello_init(void)
{
    spin_lock(&my_lock);
    spin_lock(&my_lock);
    pr_info("Starting critical region\n");
    pr_info("Ending critical region\n");
    spin_unlock(&my_lock);
    return -1;
}

static void __exit test_hello_exit(void)
{
}

module_init(test_hello_init);
module_exit(test_hello_exit);

watchdog: BUG: soft lookup. - CPU stuck for 22s!

1 Ответ

1 голос
/ 21 сентября 2019

Получение спин-блокировки предотвращает вытеснение нити .Таким образом, процессор не переключится на другой поток, пока данный поток не освободит все удерживаемые блокировки блокировки.

Это именно то, что сообщение об ошибке

BUG: мягкий поиск.- Процессор завис на 22 секунды!

означает: процессор не переключался на 22 секунды.

Когда процессор переключается на другой поток, он выполняет некоторые дополнительные задачи, необходимые для работы ОС,Вот почему крайне важно не удерживать спин-блокировки (и другие вещи, которые предотвращают преждевременное прерывание) слишком долго.

...