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

  免費注冊 查看新帖 |

Chinaunix

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

[中斷] 請教local_bh_enable()在中斷上下文和中斷關(guān)閉時調(diào)用引起警告的原因 [復(fù)制鏈接]

論壇徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技術(shù)圖書徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44雙子座
日期:2013-12-27 12:32:29雙子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-05-19 12:10 |只看該作者 |倒序瀏覽
local_bh_enable()中簡單的調(diào)用了_local_bh_enable_ip()
  1. static inline void _local_bh_enable_ip(unsigned long ip)
  2. {
  3.         WARN_ON_ONCE(in_irq() || irqs_disabled());
  4. ......
  5. }
復(fù)制代碼
請問這個WARNING的理由?

論壇徽章:
0
2 [報告]
發(fā)表于 2012-05-21 17:20 |只看該作者
本帖最后由 honkiko 于 2012-05-22 12:25 編輯

回復(fù) 1# asuka2001

對于irqs_disabled()的檢查,我的理解,在irqs_disabled()的狀態(tài)下,調(diào)用可能打開中斷的函數(shù)/宏,都是有風(fēng)險的。而local_bh_enable()就是這樣的函數(shù)/宏。

在 (!in_irq && irqs_disabled()) 狀態(tài),而如果這個local_bh_enable()減掉的是最后一個SOFTIRQ_DISABLE_OFFSET, 就會進入do_softirq() -> __do_softirq(),  里面會無條件打開中斷,然后執(zhí)行所有pending的軟中斷處理函數(shù)。

下面的代碼在這樣的情況下會跟預(yù)期的情況不一樣:
/**軟中斷或進程上下文中*/
local_irq_disable();
...操作鏈表A                    \
local_bh_enable();            臨界區(qū)
...繼續(xù)操作鏈表A              /
local_irq_enable();

假設(shè)某個中斷也會操作鏈表A, 本來這個進程預(yù)期通過關(guān)中斷,確保這個臨界區(qū)不可能被中斷所打斷,來保護鏈表A。
但是,local_bh_enable()可能會打開中斷。 這期間那個中斷如果發(fā)生,也會去操作鏈表A, 而且是前面的進程也正處在臨界區(qū)的時候。

在中斷上下文,為什么不讓調(diào)local_bh_enable()?想了一下,好像也有類似的原因:
/**進程上下文中*/
local_bh_disable()
...臨界區(qū)X
local_bh_enable()

本來進程中認為在臨界區(qū)X中的代碼,是不會被軟中斷所打斷的。 或者說進程在執(zhí)行臨界區(qū)X的代碼時,不用擔(dān)心有軟中斷會進入臨界區(qū)。
但是,如果在某個中斷里面,調(diào)用了local_bh_enable(), 那所有進程上下文的類似的臨界區(qū),都得不到這樣的保證了。
因為在這段臨界區(qū),是可能發(fā)生中斷的,然后如果local_bh_enable,正好減掉了最后一個SOFTIRQ_DISABLE_OFFSET, 在中斷返回時,就會調(diào)用do_softirq了。



論壇徽章:
0
3 [報告]
發(fā)表于 2012-05-21 17:46 |只看該作者
回復(fù) 1# asuka2001


    這個檢查不是簡單的防止什么意外,而是為了檢查代碼是否遵從了規(guī)則。這東西本來就是這么設(shè)計的,所有的開發(fā)都必須遵從一定的規(guī)則,大家都這么搞就不會出亂子,就像是交通法規(guī)里面的靠右行駛一樣。這里軟中斷原本就是用來在不太緊急(中斷處理屬于特殊的緊急事件)的時候處理一些事情,也就是說它原本就應(yīng)該可以被中斷,也就是說應(yīng)該在硬中斷打開的情況下干活,這就是規(guī)則。

論壇徽章:
0
4 [報告]
發(fā)表于 2012-05-21 18:10 |只看該作者
本帖最后由 honkiko 于 2012-05-21 18:11 編輯

回復(fù) 3# 灌水菜鳥

local_bh_enable并不會破壞你所說的規(guī)則:在硬中斷打開的情況下干軟中斷的活。 __do_softirq()里面無條件先打開中斷,然后干活的。

   

論壇徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技術(shù)圖書徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44雙子座
日期:2013-12-27 12:32:29雙子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
5 [報告]
發(fā)表于 2012-05-22 09:18 |只看該作者
回復(fù) 2# honkiko

非常感謝:)

論壇徽章:
0
6 [報告]
發(fā)表于 2013-01-23 13:30 |只看該作者
honkiko 發(fā)表于 2012-05-21 17:20
回復(fù) 1# asuka2001

對于irqs_disabled()的檢查,我的理解,在irqs_disabled()的狀態(tài)下,調(diào)用可能打開中 ...


2.6.36.1內(nèi)核存在著不少你說的這種不允許中斷上下文調(diào)local_bh_enable的情況:

__nf_conntrack_find經(jīng)常在中斷上下文調(diào)用,它調(diào)用了local_bh_disable 和 local_bh_enable

論壇徽章:
0
7 [報告]
發(fā)表于 2015-02-03 19:11 |只看該作者
回復(fù) 2# honkiko

中斷上下文 應(yīng)該不會有問題
if (unlikely(!in_interrupt() && local_softirq_pending()))
                do_softirq();
保證中斷環(huán)境 不會進入do_softirq

而之所以產(chǎn)生警告。我認為是 中斷環(huán)境沒必要local_bh_disable()
所以也就不用local_bh_enable()
這個時候應(yīng)該只是一個警告


而進程上下文 應(yīng)該是你說的是對的。之前還以為也僅僅是個警告。一看你的回答,才發(fā)現(xiàn)不妙,要檢查代碼去了


   

論壇徽章:
0
8 [報告]
發(fā)表于 2015-02-03 19:14 |只看該作者
回復(fù) 2# honkiko
其實__do_softirq會local_irq_enable無條件看中斷,也很奇怪的說
do_softirq 調(diào)用__do_softirq之前 還是用的local_irq_save

這點太奇怪了
您需要登錄后才可以回帖 登錄 | 注冊

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