-
반응형
jiffies로 실행 시간의 흐름을 제어하기 위해 쓰는 다음과 같은 매크로 함수를 소개한다.
- time_after()
- time_before()
1. time_after() / time_before() 매크로 함수
리눅스 커널 코드나 디바이스 드라이버에서는 time_after()와 time_before() 함수를 써서 실행 시간과 타이밍을 제어한다.
- 함수나 함수 내 코드 블록의 실행 시간 체크
- 실행 시간의 데드라인을 점검
time_after()와 time_before() 함수의 구현
time_before() 함수의 구현부를 보면 인자를 서로 바꾼 다음 time_after() 함수를 호출한다. 먼저 time_after() 함수를 분석하자. 첫 번째 인자로 a, 두 번째로 b를 받는다. 입력 인자가 정수 타입인지 점검하고, b에서 a를 뺀 결과를 반환한다. 그런데 만약 a가 1000이고 b가 1100이면 어떤 결괏값이 나올까? 결과값이 100이니 0보다 작지 않아, false를 반환한다. 반대로 a가 b보다 크면 true를, 아니면 false를 반환하다. 즉, time_after(a,b)는 a가 b보다 큰지 체크하는 함수인데 타이머 관점으로 "a가 담고 있는 시간 정보가 b의 시간 정보보다 나중인지" 알려주는 기능이다. 반대로 time_before() 함수는 a가 b보다 크면 false를, 아니면 true를 반환한다. 즉, time_before(a,b)는 a가 b보다 작은지 체크하는 함수인데 타이머 관점으로 "a가 담고 있는 시간 정보가 b의 시간 정보보다 이전인지" 알려주는 기능이다. 그러면 time_after(a,b)와 time_before(a,b) 함수에 어떤 인자를 전달할까? 보통 a에는 현재 시각 정보, b에는 비교하려는 시간 정보를 입력한다. 둘 다 1/HZ 단위 시간 정보이다.
2. time_after() / time_before() 함수의 사용 예
time_after() / time_before() 함수를 써서 실행 시간의 흐름을 제어해보자. 소개할 코드는 워크큐의 와치독 타이머인 wq_watchdog_timer_fn() 함수이다. 이 함수는 워크큐에 큐잉된 워크가 정해진 시간 내에 실행됐는지 점검한다. jiffies와 (ts+thread)를 비교해서 jiffies가 더 크면 time_after() 함수는 true를 반환한다. 이 조건을 '워크큐 락업'이라고 판단하고 if문내에서 에러 메시지를 출력하는 코드를 실행한다. 현재 시각이 지정한 마감 시각보다 큰지 점검하는 동작이다. (ts + thresh)는 가장 최근에 워크가 실행됐던 시각 정보이다. wq_watchdog_thresh가 30이니 워크를 워크큐에 큐잉하고 30초 동안 처리하지 못하면 워크큐 스톨(Stall)이라고 판단한다.
이번에는 Soft IRQ의 핵심인 __do_softirq() 함수의 코드를 확인해보자. __do_softirq() 함수는 Soft IRQ의 서비스 핸들러 실행 시간이 2ms를 넘었는지 점검한다. 현재 시간 정보인 jiffies에 msecs_to_jiffies(2) 함수의 결괏값을 더해 end라는 지역변수에 저장한다. 여기서는 time_before() 함수를 써서 실행 시간의 흐름을 알아보는 것이 목적이니 다른 조건은 무시한다. time_before() 함수의 실행 조건을 보면 현재 시각인 jiffies가 end보다 작으면 if 문을 실행해서 restart 레이블을 실행해 Soft IRQ 서비스를 실행한다. 아니면 wakeup_softirqd() 함수를 호출해서 ksoftirqd 스레드를 깨운다.
여기서 현재 시각인 jiffies가 end보다 작은지 점검하는 루틴은 처음 __do_softirq() 함수를 실행했을 때를 기준으로 2ms 후를 마감 시각으로 end에 저장했다. Soft IRQ 서비스를 실행한 다음 jiffies가 end보다 작으면 Soft IRQ 서비스를 2ms 내에 실행했다고 볼 수 있다.
리눅스 커널 코드를 보면 time_after()와 time_before() 함수를 써서 코드의 실행 시간을 제어하는 루틴을 자주 볼 수 있다. 이 두 함수의 원리를 제대로 익히면 관련 코드를 어렵지 않게 이해할 수 있다.
반응형