軟中斷排程時機

StepForwards發表於2024-04-30

軟中斷處理流程

目錄
  • 軟中斷處理流程
    • 軟中斷處理的時機
    • 中斷退出時軟中斷排程機制

軟中斷處理的時機

標準linux核心關搶佔的情況下,軟中斷只在下面兩個時機排程

  1. 中斷退出時(中斷上下文)
  2. 軟中斷執行緒處理

中斷退出時軟中斷排程機制

  1. 判斷是否屬於中斷上下文以及是否有軟中斷處與pending狀態
  2. 判斷軟中斷執行緒是否處於runing狀態(4.9核心引入)
  3. 進行軟中斷處理
  4. 最多restart 10次或者累計執行2ms
  5. 判斷是否還有軟中斷處於pending狀態

image

//kernel/softirq.c
#define MAX_SOFTIRQ_TIME  msecs_to_jiffies(2)
#define MAX_SOFTIRQ_RESTART 10

void irq_exit(void)
{
... ...
    if (!in_interrupt() && local_softirq_pending())  //如果不在中斷上下文並且軟中斷處於pending狀態
        invoke_softirq();  
... ...
}

static inline void invoke_softirq(void)
{
... ...
        __do_softirq();   //執行軟中斷處理
... ...
}
asmlinkage __visible void __do_softirq(void)
{
unsigned long end = jiffies + MAX_SOFTIRQ_TIME; //__do_softirq最大執行時間2ms
int max_restart = MAX_SOFTIRQ_RESTART; //最大軟中斷處理次數
... ...
restart:
    local_irq_enable(); //使能中斷,使能後軟中斷可以被硬中斷搶佔
... ...
      h->action(h);  //執行軟中斷處理函式
... ...
      local_irq_disable(); //禁用中斷
... ...
      pending = local_softirq_pending();
      if (pending) {
            if (time_before(jiffies, end) && !need_resched() &&
            --max_restart)  //如果軟中斷處理次數或處理時間未達到
                goto restart; 
            wakeup_softirqd(); //喚醒軟中斷執行緒進行軟中斷處理
... ...
}

相關文章