오늘은 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 를 한번 보겠습니다.