Masking Per-Vector MSI-X Memisahkan Kontrol Interrupt Antar-Queue Perangkat

PCI function yang memakai MSI-X dapat mengekspos beberapa interrupt vector dengan state delivery yang dikontrol secara independen. Software dapat melakukan mask pada satu entry tabel MSI-X sementara entry lain yang aktif tetap dapat mengirim interrupt. Properti ini penting pada perangkat multi-queue karena kontrol interrupt dapat mengikuti pembagian kerja I/O, alih-alih menempatkan semua sumber notifikasi di balik satu state interrupt untuk seluruh perangkat.

Mekanisme ini bukan jaminan bahwa setiap hardware queue selalu memperoleh vector unik. Alokasi vector, topologi queue, kebijakan driver, dan resource platform menentukan pemetaannya. MSI-X menyediakan message entry yang dapat dikonfigurasi secara independen; perangkat dan driver menentukan event internal yang memilih entry tersebut.

Setiap entry tabel membawa interrupt message sendiri

MSI-X memakai tabel yang terkait dengan PCI function. Setiap entry tabel memuat message address, message data, dan state vector-control untuk satu entry MSI-X. PCI function mengiklankan lokasi tabel melalui MSI-X capability, dengan tabel berada di address space BAR yang diidentifikasi capability tersebut.

Secara konseptual, perangkat dengan beberapa sumber event dapat disusun seperti ini:

RX queue 0 ----> MSI-X entry 0 ----> interrupt target
RX queue 1 ----> MSI-X entry 1 ----> interrupt target
TX completion -> MSI-X entry 2 ----> interrupt target
admin events --> MSI-X entry 3 ----> interrupt target

Diagram tersebut menggambarkan salah satu desain perangkat, bukan persyaratan PCI. Sebuah function dapat memetakan beberapa sumber event ke satu entry, mengekspos entry lebih sedikit daripada jumlah queue internal, atau menerapkan skema routing khusus perangkat.

Perbedaan ini memisahkan kapasitas MSI-X dari jumlah queue. Jumlah entry tabel menyatakan kapasitas MSI-X vector pada function. Nilai itu sendiri tidak menunjukkan jumlah receive queue, transmit queue, completion queue, atau sumber management event yang diimplementasikan perangkat.

Per-vector masking membatasi cakupan penekanan interrupt

Entry tabel MSI-X memiliki per-vector mask bit. Mask pada satu entry menekan pengiriman interrupt message untuk entry tersebut tanpa mengharuskan semua entry MSI-X lain ikut di-mask. MSI-X capability juga menyediakan kontrol tingkat function yang dapat melakukan mask pada vector MSI-X milik function sebagai satu grup.

Kedua cakupan tersebut melayani operasi berbeda. Driver dapat menekan sementara jalur interrupt satu queue saat queue itu sedang diproses atau dikonfigurasi ulang, sementara vector yang tidak terkait tetap aktif. Function-level masking lebih luas dan berguna ketika software memerlukan batas delivery MSI-X untuk seluruh perangkat.

State mask mengontrol signaling interrupt, bukan operasi I/O yang mendasarinya. Receive queue dapat terus menerima data, perangkat dapat terus memperbarui completion state, dan kondisi event internal dapat terus muncul ketika vector terkait sedang di-mask, sesuai aturan queue dan flow control milik perangkat.

Karena itu, masking tidak sama dengan menghentikan queue. Queue disable, penghentian DMA, interrupt masking, dan device reset merupakan kontrol terpisah kecuali spesifikasi perangkat secara eksplisit mengaitkannya.

Pending state mempertahankan indikasi event selama interval mask

MSI-X mendefinisikan pending state yang terkait dengan vector melalui Pending Bit Array. Ketika kondisi interrupt memerlukan MSI-X message tetapi delivery diblokir oleh masking, pending state memungkinkan function mencatat bahwa vector memerlukan service.

Titik arsitekturalnya adalah retensi indikasi event pada interface interrupt, bukan event counter tanpa batas. Pending bit merepresentasikan service yang masih tertunda untuk sebuah vector; bit tersebut tidak menyimpan jumlah event perangkat individual yang terjadi saat vector di-mask.

Perbedaan ini penting pada perangkat berbasis queue. Jika dua puluh completion tiba saat satu vector di-mask, software tidak boleh menganggap MSI-X sendiri menyimpan hitungan dua puluh notifikasi. Completion ring atau struktur data lain yang ditentukan perangkat biasanya membawa detail work state. Interrupt memberi indikasi agar software memeriksa state tersebut.

queue completions accumulate
          |
          v
vector is masked
          |
          v
pending indication retained
          |
          v
vector unmasked
          |
          v
software services device state

Urutan persis yang dipakai driver saat masking dan unmasking bergantung pada perangkat serta API interrupt sistem operasi. MSI-X mendefinisikan mekanisme interrupt; mekanisme ini tidak menggantikan aturan khusus perangkat untuk acknowledgment cause atau menguras completion queue.

Vector independen memungkinkan CPU affinity yang independen

