亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 20697 | 回復(fù): 4
打印 上一主題 下一主題

驅(qū)動程序出現(xiàn)scheduling while atomic的提示 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2007-12-14 21:45 |只看該作者 |倒序瀏覽
設(shè)備結(jié)構(gòu)定義如下:
typedef   struct   smschar_dev
{
    volatile   int   pending_messages; //! <   number   of   pending   messages   for   this   channel
   struct   cdev   cdev; //! <     Char   device   structure   -
   wait_queue_head_t   wtq; //! <   wait   queue   for   read   and   poll   to   block   on
   spinlock_t   lock; //! <   critical   section
   struct   list_head   pending_data; //! <   list   of   pending   data
}CharDev_ST;
在從一個緩沖區(qū)讀取數(shù)據(jù)的函數(shù)中,代碼大概如下
ssize_t   chr_read(struct   file   *   filp,   char   __user   *   buf,   size_t   count,   loff_t   *   f_pos)
{
        CharDev_ST   *dev   =   filp-> private_data;
        spin_lock(&dev-> lock);
      if(wait_event_interruptible(dev-wtq,!list_empty(&dev-> pending_data)))
   {
            spin_unlock(&dev-> lock);
          return   -ERESTARTSYS;
   }
///在這里讀取數(shù)據(jù)
      spin_unlock(&dev-> lock);
}


下面是數(shù)據(jù)到達(dá)時,往該設(shè)備的緩沖區(qū)填充數(shù)據(jù)的函數(shù),大概實現(xiàn)過程:


spinlock_t   global_read_ctrl_lock   =   SPIN_LOCK_UNLOCKED;

static   void   fill_buffer(u8*   buf,int   len)
{
        unsigned   long                       flags;
        spin_lock_irqsave(&global_read_ctrl_lock,flags);
        //在這里填充數(shù)據(jù)
        wake_up_interruptible   (&(pDev-> wtq));
spin_unlock_irqrestore(&global_read_ctrl_lock,flags);
}


        在運行的過程中,內(nèi)核打印了BUG:   scheduling   while   atomic,的提示,而且每次讀取一次數(shù)據(jù),就打印一次。我的理解是,內(nèi)核認(rèn)為在chr_read函數(shù)中,會出現(xiàn)占用了dev-> lock的情況下由于wait_event_interruptible造成睡眠的情況。

        不知各位有沒有好的解決這個問題的方法?把內(nèi)核的“BUG:   scheduling   while   atomic”提示去掉,我嘗試把chr_read函數(shù)的spin_lock和wait_event_interruptible進(jìn)行對調(diào),那個打印信息倒是去掉了,但是覺得這樣有問題。請各位指點下啊

論壇徽章:
0
2 [報告]
發(fā)表于 2007-12-16 11:27 |只看該作者
為什么用自旋鎖呢,應(yīng)該用信號量,down_interruptable和up

論壇徽章:
0
3 [報告]
發(fā)表于 2007-12-18 11:23 |只看該作者
遇到同樣的問題。目前也沒有找出合適的解決方式。
我不明白的是在spin_lock完成之后,原子操作不就結(jié)束了嗎?為什么還會出現(xiàn)此種BUG呢?

關(guān)注中……

論壇徽章:
0
4 [報告]
發(fā)表于 2007-12-20 21:31 |只看該作者
系統(tǒng)提示是,在獲得鎖之后由于wait_up_interutible可能會導(dǎo)致驅(qū)動休眠,可能進(jìn)入死鎖的狀態(tài)。我的解決方法如下:
   spin_lock(&dev-> lock);
      if(wait_event_interruptible(dev-wtq,!list_empty(&dev-> pending_data)))
   {
            spin_unlock(&dev-> lock);
          return   -ERESTARTSYS;
   }
   while(lisg_empty(....))
{
     spin_unlock(...);
     wait_event_interruptible;
    spin_lock(....);
}
或者也可以用信號量,上面的朋友說的

論壇徽章:
0
5 [報告]
發(fā)表于 2007-12-21 09:58 |只看該作者
考慮多處理器嗎?
否則應(yīng)該使用down_interruptable和up
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP