Итак, я работаю над модулем ядра Linux, который требует бесконечного цикла ожидания в отдельном потоке, инициированном kthread. Ниже приведена функция, выполняемая kthread, а train.queue_mutex - это мьютекс, инициализированный перед kthread (через mutex_init (& train.queue_mutex))
Я не могу понять, почему он блокирует ядро. Я думаю, что между mdelay и schedule () на каждой итерации другие процессы должны получать процессорное время.
int train_thread(void *param)
{
while (!train.is_deactivating)
{
mutex_lock_interruptible(&train.queue_mutex);
while (train.num_waiting > 0)
{
int five_foward = (train.stop + 5) % 10;
int five_back = (train.stop - 5) % 10;
int i = train.stop;
int max_count = 0;
int max_count_index = 0;
for (;i != five_foward; i = (i + 1) % 10)
{
int count = robots_count(train.waiting[i]);
if (count > max_count)
{
max_count_index = i;
max_count = count;
}
}
for (i = train.stop ;i != five_back; i = (i - 1) % 10)
{
int count = robots_count(train.waiting[i]);
if (count > max_count)
{
max_count_index = i;
max_count = count;
}
}
// Should have max_count_index set to index of stop with the most bots
printk("Most bots %d at stop %d\n", max_count, max_count_index);
mutex_unlock(&train.queue_mutex);
schedule();
mutex_lock_interruptible(&train.queue_mutex);
}
mutex_unlock(&train.queue_mutex);
mdelay(10);
}
train.is_active = 0;
return 0;
}