2011-03-14 58 views
1

所以我正在研究一个linux内核模块,它需要一个由kthread启动的独立线程中的无限等待循环。以下是由kthread运行的功能,train.queue_mutex是在kthread之前初始化的互斥锁(通过mutex_init(& train.queue_mutex))Linux Kernel Threads

我不能为我的生活弄清楚它为什么锁定内核。我的想法是,在每次迭代时mdelay和schedule()之间,其他进程应该获得CPU时间。

int train_thread(void *param) 
    { 
      while (!train.is_deactivating) 
      { 
        mutex_lock_interruptible(&train.queue_mutex); 
        while (train.num_waiting > 0) 
        { 
         int five_foward = (train.stop + 5) % 10; 
         int five_back = (train.stop - 5) % 10; 
         int i = train.stop; 
         int max_count = 0; 
         int max_count_index = 0; 

         for (;i != five_foward; i = (i + 1) % 10) 
         { 
           int count = robots_count(train.waiting[i]); 
           if (count > max_count) 
           { 
             max_count_index = i; 
             max_count  = count; 
           } 
         } 


         for (i = train.stop ;i != five_back; i = (i - 1) % 10) 
         { 
           int count = robots_count(train.waiting[i]); 
           if (count > max_count) 
           { 
             max_count_index = i; 
             max_count  = count; 
           } 
         } 

         // Should have max_count_index set to index of stop with the most bots 
         printk("Most bots %d at stop %d\n", max_count, max_count_index); 
         mutex_unlock(&train.queue_mutex); 
         schedule(); 
         mutex_lock_interruptible(&train.queue_mutex); 
       } 
       mutex_unlock(&train.queue_mutex); 
       mdelay(10); 
     } 

     train.is_active = 0; 
     return 0; 
} 
+0

“计划()每找到”是什么意思? – Gabe 2011-03-14 22:53:36

+0

我认为这是为了说“圆” - 编辑。 – Ben 2011-03-14 22:56:08

+1

只是为了检查,你是否在打印报告中确认你的for循环没有无限循环? – Jeff 2011-03-15 00:16:15

回答

1
for (i = train.stop ;i != five_back; i = (i - 1) % 10) 
{ 
    int count = robots_count(train.waiting[i]); 

当我== 1,你有five_back消极和有效robots_count(train.waiting[-1);后2次迭代。

0

一旦你解决了bestsss指出的逻辑问题,你仍然有一个问题,即mdelay()是一个忙等待,它不释放CPU。您应该考虑schedule_timeout()msleep。请参阅Linux Device Drivers了解更多详情。