Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

46107
469
422678


[리눅스커널] Soft IRQ 서비스 실행: __do_softirq() 함수 분석 6. 인터럽트 후반부 처리

이제 Soft IRQ 의 핵심 코드인 __do_softirq() 함수를 분석할 차례입니다. 
분석할 전체 코드는 다음과 같습니다.

1 asmlinkage __visible void __softirq_entry __do_softirq(void)
2{
3 unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
4 unsigned long old_flags = current->flags;
5 int max_restart = MAX_SOFTIRQ_RESTART;
6 struct softirq_action *h;
7 bool in_hardirq;
8 __u32 pending;
9 int softirq_bit;
10
...
11
12 pending = local_softirq_pending();
13 account_irq_enter_time(current);
14
15 __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET);
16 in_hardirq = lockdep_softirq_start();
17
18 restart:
19 /* Reset the pending bitmask before enabling irqs */
20 set_softirq_pending(0);
21
22 local_irq_enable();
23
24 h = softirq_vec;
25
26 while ((softirq_bit = ffs(pending))) {
27 unsigned int vec_nr;
28 int prev_count;
29
30 h += softirq_bit - 1;
31
32 vec_nr = h - softirq_vec;
33 prev_count = preempt_count();
34
35 kstat_incr_softirqs_this_cpu(vec_nr);
36
37 trace_softirq_entry(vec_nr);
38 h->action(h);
39 trace_softirq_exit(vec_nr);
...
40 h++;
41 pending >>= softirq_bit;
42 }
50
43 rcu_bh_qs();
44 local_irq_disable();
45
46 pending = local_softirq_pending();
47 if (pending) {
48 if (time_before(jiffies, end) && !need_resched() &&
49     --max_restart)
50 goto restart;
51
52 wakeup_softirqd();
53 }

 
* 강의 동영상도 있으니 같이 들으시면 좋습니다.




"이 포스팅이 유익하다고 생각되시면 댓글로 응원해주시면 감사하겠습니다.  
혹시 글을 읽고 궁금점이 있으면 댓글로 질문 남겨주세요. 상세한 답글 올려 드리겠습니다!"

인터럽트 후반부(IRQ 스레드/Soft IRQ) 처리

인터럽트 후반부 기법이란?  
IRQ 스레드(threaded IRQ)  
   * IRQ란?   
IRQ 스레드는 어떻게 생성할까?  
IRQ 스레드는 누가 언제 실행할까?  
IRQ 스레드 디버깅 실습  
Soft IRQ 소개  
Soft IRQ 서비스  
Soft IRQ 서비스는 언제 요청할까?  
Soft IRQ 서비스는 누가 언제 처리할까?  
ksoftirqd 스레드  
Soft IRQ 컨텍스트에 대해  
태스크릿  
Soft IRQ 디버깅  


# Reference: For more information on 'Linux Kernel';

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

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


Thanks,
Austin Kim

http://rousalome.egloos.com/10025215


핑백

덧글

  • 방문자1 2019/07/11 17:17 # 삭제 답글

    정말 디테일하게 작성해주셨네요~!!
    덕분에 심도 깊게 봤습니다.
    유익한 자료 감사합니다.
  • AustinKim 2019/07/11 17:50 #

    응원 감사합니다. 블로그 자주 오셔서 유익한 정보 얻어가세요.
  • 최재국 2020/08/09 22:47 # 삭제 답글

    [그림 6.13] ffs 라이브러리 실행 결과
    의 그림이 조금 이상해서 질문드립니다. ffs 함수(find fisrt bit set)를 찾아봤는데 20을 집어넣으면 3의 값이 출력이 되더라고요

    그럼

    h += softirq_bit -1 은
    h += 2가 되니까
    2번째요소의 포인터 함수인 net_tx_action이 실행되여야 하는게 아닌가요?


  • AustinKim 2020/08/10 09:56 #

    네, 그림에 오류가 있습니다.
    블로그에 있는 글을 열심히 읽는 것 같네요.

    다음과 같이 수정될 예정입니다.

    ---
    (after)
    비트 순서 | 5 4 3 2 1
    비트 값 | 1 0 1 0 0
    ---

    (before)
    ffs(20)을 입력하면 가장 먼저 1이 세팅된 비트 위치인 2를 알려줍니다.
    ->
    (after)
    ffs(20)을 입력하면 가장 먼저 1이 세팅된 비트 위치인 3를 알려줍니다.

    참고로, '디버깅을 통해 배우는 리눅스 커널의 구조와 원리' 책에는 이미 수정된 내용을 담고 있습니다.

    즐거운 한 주 되세요.
  • 2020/08/10 09:57 # 답글 비공개

    비공개 덧글입니다.
댓글 입력 영역