NVMe Doorbell Register Memberi Tahu Controller tentang Progres Queue
NVMe menempatkan submission queue dan completion queue di memory host, tetapi controller tetap membutuhkan sinyal ketika software menambahkan command atau selesai mengonsumsi completion entry. Doorbell register menyediakan sinyal tersebut. Software host menulis nilai pointer queue ke register controller yang dipetakan ke memory sehingga device dapat melacak progres tanpa terus-menerus memindai memory host.
Mekanisme ini memisahkan penyimpanan queue dari notifikasi queue. Command dan completion entry berada di memory yang dapat diakses DMA, sedangkan write kecil ke register memberi tahu controller bagian queue mana yang berubah.
Submission doorbell memublikasikan tail baru
Software menyiapkan satu atau beberapa command di submission queue lalu memajukan local tail pointer. Setelah itu, software menulis nilai tail baru ke Submission Queue Tail Doorbell milik queue tersebut.
Write ke register memberi tahu controller bahwa entry tambahan tersedia hingga tail yang dipublikasikan. Controller kemudian dapat mengambil command tersebut dari memory host dan menjadwalkannya untuk dieksekusi.
Doorbell tidak membawa command itu sendiri. Doorbell membawa posisi queue. Dengan begitu, payload command tetap berada di memory biasa dan notifikasinya tetap ringkas.
Host harus menempatkan data command di memory sebelum memublikasikan tail baru sesuai ordering yang diwajibkan. Jika notifikasi mencapai controller sebelum queue entry siap diakses device, controller dapat mengambil state command yang belum lengkap. Primitive ordering pada platform dan driver menangani boundary ini.
Completion doorbell mengembalikan ruang yang sudah dikonsumsi
Setelah controller menyelesaikan pekerjaan, controller menulis completion entry ke completion queue dan memajukan posisi completion yang direpresentasikan dalam entry tersebut. Software host memproses entry yang selesai lalu menulis Completion Queue Head Doorbell.
Pembaruan head itu memberi tahu controller slot completion mana yang sudah dikonsumsi host. Slot tersebut kemudian dapat digunakan kembali untuk completion berikutnya.
Ini membentuk dua aliran yang saling melengkapi. Submission doorbell mengekspos pekerjaan baru ke controller, sedangkan completion doorbell mengembalikan kapasitas completion queue kepada controller.
Setiap queue pair memiliki lokasi register tersendiri
NVMe mendukung banyak I/O queue agar software dapat mendistribusikan traffic storage ke berbagai core processor atau workload class. Lokasi doorbell register diturunkan dari queue identifier dan doorbell stride yang diumumkan controller.
Stride penting karena implementasi dapat memberi jarak antar-doorbell register lebih besar daripada lebar register minimum. Software membaca capability value dari controller dan menghitung alamat setiap register berdasarkan spacing tersebut, bukan mengasumsikan layout tetap.
Administrative command menggunakan queue identifier nol. I/O queue menggunakan identifier masing-masing, dengan submission-tail doorbell dan completion-head doorbell terpisah untuk setiap queue.
Batching dapat mengurangi overhead write ke register
Driver tidak selalu harus membunyikan submission doorbell setelah setiap command. Driver dapat menyiapkan beberapa command yang bersebelahan, memajukan tail melewati satu batch, lalu memublikasikan tail hasilnya satu kali.
Ini mengurangi jumlah memory-mapped I/O write. Trade-off-nya adalah delay notifikasi: menahan command sambil menunggu batch lebih besar dapat menambah latency walaupun efisiensi write meningkat.
Ukuran batch yang berguna bergantung pada tekanan workload dan target latency. Queue yang sibuk biasanya menyediakan batching secara alami, sedangkan traffic yang jarang tetapi sensitif terhadap latency dapat lebih diuntungkan oleh notifikasi segera.
Doorbell adalah notification state, bukan durable state
Doorbell write merupakan bagian komunikasi antara software host dan controller yang sedang aktif. Ia bukan catatan durable dari pekerjaan yang sudah disubmit. Penanganan reset harus membangun ulang state queue sesuai lifecycle controller dan driver NVMe, bukan memperlakukan nilai register lama sebagai metadata queue yang persisten.
Perbedaan yang sama juga membantu diagnosis. Memory queue menunjukkan command dan completion entry; nilai doorbell menunjukkan informasi pointer yang terakhir disampaikan melalui interface register. Membandingkan keduanya dapat mengungkap producer yang macet, consumer yang berhenti maju, atau notification path yang tidak berkembang sebagaimana mestinya.
Dengan demikian, doorbell membentuk jembatan kecil tetapi penting antara shared queue memory dan eksekusi controller. Pembaruan pointer-nya memungkinkan NVMe menyimpan struktur command besar di memory host sambil memakai write register yang ringkas untuk mengumumkan progres queue.