PCI Express tidak memperlakukan setiap request sebagai perjalanan pulang-pergi. Memory Write Request biasanya merupakan transaksi posted: requester mengirim transaction layer packet yang membawa data write, tetapi completer tidak mengembalikan Completion TLP untuk request tersebut. Mekanisme ini mengurangi traffic completion pada jalur ber-volume tinggi, sekaligus membuat ordering dan sinkronisasi eksplisit menjadi penting saat software memerlukan bukti bahwa write sudah mencapai batas tertentu.
Perbedaan ini sangat relevan pada device driver. Penulisan register perangkat yang dipetakan ke memori dapat membuat instruksi store CPU selesai sebelum perangkat target bertindak atas nilai baru. Di antara core dan endpoint terdapat aturan ordering CPU, host bridge, antrean transaksi PCIe, switch, dan buffering pada sisi perangkat.
Posted berarti write tidak menerima completion pada transaction layer
PCIe mengelompokkan request berdasarkan perilaku completion. Read bersifat non-posted karena requester membutuhkan data yang dikembalikan. Memory write bersifat posted karena request sudah membawa payload dan tidak membutuhkan Completion TLP biasa dari tujuan.
requester endpoint
Memory Write TLP ------------------>
|
| tanpa Completion TLP
|
pekerjaan berikutnya dapat berjalanProperti ini meningkatkan efisiensi. Aliran write tidak menghabiskan bandwidth reverse path untuk satu completion packet per write, dan requester tidak perlu menyimpan state sambil menunggu completion tersebut.
Konsekuensinya, ketiadaan completion tidak dapat dipakai sebagai bukti bahwa endpoint telah mengonsumsi write. Software yang membutuhkan jaminan tersebut memerlukan protokol yang membentuk titik ordering yang dapat diamati.
Penyelesaian CPU dan progres PCIe adalah batas berbeda
Register perangkat yang diekspos melalui memory-mapped I/O terlihat seperti alamat bagi software, tetapi perilakunya tidak sama dengan RAM cacheable biasa. CPU dapat menyerahkan store ke jalur I/O platform lalu melanjutkan eksekusi sementara transaksi bergerak menuju endpoint.
MMIO accessor dan barrier yang spesifik terhadap arsitektur tersedia antara lain agar software tidak mengasumsikan ordering yang lebih kuat daripada jaminan platform. Kode driver sebaiknya menggunakan interface I/O perangkat dari sistem operasi, bukan menggantinya dengan pointer store sembarang dan asumsi compiler.
Batas yang relevan juga bergantung pada operasi yang sedang dikoordinasikan. Driver mungkin hanya perlu dua register write mencapai perangkat dalam urutan tertentu, atau perlu memastikan descriptor DMA di system memory terlihat sebelum membunyikan doorbell perangkat. Keduanya terkait, tetapi merupakan persoalan ordering berbeda yang melibatkan aturan memori CPU, koherensi DMA, dan ordering transaksi PCIe.
Read dapat menyediakan titik sinkronisasi
Pola yang umum setelah posted MMIO write adalah melakukan read dari perangkat yang sama saat driver perlu mendorong posted write melewati jalur I/O. Read bersifat non-posted dan membutuhkan Completion yang membawa data. Di bawah aturan ordering PCIe yang berlaku, penyelesaian read tersebut dapat memastikan write terdahulu yang terurut sebelumnya telah bergerak sejauh yang disyaratkan.
host perangkat
write control -------------------->
write doorbell -------------------->
read status -------------------->
<-------------------- Completion + data
lanjut setelah read selesaiIni bukan aturan untuk membaca sembarang register. Register yang dipilih harus aman dibaca, dan spesifikasi perangkat dapat menetapkan side effect atau semantik khusus untuk lokasi tertentu. API driver sistem operasi juga dapat menyediakan helper khusus untuk flush atau ordered MMIO.
Poin strukturalnya adalah posted write tidak menyediakan completion per request, sedangkan operasi non-posted berikutnya dapat membentuk dependensi respons yang digunakan software sebagai bagian dari protokol ordering.
Atribut ordering dapat mengubah reordering yang diizinkan
Ordering transaksi PCIe tidak hanya ditentukan oleh jenis request. Atribut seperti Relaxed Ordering dapat mengizinkan traffic melewati transaksi lain pada kondisi yang dibatasi oleh default ordering. Traffic class dan virtual channel juga memengaruhi pergerakan packet melalui fabric.
Driver tidak dapat membangun model sinkronisasi hanya dari arah packet. Perangkat, platform, dan interface sistem operasi menetapkan akses mana yang terurut serta barrier mana yang diperlukan di sekitarnya.
Untuk jalur kontrol biasa, framework driver umumnya menyembunyikan detail spesifik arsitektur di balik primitive seperti operasi register read dan write serta memory barrier. Pendekatan ini mencegah source code bergantung pada perilaku MMIO satu jenis CPU ketika model driver yang sama harus bekerja di beberapa arsitektur.
Publikasi DMA menambahkan lapisan ordering lain
Register doorbell sering memberi tahu perangkat bahwa descriptor baru sudah tersedia di host memory. Pada urutan tersebut terdapat dua domain visibilitas. Pertama, store descriptor harus terlihat oleh DMA read perangkat. Kedua, MMIO doorbell tidak boleh teramati dengan cara yang membuat perangkat mengambil descriptor sebelum isinya siap.
Urutan sederhananya adalah:
CPU mengisi descriptor di memori
|
DMA write barrier
|
MMIO write ke doorbell perangkat
|
perangkat mengambil descriptorBarrier persisnya bergantung pada sistem operasi, arsitektur, jenis mapping, dan model koherensi DMA. Memory barrier CPU generik dan MMIO flush bukan konsep yang dapat saling menggantikan. Salah satunya mengatur visibilitas memori; yang lain dapat dipakai untuk memaksa progres I/O posted melalui bridge atau fabric.
Pemisahan ini penting saat debugging. Perangkat yang sesekali melihat field descriptor lama dapat menunjukkan ordering publikasi DMA yang hilang meskipun register doorbell akhirnya menerima nilai yang diharapkan.
Error handling tidak mengubah posted write menjadi write ber-acknowledgment
PCIe memiliki mekanisme pelaporan error, reliabilitas link-level, dan aturan transaction layer, tetapi mekanisme tersebut tidak membuat Completion TLP biasa untuk setiap posted Memory Write Request. Acknowledgment pada link layer mengonfirmasi transfer yang berhasil pada satu segmen link; sinyal tersebut bukan pernyataan tingkat aplikasi bahwa endpoint telah menjalankan aksi semantik yang terkait dengan register write.
Demikian pula, Advanced Error Reporting dapat menampilkan kelas error protokol dan perangkat tanpa mengubah traffic posted menjadi pertukaran request-response. Protokol driver yang memerlukan konfirmasi perangkat biasanya memperolehnya melalui status register, completion queue, interrupt, state yang diperbarui lewat DMA, atau mekanisme lain yang didefinisikan perangkat.
Perbedaan ini mencegah kekeliruan kategori yang umum: delivery packet yang andal di dalam fabric PCIe tidak sama dengan jaminan bahwa operasi yang direpresentasikan payload packet sudah selesai.
Posted write mengutamakan throughput dan memindahkan sinkronisasi ke desain protokol
Posted write efisien karena jalur write umum tidak menunggu response packet. Properti tersebut cocok untuk command submission, doorbell, konfigurasi register runtime, dan interaksi perangkat lain yang dominan write.
Saat software memerlukan batas yang lebih kuat, software harus memakai fasilitas ordering yang disediakan arsitektur CPU, sistem operasi, aturan PCIe, dan interface perangkat. Bergantung pada kasusnya, mekanisme tersebut dapat berupa memory barrier, ordered MMIO accessor, readback yang aman, atau completion pada level perangkat.
Model yang berguna adalah memisahkan transmisi dari observasi. Mengirim posted Memory Write Request mendorong data menuju endpoint tanpa completion transaksi biasa. Menetapkan bahwa pekerjaan berikutnya boleh bergantung pada write membutuhkan jalur ordering atau acknowledgment terpisah yang sesuai dengan protokol perangkat.