Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

110187
803
94439


[리눅스커널] 워크큐: find_worker_executing_work() 함수 분석 8장. 워크큐

이번에는 find_worker_executing_work() 함수를 분석하겠습니다.
1 static struct worker *find_worker_executing_work(struct worker_pool *pool,
2  struct work_struct *work)
3 {
4 struct worker *worker;
5
6 hash_for_each_possible(pool->busy_hash, worker, hentry,
7        (unsigned long)work)
8 if (worker->current_work == work &&
9     worker->current_func == work->func)
10 return worker;
11
12 return NULL;
13}

find_worker_executing_work 함수 이름을 해석하면 두 번째 인자로 전달되는 실행 중인 워크 struct work_struct *work에 해당하는 워커를 찾아서 리턴한다는 의미입니다. 이 함수 리턴 타입은 워커를 표현하는 자료구조인 struct worker입니다.

 먼저 6번 줄 코드를 분석하겠습니다.
struct worker_pool.busy_hash이란 멤버에는 실행 중인 워커가 등록되어 있습니다. busy_hash는 64개 배열로 구성돼 있는데 이 자료구조는 다음 그림으로 설명할 수 있습니다.
 

위 그림에서 워크큐 전체 자료구조에서 워커풀이 있는지 머릿속으로 그리면서 분석할 필요가 있습니다.

struct worker_pool 구조체 멤버 중 busy_hash는64개 배열입니다. 6~7번 코드는 이 bush_hash 해시 테이블을 순회하면서 NULL이 아닌 주소를 읽습니다. 다시 반복하지만 busy_hash 해시 테이블에는 최근에 실행한 워커 주소가 저장돼 있습니다. 위 그림에서는 3번째 인덱스 해시 리스트 테이블에 워커 포인터가 등록돼 있습니다. 

현재 처리 중인 struct work_struct 워크 주소가 0xBCFE67F8 이고 워크 핸들러가 pm_runtime_work() 함수인 경우 busy_hash[3] 배열에서 있는 워커 주소를 읽습니다.

8~10번 줄 코드는 find_worker_executing_work() 함수에 전달하는 워크와 워크 핸들러를 워커 멤버인 worker->current_work 와 worker->current_func를 비교합니다.
8 if (worker->current_work == work &&
9     worker->current_func == work->func)
10 return worker;

비교해서 같으면 worker이란 struct worker 구조체 주소를 반환합니다. 이미 워크를 실행할 워커가 있으면 해당 워커를 반환하는 동작입니다.

#Reference 워크큐
워크큐 소개
워크큐 종류 알아보기
워크란  
워크를 워크큐에 어떻게 큐잉할까?
   워크를 큐잉할 때 호출하는 워크큐 커널 함수 분석   
워커 쓰레드란
워크큐 실습 및 디버깅
   ftrace로 워크큐 동작 확인   
   인터럽트 후반부로 워크큐 추가 실습 및 로그 분석 
   Trace32로 워크큐 자료 구조 디버깅하기 
딜레이 워크 소개  
   딜레이 워크는 누가 언제 호출할까?
라즈베리파이 딜레이 워크 실습 및 로그 확인  


핑백

덧글

댓글 입력 영역