nvme cq work flow注释

nvme_poll/nvme_irq-> nvme_process_cq ->
1,  nvme_update_cq_head, write_cq_head_doorbell
2, nvme_complete_cqes -> nvme_complete_cqe->nvme_end_request->blk_mq_complete_request->__blk_mq_complete_request ->blk_softirq or handle_locally

 

Polling is tried for any block I/O belonging to a high-priority I/O context (IOCB_HIPRI).

使能nvme dev的IO poll功能:

 通用块层判断设备是否支持poll,不支持就立即退出:

如上述注释,对于poll的IO,flag设置了REQ_HIPRI,在当前cpu处理IO完成工作,而且poll的IO会立即下发,不会放到线程的plug中, 例如direct_io:

cq的每一个entry有一个专门的bit,host 与controller会协商好,host会给每个cq维护一个phase tag, 两边都将phase 初始状态是该bit是0, controller返回一个cq entry时,会将phase tag 翻转,表示一个新entry,需要host 去处理,host 就是根据自己维护的phase tag与cq中的每一个entry的phase tag比较,如果不相等,表示是一个新的entry,当cq的tail 翻转到queue的最开始时,host 和controller 都将phase tag bit 反转,这样第二轮controller push command到cq, 每个新到的entry的 phase tag bit 是 0 。这样host 就知道需要哪些entry.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章