原子调度

时间:2012-08-21 15:07:51

标签: c linux-kernel kernel kernel-module

在我自己的内核模块中,我试图在中断处理函数中初始化kthread

在全球范围内我有:

static struct task_struct *thread1;

irq的函数处理程序是:

static irqreturn_t* func_irq_handler (int irq, void *dev_id)
{   
    printk("irq handler ... \n");
    thread1 = kthread_create(thread_function,NULL,"my_thread");
    if ((thread1)) {
        printk(KERN_INFO "%s\n" , __FUNCTION__);
    }
    return IRQ_HANDLED;
}

并且线程函数是:

static thread_function(void)
{
    unsigned long j1=jiffies+20000;
    int delay = 60*HZ;
    printk("%s \n",__FUNCTION__);

    while (time_before(jiffies,j1)) {
        schedule();
        printk(KERN_INFO "after schedule\n");
    }
}

request_irq看起来像这样:

request_irq(irq,func_irq_handler,IRQF_TRIGGER_HIGH | IRQF_TRIGGER_RISING ,"test_irq",(void*)&my_miscdev);

为什么我会收到此错误:

BUG: scheduling while atomic: swapper

1 个答案:

答案 0 :(得分:4)

我认为创建一个线程需要与线程调度程序进行交互,这在中断/原子上下文中是不允许的。

更好的方法是在其他地方创建内核线程,并将中断请求处理队列到它。