강좌 & 팁
오늘은 mmc 가 동작하는 것 중에서 bio 와의 연계된 동작이 어떻게 이루어지는지 보도록 하겠습니다.
block 장치 레이어에서 IO 요청을 하게 될때 submit_bio 라는 요청을 하게 됩니다.
이것은 메모리 어디에 해당 장치의 offset 어디서부터 사이즈 얼마만큼 읽거나 써주세요 라고 하는 요청입니다.
그 안에서 불려지는 것이 generic_make_request 함수가 불리게 됩니다.
이 함수가 불리게 되면 bio_list 가 비어 있으면 초기화를 하고 하나 꺼내서 make_request_fn 을 수행합니다.
요건 해당 장치에는 queue 가 있는데 거기에 요청을 넣을 수 있도록 수행하는 함수가 들어가 있습니다 .
바로 blk_queue_bio 인데 대부분의 장치는 공통으로 사용합니다
block 이 아니라 파티션이 만들어질때 관리되어지는 request queue 를 블럭단에서 사용하게 되죠.
어쨋건... submit_bio -> generic_make_request -> blk_queue_bio
위의 세개의 과정을 거쳐서 bio 에서 꺼내어 요청 단위에 맞게 장치의 queue 에 넣는 작업입니다.
이후에 스케쥴링과 메모리 정책에 따라 blk_run_queue 가 불리게 되면 마지막에 request_fn 가 호출되는데
그게 바로 mmc_request 함수 입니다
이 함수는 mmc 장치 초기화시에 만들어지는 thread 를 깨우는 역할을 하게 됩니다.
장황하긴 한데 한번 엮어 볼까요?
submit_bio -> generic_make_request -> blk_queue_bio : block 게층에서 queue 에 요청을 넣는다
shedule -> blk_run_queue -> request_fn (mmc_request) : 장치에 등록된 함수를 호출...
block 과 장치의 연결점
mmc 의 경우 초기화시에 mmc_queue_thread 쓰레드를 만듭니다.
이 쓰레드는 깨어나면 queue 에서 요청을 하나 꺼내와서 처리 함수를 부릅니다.
바로 issue_fn ( mmc_blk_issue_rq)
최종적으로 mmc 장치에서 수행하는 queue 요청단위의 처리는 바로 mmc_blk_issue_rq 를 통해서 수행됩니다.
전체 그림을 볼까요?
BLOCK SCHEDULE MMC THREAD
submit_bio blk_run_queue blk_fetch_request
generic_make_request mmc_request issue_fn ( mmc_blk_issue_rq)
blk_queue_bio ^
| |
| |
|----------------------------------->> QUEUE -------------------------
블럭 장치는 submit_bio 를 통해서 전송단위로 잘라 queue 에 넣습니다.
스케쥴에 따라 장치에서 queue 에서 꺼내 갈수 있도록 이벤트를 발생시킵니다.
각 장치는 처리 프로세스에 따라 처리하는데 mmc 의 경우 thread 에서 queue 에서 꺼내어 처리를 합니다.
다음에는 마지막 처리단위인 mmc_blk_issue_rq 를 한번 보겠습니다.