[linux]Soft IRQ 란

1 분 소요

Soft IRQ란

  • 리눅스 커널의 핵심 기능 중 하나
  • 인터럽트 후반부 기법으로 쓰임

Soft IRQ 서비스

  • Soft IRQ를 실행하는 건 Sort IRQ 서비스의 요청을 받아 이를 처리하는 과정

  • 리눅스 커널에서는 다음과 같이 10가지 Soft IRQ 서비스를 지원한다

    const char * const softirq_to_name[NR_SOFTIRQS] = {
      "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "IRQ_POLL",
      "TASKLET", "SCHED", "HRTIMER", "RCU"
    };
    

Soft IRQ 라이프 사이클

soft_irq_life_cycle

  1. 부팅 과정 : 부팅 과정에서 oepn_softirq() 함수를 호출해 Soft IRQ 서비스를등록
  2. 인터럽트 처리 : 인터럽트 핸들러에서 호출한 서브 함수에서 raise_softirq() 함수를 호출해 Soft IRQ 서비스를 요청
  3. Soft IRQ 컨텍스트 : __do_softirq() 함수에서 이미 요청한 Soft IRQ 서비스를 실행

Soft IRQ의 전체 흐름

soft_irq

  • 1단계 : 인터럽트가 발생하면 해당 인터럽트 핸들러에서 Soft IRQ 서비스를 요청. 이를 위해 raise_softirq_irqoff() 함수를 호출
  • 2단계 : 인터럽트 서비스 루틴이 끝나면 irq_eixt() 함수를 호출. Soft IRQ 서비스 요청 여부를 점검. 요청한 Soft IRQ 서비스가 있으면 __do_softirq() 함수를 호출해서 해당 Soft IRQ 서비스 핸들러를 실행
  • 3단계 : Soft IRQ 서비스 핸들러 호출을 끝내면 Soft IRQ 서비스 요청이 있었는지 다시 체크. Soft_IRQ 서비스 핸들러 처리 시간이 2ms 이상이거나 10번 이상 Soft IRQ 서비스 핸들러를 처리했다면 다음 동작을 수행.
    • wakeup_softirqd() 함수를 호출하여 ksoftirqd 프로세스를 깨움
    • __do_softirq() 함수 종료
  • 4단계 : ksoftirqd 프로세스가 깨어나 3단계에서 마무리하지 못한 Soft IRQ 서비스 핸들러를 실행

Soft IRQ 서비스

Soft IRQ 서비스의 종류

https://github.com/raspberrypi/linux/blob/rpi-4.19.y/kernel/softirq.c

const char * const softirq_to_name[NR_SOFTIRQS] = {
    "HI", "TIMER", "NET_TX", "NET_RX", "BLOCK", "IRQ_POLL",
    "TASKLET", "SCHED", "HRTIMER", "RCU"
};

https://github.com/raspberrypi/linux/blob/rpi-4.19.y/include/linux/interrupt.h

enum
{
    HI_SOFTIRQ=0,
    TIMER_SOFTIRQ,
    NET_TX_SOFTIRQ,
    NET_RX_SOFTIRQ,
    BLOCK_SOFTIRQ,
    IRQ_POLL_SOFTIRQ,
    TASKLET_SOFTIRQ,
    SCHED_SOFTIRQ,
    HRTIMER_SOFTIRQ, /* Unused, but kept as tools rely on the
                numbering. Sigh! */
    RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */

    NR_SOFTIRQS
};
우선순위Soft IRQ 서비스 설명
0HI_SOFTIRQ가장 우선순위가 높으면 TASKLET_HI로 적용
1TIMER_SOFTIRQ동적 타이머로 사용
2NET_TX_SOFTIRQ네트워크 패킷 송신용으로 사용
3NET_RX_SOFTIRQ네트워크 패킷 수신용으로 사용
4BLOCK_SOFTIRQ블록 디바이스에서 사용
5IRQ_POLL_SOFTIRQIRQ_POLL 연관 동작
6TASKLET_SOFTIRQ일반 태스크릿으로 사용
7SCHED_SOFTIRQ스케줄러에서 주로 사용
8HRTIMER_SOFTIRQ현재 사용하지 않지만 하위 호환성을 위해 남겨둠
9RCU_SOFTIRQRCU 처리용으로 사용

Reference
디버깅을 통해 배우는 리눅스 커널의 구조와 원리

태그:

카테고리:

업데이트:

댓글남기기