Todos os produtos
Search
Central de documentação

:Troubleshoot virtio hot-unplug Oops exception

Última atualização: Aug 20, 2026

Este tópico descreve como resolver uma exceção Oops que ocorre ao remover um dispositivo virtio (hot-unplug) de uma instância ECS com versão recente do kernel.

Sintomas

A remoção de um dispositivo virtio, como disco ou NIC, de uma instância ECS em execução com versão específica e recente do kernel pode causar uma exceção Oops. Esse erro resulta em um dos seguintes cenários:

  • Se a instância estiver configurada com kernel.panic_on_oops = 1, ocorre um kernel panic.

  • Caso a instância esteja configurada com kernel.panic_on_oops = 0, o kernel deixa de responder.

Nota

O parâmetro kernel.panic_on_oops controla o comportamento do kernel ao encontrar um Oops (erro de kernel).

  • Kernel panic: o sistema interrompe a tarefa atual, salva informações de depuração e reinicia ou desliga. Essa abordagem permite resposta rápida ao problema e minimiza danos potenciais.

  • Kernel sem resposta: o kernel tenta continuar a execução. Não recomendamos essa opção em ambientes de produção, pois pode levar à corrupção de dados ou a outros problemas críticos.

Causa

A comunidade upstream do Linux introduziu esse problema neste commit, que adicionou suporte ao admin virtqueue para dispositivos virtio.

Esse commit trouxe as seguintes alterações:

  • Adição do ponteiro de função is_avq à definição de virtio_pci_device para verificar a existência de um admin virtqueue.

  • A função virtio_pci_modern_probe, responsável por inicializar dispositivos virtio modernos, atribui valor ao ponteiro de função 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;
  • Durante o hot-unplug de um dispositivo virtio, o código verifica se a fila atual é um 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;
                    }
            }

No entanto, em dispositivos virtio legados, o ponteiro de função is_avq não é inicializado e permanece nulo. Consequentemente, ao remover um dispositivo virtio legado, a chamada if (vp_dev->is_avq(vdev, vq->index)) tenta desreferenciar um ponteiro nulo. Isso aciona uma exceção capaz de causar falha no sistema.

Escopo afetado

  • Comunidade upstream do Linux

    A comunidade upstream corrigiu esse problema neste commit. A correção adiciona verificação de nulo para o ponteiro de função is_avq antes da chamada.

  • Sistema operacional

  • Dispositivo virtio

    Esse problema afeta dispositivos virtio legados durante o hot-unplug em instâncias ECS.

Soluções

  • Solução 1: migre para uma família de instâncias que utilize dispositivos virtio modernos, como as famílias de 8ª geração ou posteriores. Essas famílias não são afetadas por esse problema. Para mais informações, consulte Change instance types. Para saber mais sobre famílias de instâncias, veja Instance families.

  • Solução 2:

    1. Atualize para o pacote de kernel mais recente e verifique se ele inclui o patch virtio-pci: Check if is_avq is NULL.

    2. (Condicionalmente obrigatório) Caso o kernel mais recente não inclua o patch, aplique-o manualmente.

Apêndice: Termos

Esta seção explica os principais termos utilizados neste tópico, como dispositivo virtio, admin virtqueue e virtio_pci_device.

Termo

Descrição

Dispositivo virtio

O Virtio é um framework padronizado para virtualização de I/O que permite às máquinas virtuais interagir eficientemente com o hardware virtual do host. Um dispositivo virtio, como disco ou NIC, é um dispositivo emulado em ambiente virtualizado. Esses dispositivos classificam-se como legados ou modernos, distinguindo-se principalmente pela interface de configuração utilizada.

Admin virtqueue

Fila especial usada para operações de gerenciamento de dispositivos, como consultar status ou aplicar alterações de configuração. Nem todos os dispositivos virtio suportam admin virtqueue.

virtio_pci_device

Estrutura de dados no kernel que representa um dispositivo PCI virtio. Contém ponteiros para várias funções, incluindo o ponteiro de função is_avq, usado para verificar se determinada fila é um admin virtqueue.

is_avq

Ponteiro de função que, quando atribuído, aponta para uma função responsável por verificar se uma fila virtio específica é um admin virtqueue.

virtio_pci_modern_probe

Função encarregada de detectar e inicializar um dispositivo PCI virtio. Após o sistema descobrir um dispositivo, essa função conclui a configuração, o que inclui ler o espaço de configuração, detectar recursos do dispositivo e alocar os recursos necessários.

RIP

O registrador RIP (Instruction Pointer) em uma CPU x86 armazena o endereço da próxima instrução a ser executada. Quando ocorre uma exceção, como tentativa de desreferenciar ponteiro nulo, o RIP aponta para o endereço da instrução que causou a falha.