Что такое kthreadd_task - PullRequest
       0

Что такое kthreadd_task

7 голосов
/ 12 ноября 2010

В определении kthread_create задача просыпается, кто-нибудь знает, что делает эта задача?

struct task_struct *kthread_create

{


    struct kthread_create_info create;

    create.threadfn = threadfn;
    create.data = data;
    init_completion(&create.done);

    spin_lock(&kthread_create_lock);
    list_add_tail(&create.list, &kthread_create_list);
    spin_unlock(&kthread_create_lock);

    **wake_up_process(kthreadd_task);**
    wait_for_completion(&create.done);

    if (!IS_ERR(create.result)) {
            struct sched_param param = { .sched_priority = 0 };
            va_list args;

            va_start(args, namefmt);
            vsnprintf(create.result->comm, sizeof(create.result->comm),
                      namefmt, args);
            va_end(args);
            /*
             * root may have changed our (kthreadd's) priority or CPU mask.
             * The kernel thread should not inherit these properties.
             */
            sched_setscheduler_nocheck(create.result, SCHED_NORMAL, &param);
            set_cpus_allowed_ptr(create.result, cpu_all_mask);
    }
    return create.result;
}

Ответы [ 2 ]

4 голосов
/ 15 сентября 2012

kthreadd - это демон ядра, он запускается во время загрузки ядра.

init/main.c ---> kernel_thread(kthreadd,...)

(architecture dependent code for e.g arch/arm/kernel/process.c)

Как вы можете видеть здесь, kernel_thread() возвращает pid.Начиная с pid мы определяем task_struct и присваиваем его kthreadd_task.

Так что всякий раз, когда вызывается создание потока ядра, т.е. kthread_create(), kthreadd_task, который вызывает inturn kthreadd() (определено в kernel/kthread.c).

3 голосов
/ 12 ноября 2010

kthreadd_task - указатель на task_struct функции запуска потока ядра kthreadd(), определенной в http://lxr.linux.no/#linux+v2.6.36/kernel/kthread.c#L231

kthreadd() - это основная функция (и основной цикл) демона kthreadd, который является демоном потока ядра , родителем всех других потоков ядра.

Итак, в приведенном коде есть создание запроса к демону kthreadd. Для выполнения этого запроса kthreadd прочитает его и запустит поток ядра. Тогда это изменит флаг. В коде у вас есть ожидание под этим флагом. После изменения флага ваша функция проверит состояние создания нового kthread.

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