Invalidasi IOTLB IOMMU Menentukan Saat Remapping DMA Berlaku

Mengubah entry pada page table IOMMU tidak selalu mengubah translasi yang dipakai oleh request DMA berikutnya. IOMMU dapat menyimpan translasi alamat di I/O translation lookaside buffer, yang umum disebut IOTLB. Software harus menginvalidasi state cache yang terdampak ketika sebuah mapping dihapus atau diganti, lalu mengikuti semantik completion yang diwajibkan IOMMU sebelum menganggap translasi lama benar-benar berhenti digunakan.

Batas ini menyerupai pemeliharaan page table CPU, tetapi berada pada address space DMA. Page table merupakan state memori yang menjadi sumber translasi; IOTLB merupakan state hardware yang berasal darinya. Mengubah salah satunya tidak otomatis membuktikan bahwa yang lain telah berhenti melayani translasi sebelumnya.

Translasi IOVA menambah state di antara perangkat dan memori

Perangkat biasanya mengirim transaksi DMA memakai alamat dari DMA address space miliknya. Ketika IOMMU berada pada jalur tersebut, I/O virtual address atau IOVA dapat diterjemahkan ke lokasi memori fisik berdasarkan domain IOMMU dan page table terkait.

request DMA perangkat
        |
        v
       IOVA
        |
        v
  translasi IOMMU
   /           \
IOTLB hit    page-table walk
   \           /
        v
memori fisik

IOTLB hit menghindari page-table walk. Hierarki cache, format entry, aturan lookup, dan command invalidasi bergantung pada implementasi. Konsekuensi umumnya tetap sama: translasi yang valid dapat bertahan di hardware setelah software mengubah page table yang sebelumnya menghasilkan translasi tersebut.

Driver Linux yang memakai DMA API normal biasanya tidak mengirim command invalidasi IOTLB spesifik arsitektur secara langsung. Layer DMA dan IOMMU menangani detail tersebut di balik operasi mapping dan unmapping. Kode IOMMU level rendah, kode virtualisasi, serta interface yang mengekspos translation table yang dikelola userspace harus menangani batas ini secara eksplisit.

Menghapus PTE dan menghentikan translasinya adalah dua peristiwa berbeda

Anggap IOVA 0x4000 dipetakan ke page fisik A. Hardware telah menyimpan translasi tersebut di cache. Software kemudian menghapus entry page table dan akan memakai IOVA yang sama untuk page fisik B.

state awal:
IOVA 0x4000 -> page A
IOTLB: 0x4000 -> page A

software mengubah page table:
IOVA 0x4000 -> page B
IOTLB: 0x4000 -> page A   <- stale sampai diinvalidasi

Jika perangkat dapat mengirim request lain saat entry stale masih dapat digunakan, request itu masih dapat mencapai page A. Menulis entry page table baru saja tidak cukup untuk penggunaan ulang yang aman.

Urutan remapping yang benar bergantung pada interface IOMMU, tetapi tahap logisnya adalah:

hentikan atau cegah DMA yang memakai mapping lama
        |
ubah atau hapus entry page table
        |
invalidasi translation cache yang terdampak
        |
tunggu completion invalidasi yang diwajibkan
        |
izinkan IOVA digunakan kembali atau lepaskan backing memory

Tahap completion penting karena sebagian mekanisme invalidasi dapat masuk queue atau berjalan asynchronous. Dokumentasi arsitektur menetapkan aturan ordering command dan mekanisme completion untuk IOMMU tertentu. Software harus mengikuti kontrak tersebut dan tidak menganggap pengiriman command invalidasi sebagai bukti completion yang berlaku universal.

Translasi stale membuat penggunaan ulang alamat berbahaya

Penggunaan ulang IOVA membuat kegagalan invalidasi semakin merusak. Tanpa penggunaan ulang, entry stale tetap salah, tetapi alamat lama dapat tetap terkait dengan allocation yang sama sampai seluruh DMA berhenti. Ketika alamat itu diberikan kepada page lain, konsekuensinya berubah: translasi lama di cache dapat mengarahkan traffic ke memori yang menurut software sudah tidak berkaitan.

Masalah lifetime yang sama muncul ketika backing memory dibebaskan. Jika perangkat atau translation cache masih dapat mengarahkan DMA ke sebuah page fisik setelah software mengembalikan page itu ke allocator, pemilik berikutnya dapat menerima write dari perangkat yang tidak ditujukan kepadanya.

Ini merupakan aturan lifetime, bukan sekadar aturan translasi. Teardown yang aman harus menyelesaikan kedua sisi batas: perangkat tidak boleh lagi mengirim DMA yang relevan, dan state translasi yang dapat mengarahkan request berikutnya melalui mapping lama harus dihentikan sesuai kontrak platform.

