私自身のカーネルモジュールで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