kthreads (2.6.27 vs 2.6.9)

Модератор: Модераторы разделов

Аватара пользователя
CycaHuH
Сообщения: 85
ОС: FreeBSD; Archlinux; Calculate

kthreads

Сообщение CycaHuH »

Имеется код:

Код: Выделить всё

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/delay.h>

static int thread_func(void *data)
{
    int i = 0;
    while (1) {
        if (kthread_should_stop()) {
            return 1;
        }
        ssleep(2);
    }
}

struct task_struct *task;

int __init hello_init_module(void)
{
        task = kthread_run(&thread_func, NULL, "test_thread");
        return 0;
}

void __exit hello_cleanup_module(void)
{
        kthread_stop(task);
}

module_init(hello_init_module);
module_exit(hello_cleanup_module);

MODULE_LICENSE("GPL");


На ядре 2.6.9 (CentOS) все работает, на 2.6.27 (Arch) rmmod намертво виснет, видимо ждет завершения потока.
Кто-нибудь знает как теперь правильно завершать поток?
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: kthreads

Сообщение RasenHerz »

читай внимательно Linux Device Drivers, глава 7.
ты отправляешь поток спать на 2 сек и устанавливаешь состояние задачи в TASK_UNINTERRUPTIBLE.
попробуй так:

Код: Выделить всё

static int thread_func(void *data)
{
    int i = 0;
    while (1) {
        ssleep(2);
        set_current_state(TASK_INTERRUPTIBLE);
        schedule();
       if (kthread_should_stop()) {
            return 1;
       }
    }
}
Спасибо сказали:
Аватара пользователя
CycaHuH
Сообщения: 85
ОС: FreeBSD; Archlinux; Calculate

Re: kthreads

Сообщение CycaHuH »

В общем после перезагрузки все заработало, видимо на работу влияли результаты предыдущих экспериментов.

Состояние задачи влиять не должно, т.к. kthread_stop просто заставляет kthread_should_stop() возвращать 1
Спасибо сказали: