Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

110187
803
94439


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

get_work_pool() 함수 분석을 시작하겠습니다.
[https://elixir.bootlin.com/linux/v4.14.43/source/kernel/workqueue.c#L709]
1 static struct worker_pool *get_work_pool(struct work_struct *work)
2 {
3 unsigned long data = atomic_long_read(&work->data);
4 int pool_id;
5
6 assert_rcu_or_pool_mutex();
7
8 if (data & WORK_STRUCT_PWQ)
9 return ((struct pool_workqueue *)
10 (data & WORK_STRUCT_WQ_DATA_MASK))->pool;
11
12 pool_id = data >> WORK_OFFQ_POOL_SHIFT;
13 if (pool_id == WORK_OFFQ_POOL_NONE)
14 return NULL;
15
16 return idr_find(&worker_pool_idr, pool_id);
17}
18
19 static void insert_work(struct pool_workqueue *pwq, struct work_struct *work,
20 struct list_head *head, unsigned int extra_flags)
21 {
22 struct worker_pool *pool = pwq->pool;
23
24 set_work_pwq(work, pwq, extra_flags);
...
}

3번 줄 코드를 보겠습니다.
3 unsigned long data = atomic_long_read(&work->data);

data이란 지역 변수에 struct work_struct.data 멤버를 저장합니다.

다음 8번 줄 코드입니다.
8 if (data & WORK_STRUCT_PWQ)
9 return ((struct pool_workqueue *)
10 (data & WORK_STRUCT_WQ_DATA_MASK))->pool;

data 지역 변수와 WORK_STRUCT_WQ(4)와 AND 연산 결과가 true이면 코드를 실행합니다.

WORK_STRUCT_WQ enum은 다음 비트 연산으로 4입니다.
WORK_STRUCT_WQ(4) = (1 << 2) = (1 << WORK_STRUCT_PWQ_BIT)
각 enum 매크로 코드는 다음 해더 파일에 정의돼 있습니다.
[/include/linux/workqueue.h]
enum {
WORK_STRUCT_PWQ_BIT = 2, /* data points to pwq */
...
WORK_STRUCT_PWQ = 1 << WORK_STRUCT_PWQ_BIT,


그러면 struct work_struct.data 멤버에 WORK_STRUCT_PWQ 값을 언제 저장할까요?

__queue_work() 함수에서 호출된 insert_work() 함수를 볼 필요가 있습니다.
19 static void insert_work(struct pool_workqueue *pwq, struct work_struct *work,
20 struct list_head *head, unsigned int extra_flags)
21 {
22 struct worker_pool *pool = pwq->pool;
23
24 set_work_pwq(work, pwq, extra_flags);

24번 줄 코드를 보면 set_work_pwq() 함수를 호출합니다. 24번 줄 코드를 보면 set_work_pwq() 함수를 호출합니다. struct work_struct.entry를 워커 풀에 등록하기 직전 struct work_struct.data 멤버를 WORK_STRUCT_PWQ 로 저장합니다.

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



핑백

덧글

댓글 입력 영역