У меня есть два потока ядра, и я пытаюсь поочередно печатать из этих двух потоков. Я использую spinlock для синхронизации этих двух потоков.Темы ядра Linux с замораживанием спин-блокировки
int kthread_1_function(void *data)
{
while(1)
{
spin_lock(&lock1);
pr_alert("In Kernel Thread 1!!!\n");
spin_unlock(&lock2);
if(kthread_should_stop())
{
spin_unlock(&lock2);
return 1;
}
}
return 0;
}
int kthread_2_function(void *data)
{
while(1)
{
spin_lock(&lock2);
pr_alert("In Kernel Thread 2!!!\n");
spin_unlock(&lock1);
if(kthread_should_stop())
{
spin_unlock(&lock1);
return 2;
}
}
return 0;
}
В модуле инициализации, я создаю эти потоки ядра (kthread_run) и cleanup_module остановить эти потоки (kthread_stop).
Когда я пытаюсь удалить модуль, вся система зависает. Просмотрев исходный код ядра, я увидел, что spin_lock отключает preemption, и kthread_stop пытается пробудить поток, который должен быть убит, и ждет, пока поток выйдет и вернется. Не уверен, что заставляет мою систему зависать. Логически это должно было хорошо работать.
Примечание: Когда я инициализирую шпиндельные блоки, я устанавливаю lock1 как UNLOCKED и lock2 как LOCKED.
Одна проблема, которую я вижу, заключается в том, что 'kthread_1_function' открывает' lock2' для 'kthread_should_stop()' условие, и соответственно 'kthread_2_function' разблокирует' lock1'. Но они были просто разблокированы. Я думаю, что вы хотите, вы должны попробовать их заменить. – Anton