Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

80258
1323
114582


[리눅스커널] 워크큐: struct work_struct 구조체 8. Workqueue

워크를 표현하는 자료구조는 struct work_struct 구조체이며 선언부는 다음과 같습니다.
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/include/linux/workqueue.h]
1 struct work_struct {
2 atomic_long_t data;
3 struct list_head entry;
4 work_func_t func;
5 #ifdef CONFIG_LOCKDEP
6 struct lockdep_map lockdep_map;
7#endif
8 };


라즈베리파이에서는 CONFIG_LOCKDEP 이란 컨피그는 설정돼지 않았으니 func이 가장 마지막 필드입니다. 


먼저 각 필드의 의미를 알아봅시다.

atomic_long_t data;

data 필드는 워크 실행 상태를 저장합니다.
워크 초기화: 0xFFFFFFE0
워크를 워크큐에 큐잉: WORK_STRUCT_PENDING_BIT(0x1)

커널 워크큐 내부 함수에서 워크의 실행 정보가 기록된 data 필드를 읽어 워크를 제어하는 코드가 많습니다. 

struct list_head entry;

entry 필드의 타입은 연결 리스트입니다. 워크를 워크큐에 큐잉하면 워커풀 struct worker_pool 구조체 중 연결 리스트인 worklist에 등록합니다. 여기서 struct worker_pool 구조체 worklist는 워크의 entry 주소를 저장합니다.

      
이 필드가 워크큐 전체 자료구조에서 어떻게 쓰이는지는 7.5절에서 그림으로 같이 살펴볼 예정입니다.


work_func_t func;

func 필드는 워크 핸들러 함수 주소를 저장합니다.

워크를 워크큐에 큐잉하면 커널 스레드인 워커 스레드에서 워크 핸들러를 호출합니다. 누군가 ‘워크큐 후반부 처리를 어디서 하는가?”라고 질문을 하면 다음과 같이 대답할 수 있습니다.  

    워크 핸들러에서 후반부를 처리합니다.

여기서 한 가지 의문이 생깁니다.

    워크 핸들러 함수는 언제 실행할까? 

워크를 워크큐에 큐잉하고 나서 워커 스레드가 실행하면서 워크 핸들러 함수를 호출합니다. 워크란 struct work_struct 이란 구조체로 표현할 수 있고 워크큐 후반부 처리는 워크 핸들러가 실행할 때 처리된다는 점을 기억합시다.

다음 절에서는 워크를 초기화하는 방법에 대해서 알아봅니다. 워크를 워크큐에 큐잉하기 전에 거쳐야 하는 단계입니다.


핑백

덧글

댓글 입력 영역