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

Chinaunix

標(biāo)題: 請(qǐng)教local_bh_enable()在中斷上下文和中斷關(guān)閉時(shí)調(diào)用引起警告的原因 [打印本頁]

作者: asuka2001    時(shí)間: 2012-05-19 12:10
標(biāo)題: 請(qǐng)教local_bh_enable()在中斷上下文和中斷關(guān)閉時(shí)調(diào)用引起警告的原因
local_bh_enable()中簡(jiǎn)單的調(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ù)制代碼
請(qǐng)問這個(gè)WARNING的理由?
作者: honkiko    時(shí)間: 2012-05-21 17:20
本帖最后由 honkiko 于 2012-05-22 12:25 編輯

回復(fù) 1# asuka2001

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

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

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

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

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

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




作者: 灌水菜鳥    時(shí)間: 2012-05-21 17:46
回復(fù) 1# asuka2001


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

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

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

   
作者: asuka2001    時(shí)間: 2012-05-22 09:18
回復(fù) 2# honkiko

非常感謝:)
作者: mordorw    時(shí)間: 2013-01-23 13:30
honkiko 發(fā)表于 2012-05-21 17:20
回復(fù) 1# asuka2001

對(duì)于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
作者: anyhit    時(shí)間: 2015-02-03 19:11
回復(fù) 2# honkiko

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

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


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


   
作者: anyhit    時(shí)間: 2015-02-03 19:14
回復(fù) 2# honkiko
其實(shí)__do_softirq會(huì)local_irq_enable無條件看中斷,也很奇怪的說
do_softirq 調(diào)用__do_softirq之前 還是用的local_irq_save

這點(diǎn)太奇怪了




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2