2016-10-30 49 views
3

我在linux看着調度代碼:什麼時候是preempt_count()&PREEMPT_ACTIVE == 0?

if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) { 
    if (unlikely(signal_pending_state(prev->state, prev))) { 
     prev->state = TASK_RUNNING; 
    } else { 
     deactivate_task(rq, prev, DEQUEUE_SLEEP); 
     prev->on_rq = 0; 

按我的理解,如果prev任務不間斷,這個代碼將停用任務(從運行隊列中刪除)提供

preempt_count() & PREEMPT_ACTIVE == 0 

能有人向我解釋什麼是preempt_countthread_info什麼時候這個條件滿足或不?

+0

preempt_counts高位用於像IRQ計數這樣的事情,其中​​一個位用於指示PREEMPT是否處於活動狀態,這是線路正在檢查的內容。 –

+0

但我認爲schedule()不能在IRQ處理程序中調用,因爲日程安排可以睡眠。 (你只是被中斷權搶佔了嗎?否則你會安排好嗎?) –

回答

0

preempt_countpreempt_disable()preempt_enable()所使用的計數器,它使它們能夠嵌套使用。 preempt_count的高位用於硬件和軟件計數器,NMI位和PREEMPT_ACTIVE位。這些在include/linux/preempt_mask.h中定義。在x86架構中,PREEMPT_NEED_RESCHED位也用於preempt_count,用於優化決定重新計劃。

現在,我不清楚確切的需要PREEMPT_ACTIVEpreempt_count。在我工作的內核版本3.17中,PREEMPT_ACTIVE在調用__schedule()之前被設置爲preempt_count,並在調用之後立即復位,在所有情況下,除了從schedule()調用它之外。這意味着,在__schedule()中,PREEMPT_ACTIVE被設置在preempt_count中,當__schedule()由於內核搶佔而被調用時,即,不是故意用於某些其他OS功能,其將使用schedule()。這些「其他操作系統功能」會有所不同,具體取決於您是使用CONFIG_PREEMPTCONFIG_PREEMPT_VOLUNTARY還是CONFIG_PREEMPT_NONE構建內核,但是它包含對互斥量的顯式阻塞。

相關問題