CPU dapat menyelesaikan store MMIO sebelum PCIe Memory Write yang terkait mencapai perangkat target. Jarak ini muncul karena request PCIe Memory Write bersifat posted: requester mengirimkannya tanpa menunggu paket completion dari completer.

Sifat tersebut membantu throughput, tetapi juga membentuk batas penting. Store instruction yang telah selesai dari sisi software, ordering barrier, dan pengamatan write oleh perangkat bukan otomatis merupakan event yang sama.

PCIe Memory Write adalah transaksi posted

PCIe mengklasifikasikan Memory Write sebagai posted request. Posted request tidak memiliki Completion TLP normal yang kembali untuk menyatakan keberhasilan kepada requester. Setelah host bridge menerima write MMIO dari CPU, transaksi dapat terus bergerak melalui buffer dan tahap interconnect meski prosesor sudah melanjutkan eksekusi.

Jalur sederhananya tampak seperti ini:

CPU
 │ MMIO store
host bridge / root complex
 │ posted Memory Write TLP
PCIe fabric
device BAR

Struktur buffering yang tepat bersifat implementation-specific. PCIe menetapkan semantik transaksi dan aturan ordering, tetapi tidak mengharuskan setiap prosesor, root complex, atau endpoint memiliki queue internal yang identik.

Tidak adanya respons completion merupakan sifat arsitektural utama. Software tidak dapat memperlakukan selesainya instruction sebagai acknowledgement dari endpoint.

Ordering dan completion adalah dua sifat berbeda

Memory barrier dapat membatasi urutan visibilitas operasi sesuai memory model CPU dan platform. Hal itu tidak otomatis mengubah posted PCIe write menjadi transaksi yang memiliki acknowledgement dari endpoint.

Pertimbangkan driver yang memprogram state perangkat lalu memulai operasi:

write configuration register
write descriptor address
write command register

Ordering yang diperlukan di antara write tersebut bergantung pada accessor platform, mapping attribute, aturan PCIe, dan interface perangkat. Ordering yang benar mencegah command mendahului state yang wajib hadir lebih dulu.

Completion menjawab hal berbeda:

Apakah posted write terakhir telah mencapai titik yang menjamin
side effect di sisi perangkat sudah diamati?

CPU fence dapat diperlukan untuk ordering pada pola akses tertentu, tetapi fence saja bukan mekanisme universal untuk menguras posted write PCIe.

Read non-posted dapat membentuk batas completion

Request PCIe Memory Read bersifat non-posted. Read yang berhasil memerlukan Completion yang membawa data yang diminta. Jika software melakukan MMIO read yang sesuai dari perangkat yang sama setelah posted write, completion yang kembali dapat memberikan batas lebih kuat dibanding store sebelumnya saja.

Secara konseptual:

CPU                PCIe fabric                 device
 │                      │                         │
 ├─ Memory Write ──────►│────────────────────────►│
 │   posted             │                         │
 │                      │                         │
 ├─ Memory Read ───────►│────────────────────────►│
 │   non-posted         │                         │
 │                      │◄────────────────────────┤
 │◄─ Completion ────────│                         │

Agar read completion dapat berfungsi sebagai flush, transaksi yang dipilih dan platform harus mempertahankan hubungan ordering yang relevan terhadap write sebelumnya. Ini merupakan aturan platform dan interface perangkat, bukan sifat sembarang read.

Kode driver Linux umum memakai read dari register aman pada perangkat yang sama ketika posted MMIO write perlu di-flush. Pemilihan register penting karena read dapat memiliki side effect.

Readback tidak dapat memakai sembarang register

Sebagian register perangkat menghapus status bit saat dibaca, memajukan state FIFO, mengakui interrupt, atau menghasilkan side effect lain. Register seperti itu bukan target flush yang baik meski transaksi bus-nya sendiri dapat membentuk batas ordering yang dibutuhkan.

Driver karena itu memerlukan register dengan semantik read yang aman pada state tersebut. Dokumentasi perangkat dapat menetapkan status register, identification register, atau register stabil lain untuk tujuan ini.

Polanya secara konseptual:

writel(value, device_base + CONTROL);

