All Products
Search
Document Center

:Memecahkan Masalah Pengecualian Oops saat Hot-Unplug Perangkat virtio

Last Updated:Jun 21, 2026

Topik ini menjelaskan cara mengatasi pengecualian Oops yang terjadi saat Anda melakukan hot-unplug perangkat virtio dari Instance ECS yang menjalankan versi kernel terbaru.

Gejala

Melakukan hot-unplug perangkat virtio, seperti disk atau NIC, dari Instance ECS yang menjalankan versi kernel terbaru tertentu dapat menyebabkan pengecualian Oops, yang mengakibatkan salah satu kondisi berikut:

  • Jika instans dikonfigurasi dengan kernel.panic_on_oops = 1, terjadi kernel panic.

  • Jika instans dikonfigurasi dengan kernel.panic_on_oops = 0, kernel menjadi tidak responsif.

Catatan

kernel.panic_on_oops adalah parameter kernel yang mengatur perilaku kernel saat menghadapi pengecualian Oops (kesalahan kernel).

  • Kernel panic: Sistem menghentikan tugas saat ini, menyimpan informasi debugging, lalu melakukan reboot atau shutdown. Hal ini memungkinkan respons cepat terhadap masalah dan meminimalkan potensi kerusakan.

  • Ketidakresponsifan kernel: Kernel mencoba terus berjalan. Hal ini tidak disarankan di lingkungan produksi karena dapat menyebabkan korupsi data atau masalah kritis lainnya.

Penyebab

Komunitas hulu Linux memperkenalkan isu ini dalam commit ini, yang menambahkan dukungan untuk admin virtqueue pada perangkat virtio.

Commit tersebut memperkenalkan perubahan berikut:

  • Pointer fungsi is_avq ditambahkan ke definisi virtio_pci_device untuk memeriksa keberadaan admin virtqueue.

  • Fungsi virtio_pci_modern_probe, yang bertanggung jawab atas inisialisasi perangkat virtio modern, menginisialisasi pointer fungsi is_avq.

    @@ -588,6 +658,7 @@ int virtio_pci_modern_probe(struct virtio_pci_device *vp_dev)
     	vp_dev->config_vector = vp_config_vector;
     	vp_dev->setup_vq = setup_vq;
     	vp_dev->del_vq = del_vq;
    +	vp_dev->is_avq = vp_is_avq;
     	vp_dev->isr = mdev->isr;
     	vp_dev->vdev.id = mdev->id;
  • Saat perangkat virtio dilakukan hot-unplug, kode memeriksa apakah antrian saat ini merupakan admin virtqueue.

    @@ -236,6 +236,9 @@ void vp_del_vqs(struct virtio_device *vdev)
            int i;
            list_for_entry_safe(vq, n, &vdev->vqs, list) {
    +               if (vp_dev->is_avq(vdev, vq->index))
    +                       continue;
    +
                    if (vp_dev->per_vq_vectors) {
                            int v = vp_dev->vqs[vq->index]->msix_vector;
                    }
            }

Namun, pada perangkat virtio legacy, pointer fungsi is_avq tidak diinisialisasi dan tetap sebagai pointer null. Akibatnya, saat Anda melakukan hot-unplug perangkat virtio legacy, pemanggilan if (vp_dev->is_avq(vdev, vq->index)) mencoba melakukan dereferensi pointer null, yang memicu pengecualian dan dapat menyebabkan crash sistem.

Cakupan yang Terdampak

  • Komunitas hulu Linux

    Komunitas hulu telah menyelesaikan isu ini dalam commit ini. Perbaikan tersebut menambahkan pemeriksaan null pada pointer fungsi is_avq sebelum memanggilnya.

  • Sistem operasi

  • Perangkat virtio

    Isu ini memengaruhi perangkat virtio legacy saat dilakukan hot-unplug dari Instance ECS.

Solusi

  • Solusi 1: Beralih ke keluarga instans yang menggunakan perangkat virtio modern, seperti keluarga instans generasi ke-8 atau yang lebih baru. Keluarga instans ini tidak terdampak oleh isu ini. Untuk informasi selengkapnya, lihat Ubah tipe instans. Untuk mempelajari lebih lanjut tentang keluarga instans, lihat Keluarga instans.

  • Solusi 2:

    1. Upgrade ke paket kernel terbaru dan pastikan paket tersebut mencakup patch virtio-pci: Periksa apakah is_avq bernilai NULL.

    2. (Diperlukan secara kondisional) Jika kernel terbaru tidak mencakup patch tersebut, Anda harus menerapkannya secara manual.

Lampiran: Istilah

Bagian ini menjelaskan istilah kunci yang digunakan dalam topik ini, seperti perangkat virtio, admin virtqueue, dan virtio_pci_device.

Istilah

Deskripsi

virtio device

Virtio adalah framework standar untuk virtualisasi I/O yang memungkinkan mesin virtual berinteraksi secara efisien dengan perangkat keras virtual host. Perangkat virtio, seperti disk atau NIC, adalah perangkat emulasi dalam lingkungan tervirtualisasi. Perangkat ini diklasifikasikan sebagai legacy atau modern, yang dibedakan terutama berdasarkan antarmuka konfigurasi yang digunakan.

admin virtqueue

Admin virtqueue adalah antrian khusus yang digunakan untuk operasi manajemen perangkat, seperti menanyakan status perangkat atau menerapkan perubahan konfigurasi. Tidak semua perangkat virtio mendukung admin virtqueue.

virtio_pci_device

Ini adalah struktur data dalam kernel yang merepresentasikan perangkat virtio PCI. Struktur ini berisi pointer ke berbagai fungsi, termasuk pointer fungsi is_avq, yang digunakan untuk memeriksa apakah antrian tertentu merupakan admin virtqueue.

is_avq

Pointer fungsi yang, jika diberi nilai, menunjuk ke fungsi yang memeriksa apakah antrian virtio tertentu merupakan admin virtqueue.

virtio_pci_modern_probe

Fungsi ini bertanggung jawab mendeteksi dan menginisialisasi perangkat virtio PCI. Setelah sistem menemukan perangkat, fungsi ini dipanggil untuk menyelesaikan proses penyiapan, termasuk membaca ruang konfigurasi, mendeteksi fitur perangkat, dan mengalokasikan sumber daya yang diperlukan.

RIP

Register RIP (Instruction Pointer) pada CPU x86 menyimpan alamat instruksi berikutnya yang akan dieksekusi. Saat terjadi pengecualian, seperti upaya dereferensi pointer null, RIP menunjuk ke alamat instruksi yang gagal.