Completion queue NVMe adalah struktur memori berbentuk ring yang dipakai bersama oleh controller dan software host. Controller menaruh completion queue entry setelah command selesai, sedangkan host mengonsumsi entry tersebut dan memajukan queue head. Saat salah satu pihak mencapai slot terakhir, indeks kembali ke slot nol.
Wrap tersebut menimbulkan persoalan state yang kecil tetapi penting. Memori queue masih menyimpan byte dari completion sebelumnya. Entry yang tidak nol pada posisi head saat ini belum membuktikan bahwa controller sudah menaruh completion baru di sana. NVMe menangani kondisi ini dengan Phase Tag satu bit pada setiap completion queue entry.
Arti Phase Tag berganti setiap kali controller mengitari queue dan kembali ke awal. Software host menyimpan nilai phase yang diharapkan pada head saat ini. Nilai yang cocok menandai entry dari putaran producer yang sedang aktif; nilai yang berbeda menandai slot yang belum diganti pada putaran tersebut.
Ring mempertahankan isi saat ownership berpindah
Completion queue dengan kedalaman N memiliki slot bernomor 0 sampai N - 1. Controller bertindak sebagai producer dan host sebagai consumer. Keduanya bergerak maju pada ring logis yang sama, tetapi menyimpan posisi yang berbeda.
Saat sebuah command selesai, controller menulis completion queue entry ke slot producer berikutnya yang tersedia. Entry itu memuat field seperti command identifier, informasi submission queue, status, dan Phase Tag. Host memeriksa entry secara berurutan dari consumer head.
Mengonsumsi entry tidak mengharuskan host menghapus slot tersebut. Byte lama dapat tetap berada di memori sampai controller kembali ke slot itu pada putaran berikutnya. Cara ini menghindari operasi pembersihan terpisah, tetapi juga berarti isi memori saja tidak cukup untuk menunjukkan bahwa sebuah entry masih baru.
Sebuah queue karena itu dapat memuat campuran entry dari putaran producer yang berbeda. Bit phase memberi host penanda generasi yang terikat pada ring wrap.
Expected phase berubah pada batas wrap
Software host menginisialisasi expected phase sesuai state queue yang ditetapkan antarmuka NVMe. Setelah itu, software memeriksa Phase Tag pada completion entry di posisi head saat ini.
Jika entry membawa phase yang diharapkan, host dapat memproses completion tersebut dan memajukan head. Jika head bergerak melewati slot terakhir, head kembali ke nol dan host membalik bit expected phase.
Controller melakukan transisi phase yang sesuai untuk entry yang ditaruh setelah posisi producer mengalami wrap. Entry lama yang masih tertinggal di memori tetap membawa nilai phase dari putaran sebelumnya. Sampai controller menimpa slot tersebut, nilai lama itu berbeda dari nilai baru yang diharapkan host.
Ambil contoh queue empat entry. Setelah host mengonsumsi satu putaran penuh, slot nol masih dapat berisi completion lama dari putaran pertama. Host kini sudah membalik expected phase. Entry lama di slot nol memiliki phase yang berlawanan sehingga tidak dianggap sebagai completion baru. Ketika controller kemudian menaruh entry baru di slot nol, write tersebut membawa phase baru dan dapat dikenali sebagai pekerjaan yang siap dikonsumsi.
Mekanisme ini hanya membutuhkan satu bit karena host dan controller bergerak melalui ring secara berurutan. Phase Tag bukan sequence number umum dan tidak menyimpan nomor generasi tanpa batas.
Phase Tag tidak menggantikan pencatatan queue head
Phase Tag menjawab apakah entry pada posisi consumer saat ini berasal dari putaran producer yang diharapkan. Bit tersebut tidak menggantikan aturan head dan tail pada queue.
Host tetap melaporkan completion yang sudah dikonsumsi dengan memperbarui Completion Queue Head Doorbell. Pembaruan itu memberi tahu controller ruang queue mana yang sudah dilepas untuk dipakai kembali. Controller harus menghindari penimpaan entry yang belum dikonsumsi host.
Pembagian fungsi ini penting. Head doorbell berperan dalam flow control dan reklamasi ruang. Bit phase membantu consumer mengenali apakah slot berikutnya memuat completion dari putaran saat ini. Keduanya menangani bagian berbeda dari protokol ring.
Kecocokan phase juga tidak memberi izin kepada host untuk melompati queue secara sembarang. Completion entry dikonsumsi sesuai semantik queue, sementara software mempertahankan state head miliknya sendiri saat bergerak maju.
Visibilitas DMA tetap relevan
Completion queue biasanya berada di memori host yang diakses controller NVMe melalui DMA. Phase Tag merupakan bagian dari completion entry yang ditulis controller, sehingga software yang benar juga bergantung pada aturan DMA dan memory ordering platform.
Driver tidak boleh memperlakukan bit phase sebagai pengganti primitive sinkronisasi yang diwajibkan sistem operasi dan arsitektur. DMA API, memory barrier, serta aturan akses device yang relevan menentukan cara software mengamati field hasil write dari device secara aman.
Properti ordering yang penting adalah software tidak boleh mengonsumsi field lain pada completion sebagai data baru hanya berdasarkan pengamatan yang tidak aman atau mengalami reorder. Implementasi NVMe pada kernel menggabungkan logika protokol queue dengan mekanisme platform yang diperlukan untuk mengamati write dari device secara benar.
Pemisahan ini juga mencegah kekeliruan konsep: Phase Tag adalah sinyal generasi queue, bukan primitive cache coherency. Bit tersebut memberi label putaran producer yang direpresentasikan oleh sebuah entry. Phase Tag sendiri tidak melakukan flush cache CPU, menyelesaikan transaksi PCIe, atau menetapkan seluruh jaminan memory ordering yang mungkin dibutuhkan driver.
Kedalaman queue membatasi gerak producer
Mekanisme phase tidak membuat circular queue kebal terhadap overflow. Controller tetap memiliki jumlah slot completion yang terbatas, dan kemajuan host tetap diperlukan.
Jika software berhenti mengonsumsi completion atau menunda pembaruan head doorbell, ruang queue yang dapat dipakai kembali menyusut. Controller tidak dapat menganggap slot yang belum dikonsumsi sebagai ruang bebas hanya karena wrap berikutnya akan menghasilkan nilai phase berbeda. Phase membedakan generasi pada batas consumer; bit itu tidak memberi izin untuk menimpa completion yang masih outstanding.
Hal ini relevan pada interrupt handling maupun polling. Driver dapat memproses beberapa completion entry dalam satu putaran, memajukan local head, membalik expected phase saat melewati batas ring, lalu memublikasikan head yang sudah diperbarui sesuai implementasinya. Kebijakan batching dapat berbeda, tetapi invariant ring tetap berlaku.
Entry lama dapat tetap terlihat valid
Completion entry lama dapat mengecoh karena sebagian besar field-nya masih terlihat masuk akal. Command identifier lama mungkin masih berada dalam rentang valid. Status bit dapat menggambarkan command yang sukses. Field submission queue juga dapat menyerupai traffic saat ini.
Mengosongkan memori queue setiap kali sebuah entry dikonsumsi dapat membuat beberapa state lama lebih mudah terlihat, tetapi cara itu menambah write dari host dan tetap tidak mendefinisikan protokol producer-consumer. NVMe memakai state eksplisit pada completion entry dan mengikatnya dengan pergerakan ring.
Dalam diagnosis, memory dump completion queue membutuhkan konteks. Byte pada entry perlu dibaca bersama host head, kemajuan controller, expected phase, kedalaman queue, dan titik waktu pengambilan snapshot. Slot yang berisi data tidak otomatis berarti ada pekerjaan yang masih pending.
Satu bit cukup untuk generasi yang berdekatan
Phase Tag bekerja karena consumer hanya perlu membedakan putaran producer yang sedang diharapkan dari isi lama pada posisi yang sama. Flow control queue yang benar mencegah producer berlari beberapa putaran tanpa batas lalu menimpa entry yang belum dikonsumsi.
Hubungan yang terbatas itu membuat satu bit efektif sebagai penanda wrap. Setiap putaran membalik nilainya, sehingga sebuah slot mempertahankan jejak putaran sebelumnya sampai controller menaruh entry baru di sana.
Hasilnya adalah protokol ring yang ringkas: memori queue dapat dipakai kembali tanpa pembersihan per entry, byte lama dapat tetap berada di tempatnya tanpa dianggap baru, dan host dapat memeriksa completion berikutnya melalui perbandingan phase yang terikat langsung pada pergerakan head miliknya.