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

  免費注冊 查看新帖 |

Chinaunix

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

關(guān)于vortex_interrupt()do-while循環(huán)條件的疑問 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-06-01 11:41 |只看該作者 |倒序瀏覽
核心代碼如下
static irqreturn_t vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
    int work_done = max_interrupt_work;
    ioaddr = dev->base_addr;
    ... ... ...
    status = inw(ioaddr + EL3_STATUS);
    do {
        ... ... ...
        if (status & RxComplete)
            vortex_rx(dev);
        if (--work_done < 0) {
            /* Disable all pending interrupts. */
            ... ... ...
            /* The timer will re-enable interrupts. */
            mod_timer(&vp->timer, jiffies + 1*HZ);
            break;
        }
        ... ... ...
    } while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
    ... ... ...
}
我的問題是,當(dāng)網(wǎng)卡有一個未決中斷,無論是和種原因產(chǎn)生的,那么((status = inw(ioaddr + EL3_STATUS)) & IntLatch是否非0呢?如果是非0的話,那么((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete))肯定也就非0,那么循環(huán)條件就不是像《Understanding Linux Network Internals》說的當(dāng)網(wǎng)卡有未決中斷,并且是因為新的數(shù)據(jù)幀到達網(wǎng)卡,才會循環(huán)。
不明白我的理解錯在哪里,望高手解惑。謝謝

求職 : 通訊/電信開
論壇徽章:
2
2015亞冠之鹿島鹿角
日期:2015-07-08 11:58:2615-16賽季CBA聯(lián)賽之佛山
日期:2015-12-21 17:28:04
2 [報告]
發(fā)表于 2015-11-01 11:07 |只看該作者
問題解決了嗎?我不懂為什么  if (--work_done < 0) 會這樣?為什么會小于0.

論壇徽章:
20
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟拖拉機
日期:2015-08-17 12:21:08
3 [報告]
發(fā)表于 2015-11-03 13:01 |只看該作者
是指在輪詢的過程中產(chǎn)生了新的中斷么(比如包速率太大)?
--workdone看起來用來防止無限的卡在rx中斷處理上。

論壇徽章:
0
4 [報告]
發(fā)表于 2015-12-08 11:23 |只看該作者
本帖最后由 JIANGXIN04211 于 2015-12-08 11:32 編輯

這一個范例出自《深入理解linux網(wǎng)絡(luò)技術(shù)內(nèi)幕》,是為了說明中斷組合的,即好的組合就是在低負荷下使用中斷技術(shù),在高負載在切換定時器驅(qū)動的中斷事件。
實例代碼
static irqreturn_t vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
    int work_done = max_interrupt_work;//輪詢的最大次數(shù),默認為32
    ioaddr = dev->base_addr;
    ... ... ...
    status = inw(ioaddr + EL3_STATUS);//讀取寄存器從而得到當(dāng)前的中斷狀態(tài)
    do {
        ... ... ...
        //代表著新的幀已經(jīng)接收,驅(qū)動可以去取了。因此調(diào)用vortex_rx得到數(shù)據(jù),在這個函數(shù)里面會屏蔽掉中斷,雖然屏蔽掉中斷,我們的函數(shù)依然可以輪詢硬件的中斷寄存器,從而繼續(xù)得到相應(yīng)的中斷狀態(tài)。       
        if (status & RxComplete)
            vortex_rx(dev);
        if (--work_done < 0) {
            /* Disable all pending interrupts. */
            ... ... ...
            /* The timer will re-enable interrupts. */
            mod_timer(&vp->timer, jiffies + 1*HZ);
            break;
        }
        ... ... ...
    } while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
      //這里是判斷條件,當(dāng)有未決中斷,并且新的網(wǎng)絡(luò)幀已經(jīng)可以接受,我們就會一直循環(huán)
    ... ... ...
}
        上面代碼時中斷處理函數(shù),中斷處理函數(shù)要求盡量快的進行完成。定義一個默認值max_interrupt_work=32,為了在高負載的情況下通過--work_done能夠退出循環(huán)。
        while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));對于這個判斷條件的,我的個人理解是檢測寄存器中有未決中斷,并且新的網(wǎng)絡(luò)幀已經(jīng)可以接受,就會一直循環(huán),--work_done小于0就說明當(dāng)前在高負荷下工作,就要切換成定時器模式,釋放cpu,可以使cpu響應(yīng)其他中斷。好像和《深入理解linux網(wǎng)絡(luò)技術(shù)內(nèi)幕》的描述是不太相同,但這個實例就是為了說明中斷組合的,低負荷使用中斷,高負荷使用定時器。這些都是我個人理解,不知道是否正確,希望別誤人子弟。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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