Portas Virtuais não padrão e VMQ
O comutador NIC padrão é um componente de um adaptador de rede que dá suporte à interface sr-IOV (virtualização de E/S) raiz única. A opção sempre anexa a porta virtual padrão (VPort) à PF (Função Física) PCI Express (PCIe). A opção pode anexar um ou mais VPorts não padrão ao PF. Para obter mais informações, consulte Criando uma porta virtual.
A pilha de virtualização é executada no sistema operacional de gerenciamento da partição pai do Hyper-V. Essa pilha cria VPorts emitindo solicitações de método OID (identificador de objeto) de OID_NIC_SWITCH_CREATE_VPORT. No entanto, a pilha pode criar mais VPorts do que o número de VFs (Funções Virtuais pcie) ativas para as quais os recursos foram alocados por meio de solicitações de método OID de OID_NIC_SWITCH_ALLOCATE_VF.
Se SR-IOV estiver habilitado em um adaptador de rede, a funcionalidade VMQ completa deverá ser desabilitada. No entanto, VPorts não padrão anexados ao PF e não anexados a um VF podem fornecer a mesma funcionalidade que a interface VMQ (fila de máquina virtual). Os pontos a seguir discutem como os VPorts podem fornecer caminhos de dados acelerados por hardware para transferência de pacote semelhante ao VMQ:
O VMQ determina a VM de destino pela filtragem do MAC (controle de acesso à mídia) no hardware. Isso evita a sobrecarga de uma determinando a VM de destino na pilha de virtualização.
Começando com Windows Server 2012, a pilha de virtualização configura os filtros de recebimento no VPort emitindo solicitações de método OID de OID_RECEIVE_FILTER_SET_FILTER. Para essa solicitação de OID, a pilha de virtualização passa uma estrutura NDIS_RECEIVE_FILTER_PARAMETERS que especifica o endereço MAC e o identificador de VLAN (LAN virtual) associados ao adaptador de rede virtual. Semelhante ao VMQ, ele pode configurar vários pares de endereço MAC e ID de VLAN no VPort. A pilha de virtualização também especifica o VPort de destino para o qual o filtro de recebimento será definido.
O adaptador de rede SR-IOV executa filtragem de hardware semelhante com base nos critérios de filtragem especificados por meio da solicitação OID_RECEIVE_FILTER_SET_FILTER . Quando um pacote é recebido na fila de recebimento de hardware de um VPort, o driver de miniporto especifica o identificador VPort de origem nos dados OOB (fora de banda) de uma estrutura de NET_BUFFER_LIST para o pacote. Com base no identificador VPort, a pilha de virtualização determina a VM de destino e indica os pacotes para a pilha de rede executada na VM.
Da mesma forma, a pilha de virtualização especifica o identificador VPort de destino nos dados OOB de uma estrutura NET_BUFFER_LIST para um pacote de transmissão. Quando o driver manipula a solicitação de envio do pacote, ele coloca o pacote na fila de transmissão de hardware do VPort especificado.
O identificador VPort pode ser obtido dos dados OOB do pacote usando a macro NET_BUFFER_LIST_RECEIVE_FILTER_VPORT_ID .
Para obter mais informações sobre esse processo, consulte Fluxo de pacotes em uma porta virtual.
Para obter mais informações sobre os requisitos de filtragem de recebimento para um adaptador de rede SR-IOV, consulte Determinando recursos de filtragem de recebimento.
O VMQ fornece interrupção e simultaneidade de DPC.
A partir do NDIS 6.30 e Windows Server 2012, um VPort anexado ao PF pode ser configurado para ter uma afinidade de CPU específica. A pilha de virtualização configura os parâmetros de afinidade de CPU e moderação de interrupção para um VPort usando solicitações de método OID de OID_NIC_SWITCH_CREATE_VPORT ou OID_NIC_SWITCH_VPORT_PARAMETERS. Ao fazer isso, a pilha de virtualização configura parâmetros baseados em interrupção semelhantes ao VMQ para interrupção e simultaneidade de DPC.
Por exemplo, quando o adaptador de rede SR-IOV recebe pacotes em um VPort configurado para ter uma afinidade de CPU específica, o adaptador gera as interrupções na CPU especificada. O driver de miniporto indica os pacotes recebidos para o NDIS e a pilha de virtualização dessa CPU.
O driver de miniporto PF anuncia seus recursos SR-IOV dentro do contexto da chamada para MiniportInitializeEx. O driver inicializa uma estrutura NDIS_SRIOV_CAPABILITIES com seus recursos e chama NdisMSetMiniportAttributes para registrar seus recursos. Para obter mais informações, consulte Determinando recursos SR-IOV.
Os seguintes membros da estrutura NDIS_NIC_SWITCH_CAPABILITIES afetam a maneira como as VPorts são alocadas:
MaxNumVPorts, que especifica o número máximo de VPorts que podem ser criados no adaptador de rede.
MaxNumVFs, que especifica o número máximo de VFs que podem ser alocados no adaptador de rede.
A partir do NDIS 6.30, quando o driver de miniporto inicializa a estrutura NDIS_NIC_SWITCH_CAPABILITIES , ele pode definir o sinalizador NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL no membro NicSwitchCapabilities . Esse sinalizador especifica que as VPorts não padrão podem ser criadas de maneira não atendida do pool de VPort no adaptador de rede. Isso permite que VPorts não padrão disponíveis sejam criados e atribuídos conforme necessário para o PF e VFs alocados. Se o adaptador de rede der suporte à interface VMQ, VPorts não padrão atribuídos ao PF também poderão ser usados para filas de recebimento de VM.
Se o sinalizador NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL estiver definido, VPorts não padrão disponíveis serão criados e atribuídos ao PF e VFs alocados. O número máximo de VPorts que podem ser criados e atribuídos ao PF é o mesmo valor que o driver relata no membro MaxNumVPorts . O driver de miniporto deve reservar um VPort para ser usado como o VPort padrão atribuído ao PF. Como resultado, o número máximo de VPorts não padrão que podem ser atribuídos ao PF e usados para filas de recebimento de VM é (MaxNumVPorts– 1).
Observação
Se esse sinalizador estiver definido, a criação e a atribuição de VPorts não padrão não serão reservadas para alocação de VF. Como resultado, podem ocorrer situações em que um VF pode não ser atribuído a um VPort se o pool tiver sido esgotado de VPorts disponíveis.
Se o sinalizador NDIS_NIC_SWITCH_CAPS_SINGLE_VPORT_POOL não estiver definido, a criação e a atribuição de VPorts não padrão serão reservadas para atribuição de VF. O número máximo de VPorts não padrão adicionais que podem ser criados e atribuídos ao PF e usados para filas de recebimento de VM é (MaxNumVPorts–MaxNumVFs).
Para obter mais informações sobre VMQ, consulte VMQ (Fila de Máquinas Virtuais).