[linux]Soft IRQ 란
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 라이프 사이클
- 부팅 과정 : 부팅 과정에서 oepn_softirq() 함수를 호출해 Soft IRQ 서비스를등록
- 인터럽트 처리 : 인터럽트 핸들러에서 호출한 서브 함수에서 raise_softirq() 함수를 호출해 Soft IRQ 서비스를 요청
- Soft IRQ 컨텍스트 : __do_softirq() 함수에서 이미 요청한 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 서비스 | 설명 |
0 | HI_SOFTIRQ | 가장 우선순위가 높으면 TASKLET_HI로 적용 |
1 | TIMER_SOFTIRQ | 동적 타이머로 사용 |
2 | NET_TX_SOFTIRQ | 네트워크 패킷 송신용으로 사용 |
3 | NET_RX_SOFTIRQ | 네트워크 패킷 수신용으로 사용 |
4 | BLOCK_SOFTIRQ | 블록 디바이스에서 사용 |
5 | IRQ_POLL_SOFTIRQ | IRQ_POLL 연관 동작 |
6 | TASKLET_SOFTIRQ | 일반 태스크릿으로 사용 |
7 | SCHED_SOFTIRQ | 스케줄러에서 주로 사용 |
8 | HRTIMER_SOFTIRQ | 현재 사용하지 않지만 하위 호환성을 위해 남겨둠 |
9 | RCU_SOFTIRQ | RCU 처리용으로 사용 |
Reference
디버깅을 통해 배우는 리눅스 커널의 구조와 원리
댓글남기기