- 論壇徽章:
- 0
|
原帖由 OstrichFly 于 2008-6-11 10:09 發(fā)表 ![]()
謝謝!
我理解了你說的“IPI在開中斷以后才會被提交,即在spin_lock_irqrestore(&(irq_desc.lock), flags);之后”。
但嚴(yán)格來說,提交IPI應(yīng)該是在spin_lock_irqrestore(&(irq_desc.lock), flags)內(nèi)部,中斷 ...
呵呵,看LZ用了好多“飛快的”這樣的形容詞,以前我也會對有些看似不大可能的問題用這種詞假設(shè)。
其實不一定要“飛快的”,很多情況都可以使處理IPI的CPU“慢下來”,例如在關(guān)中斷這個期間,一個比IPI優(yōu)先級更高的中斷發(fā)生了(當(dāng)然,比IPI優(yōu)先級更高的中斷都是關(guān)不掉的),就會先去處理這個中斷。實際上這個比IPI優(yōu)先級更高的,又可以被屏蔽的中斷也只有IPI本身了。linux一共使用了三種IPI:RESCHEDULE IPI、INVALIDATE_TLB_VECTOR IPI、CALL_FUNCTION IPI。其中CALL_FUNCTION IPI是種通用IPI,也就是一個CPU通知另一個CPU干個啥事兒(本版另一個帖子問CPU的通訊方式,這就是一種),resend_irq用的就是這種。例如在中斷關(guān)閉期間,其它CPU發(fā)送了一個INVALIDATE_TLB_VECTOR IPI給該CPU,則開中斷后會先執(zhí)行它,resend_irq就被推后了,這時其它CPU有大把的時間來做disable/enable的工作。其次,即使執(zhí)行resend_irq的IPI時,其它CPU也有機會做disable/enable的,處理并發(fā)情況不能假設(shè)誰執(zhí)行的快或慢。
此外,目前的kernel已經(jīng)傾向于使用過tasklet來做resend_irq了,那其它CPU就更有機會在該CPU執(zhí)行resend_irq前做disable/enable的工作。
UP當(dāng)然沒有這個考慮,大部分復(fù)雜性都是SMP引入的 |
|