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.

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