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.