kthread с использованием 100% проверки ядра процессора kthread_should_stop () - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть очередь элементов, которая заполняется процессом, управляемым прерываниями, и очищается kthread.

Проблема в том, что kthread, который очищает очередь, занимает 100% процессорного времени одного измои ядра.Похоже, что когда очередь пуста, цикл while () постоянно проверяет kthread_should_stop () несколько раз и освобождает ядро ​​только когда я останавливаю поток.

#DEFINE MY_BUF_SIZE 100

struct item_struct {
    unsigned char buff[MY_BUF_SIZE];
    struct list_head list;
};  

struct  item_struct itemList;
struct task_struct *forward_items_thread;

void forward_items(void * args) {
    while (!kthread_should_stop()){
        struct item_struct *item, *tmpItem;

        list_for_each_entry_safe(item, tmpItem, &itemList.list, list)
        {
            my_send_items(item);
            list_del(&item->list);
            kfree(item);
        }
    }
}

void setup_item_forwarding(void){
    int err;

    INIT_LIST_HEAD(&itemList.list); 
    forward_items_thread = kthread_create(forward_items);
    if (IS_ERR(forward_items_thread)) {
        printk("kthread create failed");
        err = PTR_ERR(forward_items_thread);
        goto err_return;
    }

    err = wake_up_process(forward_items_thread);
    if (err == 1) {
        printk("forward_items_thread has woken.\n");
    }
    else {
        printk("forward_items_thread failed to wake.\n");
    }

err_return:
//do cleanup
}

Я не хочу использовать сны / задержкипотому что процесс, в котором это используется, зависит от времени ~ 1 мс.

Как мне заставить kthread обрабатывать объекты в очереди, не занимая столько времени на процессоре?

1 Ответ

0 голосов
/ 21 декабря 2018

вы можете использовать schedule() после прерывания потока.

void forward_items(void * args) {
    while (!kthread_should_stop()){
        struct item_struct *item, *tmpItem;

        // set interruptible
        set_current_state(TASK_INTERRUPTIBLE);

        // do I have anything to do ?
        if(my_func_no_task_to_do())
        {
             schedule();
        }

        list_for_each_entry_safe(item, tmpItem, &itemList.list, list)
        {
            my_send_items(item);
            list_del(&item->list);
            kfree(item);
        }
     }
}
...