Потоки ядра Linux - PullRequest
       6

Потоки ядра Linux

1 голос
/ 15 марта 2011

Итак, я работаю над модулем ядра 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;
}

Ответы [ 2 ]

1 голос
/ 15 марта 2011
 for (i = train.stop ;i != five_back; i = (i - 1) % 10)
 {
    int count = robots_count(train.waiting[i]);

Когда я == 1, у вас отрицательный результат Five_back и эффективно robots_count(train.waiting[-1); после 2 итераций.

0 голосов
/ 15 марта 2011

Как только вы исправите логическую проблему, указанную bestsss, у вас все еще будет проблема, что mdelay() - это ожидание занятости, которое не освобождает процессор. Вы должны рассмотреть schedule_timeout() или msleep. Подробнее смотрите в Драйвера устройств Linux .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...