Efek operasional utama dari beberapa MSI-X vector adalah sistem operasi dapat memperlakukannya sebagai interrupt terpisah. Pada platform yang mendukung routing terkait, vector yang berbeda dapat diberi CPU affinity yang berbeda.

Hal ini dapat menyelaraskan pemrosesan queue dengan penempatan CPU. Network adapter, storage controller, atau perangkat multi-queue lain dapat mengekspos beberapa sumber interrupt, lalu driver mengaitkan pekerjaan queue dengan vector yang didistribusikan sistem operasi ke beberapa CPU.

MSI-X tidak menjamin hasil performa tertentu dari distribusi tersebut. Cache locality, penempatan NUMA, queue depth, interrupt moderation, kebijakan scheduler, penempatan aplikasi, dan implementasi perangkat semuanya memengaruhi hasil aktual. Properti arsitekturalnya adalah pemisahan interrupt message, bukan peningkatan throughput atau penurunan latency dengan nilai tetap.

Linux mencerminkan perbedaan ini dalam API interrupt PCI. Driver dapat meminta rentang jumlah vector, dan jumlah yang benar-benar dialokasikan dapat lebih rendah daripada maksimum yang diminta. Driver harus membangun layout queue-to-vector dari hasil alokasi tersebut, bukan menganggap seluruh kapasitas tabel MSI-X perangkat selalu tersedia.

Interrupt moderation dan vector masking menangani masalah berbeda

Interrupt moderation mengubah timing atau agregasi notifikasi. Per-vector masking mengubah apakah entry MSI-X tertentu diizinkan mengirim message. Keduanya dapat dipakai bersamaan, tetapi bukan pengganti satu sama lain.

NIC dapat melakukan moderasi interrupt untuk RX queue sehingga beberapa completion menghasilkan lebih sedikit notifikasi CPU. Driver juga dapat melakukan mask pada vector queue tersebut selama jalur polling memproses pekerjaan. Moderation menentukan kapan perangkat mencoba memberi notifikasi sesuai kebijakannya; masking menentukan apakah MSI-X vector saat itu diizinkan memberi sinyal.

Pemisahan ini terlihat pada network driver berorientasi polling. Interrupt perangkat dapat menjadwalkan pemrosesan paket, kemudian sumber interrupt queue tetap ditekan selama software menguras pekerjaan. Notifikasi dipulihkan setelah fase polling mencapai kondisi selesai. Register khusus perangkat atau fitur automatic masking juga dapat berperan dalam urutan tersebut selain state MSI-X.

Jalur kontrol persisnya bersifat implementation-specific. Driver tidak dapat menganggap penulisan MSI-X mask bit saja menjalankan seluruh operasi interrupt acknowledgment yang diwajibkan perangkat tertentu.

MSI-X message tidak berperilaku seperti shared legacy interrupt line

Signaling INTx lama memakai model interrupt berbasis pin dan dapat melibatkan shared interrupt line. MSI-X memakai message-signaled interrupt. Setiap MSI-X vector yang dialokasikan direpresentasikan kepada sistem operasi sebagai resource interrupt tersendiri, bukan sebagai assertion pada physical pin bersama.

Hal ini mengubah batas software. Pada shared INTx line, interrupt handler mungkin perlu memeriksa status perangkat untuk menetapkan apakah perangkatnya menjadi sumber interrupt. MSI-X vector ditetapkan untuk function dan routing event yang dikonfigurasi bagi vector tersebut, sehingga perangkat lain tidak berbagi MSI-X message itu seperti pada legacy line.

Status perangkat tetap penting. Interrupt vector mengidentifikasi jalur notifikasi, tetapi driver umumnya tetap harus memeriksa queue descriptor, completion entry, atau cause register untuk menentukan pekerjaan yang telah selesai. MSI-X menghapus legacy line sharing; mekanisme ini tidak memasukkan detail completion perangkat arbitrer ke dalam interrupt.

Independensi vector tetap dibatasi resource perangkat dan platform

MSI-X dapat mengekspos jauh lebih banyak vector daripada MSI konvensional, dan entry-nya dapat dikonfigurasi secara independen. Driver tetap bekerja di dalam beberapa batas: ukuran tabel yang diimplementasikan function, vector yang dapat dialokasikan sistem operasi, constraint interrupt routing platform, dan desain queue milik driver.

Driver multi-queue yang kokoh karena itu memperlakukan jumlah vector sebagai kapasitas hasil negosiasi. Jika vector yang tersedia lebih sedikit daripada queue, beberapa queue mungkin perlu berbagi satu vector. Jika vector yang tersedia lebih banyak daripada sumber event yang berguna, mengalokasikan setiap entry yang mungkin tidak memberi manfaat inheren.

Per-vector masking tetap berguna di dalam layout hasil negosiasi tersebut. Mekanisme ini memberi software batas kontrol untuk setiap jalur interrupt yang dialokasikan, sementara queue state, completion accounting, penempatan CPU, dan acknowledgment khusus perangkat tetap menjadi bagian terpisah dari desain I/O.