У меня есть очередь элементов, которая заполняется процессом, управляемым прерываниями, и очищается 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 обрабатывать объекты в очереди, не занимая столько времени на процессоре?