Linux kernel v4.4에서 간단한 블록 장치 드라이버 만들어보기

hw-queue와 sw-queue

mybrd_mq_ops의 각 함수들

드라이버가 큐를 만들때 등록한 함수들이 mybrd_mq_ops에 있습니다. 하나씩 보겠습니다.

mybrd_init_hctx

이름처럼 hw-queue를 초기화할때 호출됩니다. 인자로 받는 blk_mq_hw_ctx 포인터는 각 hw-queue마다 생성되는 blk_mq_hw_ctx 객체의 주소입니다.

인자값 data는 tag_set.driver_data로 전달한 mybrd 객체의 주소입니다. 그리고 index는 hw-queue의 번호입니다. 우리는 hw-queue를 하나만 만들었으니 0일 것입니다.

드라이버가 각 hw-queue에 전달할 정보는 struct mybrd_hw_queue_private객체입니다. 별다른건 없고 큐의 번호와 mybrd객체의 주소를 전달합니다.

hctx->driver_data필드에 mybrd_hw_queue_private객체의 주소를 저장하고 종료합니다.

mybrd_queue_rq

함수 인자로 blk_mq_hw_ctx를 받는 것은 이해가 되실 것입니다. blk_mq_queue_data는 사실 아직 뭔지 잘 모르겠습니다. 단지 blk_mq_queue_data->rq 필드에 request의 포인터가 저장돼있다는 것만 알고있습니다.

그리고 blk_mq_rq_to_pdu() 함수를 써서 request마다 고유한 드라이버 정보를 저장하고 있습니다. 이 정보의 크기는 tag_set.cmd_size에 설정한 값입니다. 아직 pdu가 무엇의 약자인지 드라이버가 이 영역을 맘대로 덮어써도 되는지는 파악이 안됐습니다.

그 외에는 request를 처리하는 것 뿐입니다. request-mode와 동일한 방식으로 처리합니다.

mybrd_softirq_done_fn

softirq 모드로도 request처리를 구현할 수 있습니다. 방식은 request-mode와 동일하므로 따로 구현하지 않았습니다.

 

댓글

댓글 본문
작성자
비밀번호
버전 관리
gurugio
현재 버전
선택 버전
graphittie 자세히 보기