Scope invalidasi mengubah jumlah kerja, bukan syarat correctness

IOMMU dapat menyediakan scope invalidasi yang berbeda. Bergantung pada arsitektur dan implementasi, software mungkin dapat menginvalidasi satu alamat, suatu range, domain, address-space identifier, atau kumpulan state cache yang lebih luas.

Invalidasi sempit dapat mempertahankan translasi cache yang tidak berkaitan. Invalidasi luas dapat lebih sederhana, tetapi dapat membuang state yang masih berguna dan memicu page-table walk berikutnya. Itu adalah pertimbangan implementasi dan performa; keduanya tidak mengubah syarat correctness bahwa entry stale yang mencakup mapping yang berubah tidak boleh tetap dapat digunakan setelah lifetime mapping berakhir.

Infrastruktur IOMMU Linux juga dapat melakukan batching terhadap pekerjaan invalidasi. Batching dapat mengamortisasi overhead command dan sinkronisasi dengan mengubah beberapa mapping sebelum flush dikirim atau diselesaikan. Optimasi tersebut menggeser titik ketika IOVA yang sudah di-unmap aman untuk didaur ulang. Implementasi yang menunda invalidasi juga harus menunda penggunaan ulang atau pelepasan memori yang bergantung pada completion invalidasi.

Translasi di sisi perangkat dapat menambah batas cache

PCIe Address Translation Services, atau ATS, memungkinkan perangkat yang mendukungnya menyimpan translated address di Address Translation Cache milik perangkat. Pada konfigurasi seperti ini, penghapusan entry page table IOMMU dapat melibatkan lebih dari IOTLB milik IOMMU.

Platform dan arsitektur IOMMU menetapkan koordinasi yang diperlukan untuk menginvalidasi state translasi perangkat. Software tidak dapat menganggap flush pada cache lokal IOMMU saja selalu cukup ketika perangkat diizinkan mempertahankan translasi.

Jalur tersebut menjadi berlapis:

request perangkat
    |
device translation cache, jika aktif
    |
IOMMU translation cache
    |
IOMMU page table
    |
memori fisik

Tidak semua sistem memakai ATS, dan tidak semua perangkat mendukungnya. Batas tambahan ini bersifat kondisional, tetapi ketika aktif ia menjadi bagian dari pengelolaan lifetime translasi, bukan sekadar detail performa opsional.

Invalidasi translasi berbeda dari koherensi CPU cache

Pemeliharaan IOTLB dan pemeliharaan data cache CPU menyelesaikan masalah yang berbeda. Invalidasi IOTLB mengontrol translasi alamat yang dipakai untuk DMA. Sinkronisasi CPU cache mengontrol visibilitas isi buffer pada sistem yang akses CPU dan perangkatnya tidak otomatis koheren.

Sebuah mapping dapat memiliki translasi IOVA yang benar dan terbaru sementara data pada page target masih memerlukan pemeliharaan cache. Sebaliknya, isi buffer dapat koheren sementara entry IOTLB usang masih menunjuk ke page fisik yang salah.

Memory ordering juga merupakan persoalan terpisah. Barrier dapat membatasi urutan software memublikasikan descriptor, data, atau control state, tetapi CPU memory barrier bukan pengganti generik untuk operasi invalidasi IOMMU. Setiap mekanisme menutup batas hardware yang berbeda.

DMA API menjaga sebagian besar driver tetap di atas batas ini

Untuk driver perangkat Linux biasa, dma_map_*() dan dma_unmap_*() merupakan interface portabel. Pada sistem yang memakai IOMMU, operasi tersebut dapat mengalokasikan ruang IOVA, memasang translasi, menghapus translasi, dan memicu pekerjaan invalidasi spesifik arsitektur yang diperlukan implementasi DMA.

Abstraksi ini penting karena dma_addr_t yang dikembalikan merupakan alamat yang terlihat oleh perangkat, bukan jaminan tentang physical addressing. Driver yang melewati aturan lifetime DMA API juga dapat tanpa sengaja melewati bookkeeping IOMMU.

Interface untuk I/O page table yang dikelola userspace mengekspos lebih banyak mekanisme. Linux IOMMUFD, misalnya, menyediakan operasi invalidasi untuk kondisi ketika userspace mengelola struktur translasi. Interface semacam itu mendefinisikan kontrak cache invalidation secara eksplisit karena kernel tidak dapat menyimpulkan setiap perubahan page table yang dilakukan di luar jalur DMA mapping biasa.

Batas praktisnya tetap sama pada setiap layer: mengubah translation table, menghentikan translasi cache, dan membuktikan bahwa sebuah alamat dapat digunakan kembali merupakan operasi yang saling berkaitan, tetapi bukan peristiwa yang sama.