7.2 에서는 command 와 completion을 이슈하는 동작을 설명한다. 또한 host software에 의해 command가 어떻게 만들어지는지, completion이 어떻게 처리되는지 설명한다.
7.2.1 Command Processing
7.2.1 에서는 command가 submission되는 과정과 completion 처리과정을 보여준다. Figure 436 은 각 과정을 그림으로 나타내었다.
1. Host는 메모리에 위치한 submission queue에서 next free slot에 하나 이상의 command를 쌓는다.
2. Host는 Submssion Queue Tail Doorbell register를 업데이트한다. 이 때 값은 새로운 Submssion Queue Tail entry pointer이다. 이는 controller가 새 커맨드를 처리해야한다는 것을 알도록 해준다.
3. Controller는 Submission Queue slot(s)의 command(s)를 실행하기 위해 controller 내부로 전송한다. Arbitration은 controller가 다음 command로 어떤걸 실행할 지 정하기 위한 수단이다. 4.13 참고.
4. 그런 다음 Controller는 다음 command를 계속해서 수행한다. command는 out of order로 처리되며 이에 따라 out of order로 completion이 올 수 있다.
5. Command가 완료된 후 controller는 Comletion queue 의 next free slot에 Completion queue entry를 위치한다. completion queue entry의 한 일부로 controller는 SQ head pointer를 전진시켜 소비된 가장 최근의 Submission queue entry를 나타낸다. 각 새로운 completion queue entry는 phase tag를 가지고 있는데 이는 직전 entry phase tag을 반대값이다. 이를 보고 host는 이 CQE가 새로운 entry 구나 라는걸 알게된다.
6. Controller는 optional 하게 host가 새로운 completion 이 왔다는 걸 알 수 있게하기 위한 interrupt를 생성할 수 있다. 아래 그림에는 MSI-X interrupt가 예시로 표현되어있다. 그러나 이는 pin-based가 될 수도 MSI interrupt가 될 수도 있다. interrupt coalescing settings 를 기반으로 하여 interrupt가 각각의 새로운 CQE마다 생성될수도 아닐수도있다;
7. Host는 새로운 CQE를 가져와 처리한다. 이는 에러 조건을 기반으로 한 동작도 포함한다. Host는 계속해서 CQE를 가져와 처리한다 phase tag가 inverted된 이전에 사용된 CQE를 만날때까지.
8. Host는 CQ head doorbell register에 CQE가 소비되었다는것을 알리기 위해 값을 적는다. host는 CQ head doorbell register에 값을 update하기 전에 많은 entry를 소비할지도 모른다.