/* Baca register aman yang terdokumentasi saat flush posted write diperlukan. */
readl(device_base + SAFE_STATUS);

Kode ini bersifat skematis, bukan resep universal untuk semua driver. Semantik accessor MMIO Linux berbeda antararsitektur, dan sebagian subsystem menyediakan helper khusus atau abstraksi yang lebih kuat. Spesifikasi perangkat tetap menjadi acuan untuk side effect register dan sequencing yang diperlukan.

Doorbell memperlihatkan dampak praktisnya

Perangkat berbasis queue sering memakai MMIO doorbell. Software menyiapkan descriptor di memory, membuat update descriptor terlihat sesuai DMA coherence model, lalu menulis doorbell untuk memberi tahu perangkat bahwa pekerjaan baru tersedia.

Ada dua domain ordering yang berbeda:

descriptor stores di memory
        ├─ memory-ordering requirement
MMIO doorbell write
        ├─ posted PCIe transaction
device mengamati doorbell

Barrier sebelum doorbell dapat memastikan isi descriptor terlihat sebelum perangkat bertindak atas notifikasi. Barrier tersebut tidak otomatis membuktikan doorbell write sendiri telah tiba di endpoint sebelum software melakukan tindakan lain yang tidak terkait.

Sebagian besar queue submission tidak memerlukan flush sinkron setelah setiap doorbell. Menambahkan readback pada setiap write dapat menambah serialisasi dan traffic PCIe. Flush hanya diperlukan ketika protocol perangkat atau operasi berikutnya membutuhkan batas completion yang lebih kuat.

Jalur reset dan shutdown membuat completion menjadi penting

Perilaku posted write menjadi sangat penting ketika software hendak menghilangkan akses ke jalur yang membawa write tersebut. Contohnya mencakup device reset, function disable, transisi power state, atau unmapping resource.

Urutan seperti:

write device control
langsung disable transport path

dapat keliru jika operasi pertama masih boleh tertahan di buffer saat tindakan kedua menghapus rute yang diperlukan untuk mengirimkannya.

Urutan aman yang tepat bergantung pada perangkat dan platform. Sebagian interface memerlukan status poll, sebagian menetapkan reset handshake, dan sebagian memakai readback atau mekanisme sinkronisasi eksplisit lain. MMIO write generik tidak dapat menggantikan aturan yang didokumentasikan tersebut.

Posted write meningkatkan throughput tanpa respons per write

Jika setiap register write memerlukan completion packet, traffic respons akan bertambah dan requester serta completer harus melakukan sinkronisasi lebih ketat. Posted write menghindari biaya tersebut dan memungkinkan beberapa write bergerak melalui fabric tanpa completion balik untuk masing-masing transaksi.

Keuntungan itu sekaligus menjelaskan batas software: latensi write yang rendah dari sudut pandang CPU bukan bukti endpoint telah menyelesaikan transaksi. Prosesor mungkin hanya telah menyerahkan operasi ke komponen downstream.

Pengukuran performa yang mencatat waktu sebuah MMIO store karena itu memerlukan definisi yang presisi. Pengukuran tersebut dapat merekam biaya yang terlihat oleh software untuk menerbitkan store pada konfigurasi platform tertentu, tetapi tidak otomatis mengukur waktu sampai perangkat mengonsumsi write.

Protocol perangkat menentukan batas yang diperlukan

PCIe menyediakan kelas transaksi dan aturan ordering; interface perangkat menentukan observasi yang penting bagi software. Driver perlu menggabungkan kedua lapisan tersebut.

Jika protocol hanya memerlukan delivery yang terurut, accessor MMIO normal dan aturan ordering platform mungkin sudah memadai. Jika software harus memastikan posted write sebelumnya telah bergerak maju sebelum reset, teardown, atau transisi sensitif lain, mekanisme completion eksplisit mungkin diperlukan.

Perbedaan utamanya ringkas:

CPU store completion
PCIe posted-write completion di perangkat

Memisahkan kedua event tersebut mencegah MMIO store yang cepat dianggap sebagai acknowledgement endpoint yang memang tidak disediakan oleh transaksi PCIe Memory Write.