soft IRQ는 인터럽트가 실행되고 난 뒤, 바로 __do_softirq에서 실행된다.
그런데 soft IRQ 서비스가 오래 실행되거나, soft IRQ 컨텍스트에서 soft IRQ 서비스를 요청해서 자원을 계속해서 잡아먹고 있다면 어떡할까?
그럴때 필요한게 ksoftirqd 스레드다.
ksoftirqd 스레드 란?
ksoftirqd 스레드는 커널 스레드로 Soft IRQ를 스레드 레벨에서 처리해준다.
static struct smp_hotplug_thread softirq_threads = {
.store = &ksoftirqd,
.thread_should_run = ksoftirqd_should_run,
.thread_fn = run_ksoftirqd,
.thread_comm = "ksoftirqd/%u",
};
percpu 타입의 스테드이고 smp_hotplug_thread 로 등록되어 있다.
인터럽트가 처리된뒤 실행되는 __do_softirq함수에서 soft IRQ서비스가 너무 오래 걸리거나 pending 중인 soft IRQ 서비스가 너무 많을 때 ksoftirqd를 깨운다.
ksoftirqd를 깨우는 기준은?
ksoftirq를 깨우는 기준은 2가지로 다음과 같다.
- Soft IRQ 서비스 실행시간이 MAX_SOFTIRQ_TIME을 초과했을 때
- Soft IRQ 서비스 실행횟수가 10번이 넘었을때
ksoftirqd 실행흐름
- irq_exit()에서 Soft IRQ 실행
- __do_softirq()에서 서비스 핸들러 실행
- [조건이 만족했을 경우] ksoftirqd 프로세스 깨움
- 스케줄링...
- run_ksoftirqd()에서 __do_softirq() 실행
'디버깅을 통해 배우는 리눅스 커널의 구조' 카테고리의 다른 글
리눅스 커널 스터디 결산 (3주차) (0) | 2022.07.02 |
---|---|
태스크릿 Tasklet (0) | 2022.07.02 |
스터디 계획(3주차) (0) | 2022.06.25 |
Soft IRQ (0) | 2022.06.25 |
IRQ 스레드 생성 실습 (0) | 2022.06.21 |