MSI-X Memungkinkan Queue Perangkat Menargetkan Jalur Interrupt CPU Terpisah
Perangkat PCIe multiqueue dapat memindahkan data melalui banyak queue secara bersamaan, tetapi satu jalur interrupt akan mengumpulkan penanganan completion kembali ke satu sinyal. MSI-X menghilangkan pemusatan tersebut dari interface interrupt perangkat. Setiap entry MSI-X yang dialokasikan mewakili message-signaled interrupt yang dapat dikonfigurasi secara independen, sehingga driver dapat mengaitkan queue atau kelas event yang berbeda dengan Linux IRQ dan kebijakan CPU affinity yang berbeda.
Mekanisme ini tidak dengan sendirinya membuat pemrosesan queue menjadi paralel. MSI-X memberi sistem operasi dan driver identitas interrupt yang cukup untuk mempertahankan pemisahan queue setelah perangkat melaporkan event.
Interrupt adalah memory write, bukan shared wire
PCI INTx lama menggunakan sinyal interrupt berbasis pin dan dapat berbagi interrupt line dengan perangkat lain. Message Signaled Interrupts memakai mekanisme berbeda: perangkat melakukan memory write ke address dan data value yang dikonfigurasi platform. Interrupt controller menafsirkan write tersebut sebagai interrupt.
MSI-X memperluas model ini dengan tabel entry yang dapat dikonfigurasi secara independen. Sebuah device function mengekspos capability MSI-X dan tabel yang berada pada salah satu BAR. Setiap entry berisi field message address dan message data serta state vector control. Software platform memprogram field tersebut sebagai bagian dari setup interrupt.
Secara konseptual, beberapa event perangkat dapat memiliki rute berbeda:
device queue 0 ----> MSI-X entry 0 ----> Linux IRQ A
device queue 1 ----> MSI-X entry 1 ----> Linux IRQ B
device queue 2 ----> MSI-X entry 2 ----> Linux IRQ C
device errors ----> MSI-X entry 3 ----> Linux IRQ DMapping yang tepat merupakan keputusan driver dengan batas dari capability perangkat dan resource interrupt yang tersedia. MSI-X menyediakan entry; mekanisme ini tidak menetapkan bahwa setiap queue harus memperoleh satu vector.
Identitas vector mempertahankan identitas queue
Satu interrupt untuk banyak queue memaksa handler menentukan queue mana yang memerlukan layanan. Dengan vector terpisah, interrupt itu sendiri dapat menunjukkan sumber yang lebih sempit.
Perangkat network dan storage sering memanfaatkan properti ini. Driver dapat mengikat satu receive queue atau I/O queue ke satu vector, lalu mendaftarkan handler dengan context khusus queue. Handler dapat langsung memulai dari queue yang terkait dengan IRQ tersebut tanpa memindai queue lain untuk mencari pekerjaan.
Pemisahan ini tetap berguna ketika beberapa vector akhirnya menargetkan CPU yang sama. Source multiplexing tidak lagi berada pada jalur interrupt seluruh perangkat dan driver dapat mempertahankan state per queue. Ketika vector disebarkan ke beberapa CPU, pemisahan itu juga menyediakan rute agar kerja completion queue masuk ke kernel melalui processor yang berbeda.
Linux menyediakan mekanisme ini melalui PCI MSI API. Driver dapat meminta rentang vector dengan pci_alloc_irq_vectors() atau menggunakan pci_alloc_irq_vectors_affinity() ketika memiliki kebutuhan affinity eksplisit. Jumlah yang dikembalikan dapat lebih kecil daripada maksimum yang diminta, sehingga driver yang mendukung jumlah queue variabel perlu membangun topologi queue berdasarkan resource yang benar-benar dialokasikan.
MSI dan MSI-X memiliki batas alokasi yang berbeda
MSI biasa juga dapat menyediakan beberapa vector, tetapi model alokasinya lebih ketat. Dokumentasi Linux mencatat bahwa vector MSI dialokasikan dalam kelompok power-of-two dan pada platform tertentu dapat terkena batas penargetan CPU bersama. MSI-X mendukung entry yang dikonfigurasi secara independen dan jumlah vector yang jauh lebih besar.
Perbedaan tersebut memengaruhi struktur driver. Perangkat yang mengekspos puluhan I/O queue dapat mempertahankan susunan satu vector per queue dengan MSI-X, sementara mode dengan alokasi interrupt lebih kecil mungkin membutuhkan queue lebih sedikit atau lebih banyak sharing.
Driver tidak semestinya menentukan topologi akhir hanya dari maksimum yang diiklankan perangkat. Ruang vector platform, perilaku interrupt controller, arsitektur, firmware, virtualisasi, dan kebijakan kernel dapat mengurangi resource yang tersedia. Hasil alokasi menjadi kontrak operasional untuk instance perangkat tersebut.
CPU affinity adalah lapisan kebijakan terpisah
Tabel MSI-X membedakan interrupt message, tetapi identitas vector dan penempatan CPU bukan properti yang sama. Linux IRQ affinity menentukan CPU mana yang memenuhi syarat untuk melayani interrupt.
Ketika driver meminta vector dengan pengelolaan affinity, subsistem PCI dan IRQ dapat menyebarkan vector ke CPU yang tersedia. Untuk perangkat berbasis queue, hasilnya dapat berbentuk:
queue 0 -> IRQ 120 -> CPU 2
queue 1 -> IRQ 121 -> CPU 6
queue 2 -> IRQ 122 -> CPU 10
queue 3 -> IRQ 123 -> CPU 14Susunan ini tidak dijamin tetap untuk setiap IRQ. CPU hotplug, kebijakan affinity, routing interrupt spesifik arsitektur, dan pengelolaan sistem dapat memengaruhi penempatan efektif. Driver yang bergantung pada managed affinity juga harus mengikuti aturan lifecycle interrupt tersebut.
Affinity dapat mengurangi handoff lintas CPU ketika interrupt queue dan context pemrosesan utamanya ditempatkan secara selaras, tetapi hasil itu bergantung pada bagian lain dari data path. Receive-side steering, penempatan scheduler, topologi NUMA, penempatan aplikasi, dan pemilihan device queue dapat memindahkan pekerjaan setelah interrupt awal. MSI-X menyediakan routing primitive, bukan kebijakan locality yang lengkap.
Managed interrupt mengaitkan ketersediaan queue dengan ketersediaan CPU
Jumlah queue yang besar membawa batas lain: interrupt vector adalah resource terbatas. Linux mendukung affinity-managed interrupt agar driver dapat mengaitkan queue interrupt dengan CPU affinity mask sementara IRQ core mengelola lifecycle-nya.
Managed interrupt dapat dimatikan ketika tidak ada CPU dalam managed affinity mask yang tetap online. Perilaku ini berbeda dari unmanaged IRQ biasa yang sering dapat dipindahkan ke CPU online lain. Driver harus melakukan quiesce pada queue terkait ketika managed interrupt dinonaktifkan; jika tidak, perangkat dapat terus menghasilkan event untuk queue tanpa jalur interrupt aktif.
Hubungan ini membuat setup queue menjadi masalah alokasi resource, bukan cerminan statis capability hardware. Perangkat dapat mengiklankan banyak queue, tetapi jumlah queue yang berguna dibatasi oleh vector dan penempatan CPU yang dapat didukung sistem secara aman.
Banyak vector juga mengubah asumsi locking
Vector terpisah dapat menjalankan interrupt handler secara bersamaan pada CPU yang berbeda. Desain lock yang aman dengan satu sumber interrupt dapat menjadi tidak aman ketika driver mengaktifkan beberapa vector MSI atau MSI-X.
Dokumentasi PCI Linux menyoroti kasus per-device spinlock yang digunakan beberapa interrupt handler. Dengan banyak interrupt, satu handler dapat memegang lock ketika interrupt lain tiba dan mencoba memperoleh lock yang sama. Driver harus memakai locking primitive dan aturan interrupt masking yang sesuai dengan pola concurrency tersebut.
Poin yang lebih luas adalah penambahan vector mengubah lebih dari routing. Perubahan ini dapat membuka jalur eksekusi paralel di dalam driver yang sebelumnya terserialisasi di belakang satu interrupt. Struktur data queue-local mengurangi shared locking, tetapi state yang dibagi antar-vector tetap memerlukan sinkronisasi yang sesuai dengan context aksesnya.
Interrupt moderation berada di atas routing vector
Perangkat tidak harus menghasilkan interrupt untuk setiap descriptor yang selesai. Banyak perangkat ber-throughput tinggi menerapkan interrupt moderation atau coalescing, menunda atau mengelompokkan notifikasi sehingga satu pengiriman vector mewakili beberapa event queue.
MSI-X dan moderation menangani masalah berbeda. MSI-X membedakan jalur event dan memungkinkan routing independen. Moderation mengendalikan frekuensi notifikasi. Sebuah queue dapat memiliki vector sendiri dan tetap menghasilkan interrupt relatif sedikit saat traffic tinggi jika perangkat atau driver melakukan coalescing pada completion.
Moderation agresif dapat mengurangi overhead interrupt sekaligus menambah notification delay. Pengaturan yang sesuai bergantung pada workload, queue depth, kebutuhan latency, dan perilaku perangkat. Tidak ada jumlah vector atau interval moderation tunggal yang optimal untuk semua sistem.
Vector menjadi bagian dari arsitektur queue
MSI-X paling berguna ketika identitas interrupt sesuai dengan struktur work queue perangkat. Sebuah vector dapat membawa jalur completion queue langsung ke IRQ handler yang terkait dengan queue tersebut, sementara affinity dapat menempatkan entry point itu pada CPU tertentu. Pemisahan yang semula dapat runtuh pada batas notifikasi tetap terjaga.
Topologi akhirnya tetap merupakan hasil negosiasi. Hardware menyediakan jumlah entry maksimum, platform menyediakan resource interrupt, Linux menetapkan IRQ dan affinity, lalu driver memetakan resource tersebut ke queue. Menjadikan hasil alokasi vector sebagai bagian dari konstruksi queue membuat batas-batas ini eksplisit dan menghindari asumsi bahwa jumlah hardware queue saja menentukan kapasitas I/O paralel.