Compartilhar via


Notificação de alocação

Importante

Algumas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.

Há momentos em que determinadas operações precisam ser executadas em uma alocação que está prestes a passar por uma operação de evicção ou promoção de paginação. Por exemplo, uma alocação pode ser compactada quando está sob acesso ao dispositivo. Quando essa alocação está sendo removida (ou seja, não está mais sob acesso ao dispositivo), o KMD (driver do modo kernel) deve primeiro descompactá-la antes da remoção real. A operação de paginação DXGK_OPERATION_NOTIFY_ALLOC foi projetada para essa finalidade. Essa operação está disponível a partir do Windows 11, versão 24H2 (WDDM 3.2).

Como solicitar notificações de alocação

Quando o sistema chama DxgkDdiCreateAllocation para criar uma alocação, o KMD pode definir sinalizadores em DXGK_ALLOCATIONINFOFLAGS2 para instruir Dxgkrnl a executar a operação de paginação DXGK_OPERATION_NOTIFY_ALLOC. Os sinalizadores de notificação atuais são:

  • NotifyEviction
  • NotifyIoMmuUnmap

Alterações de DDI

A operação de paginação DXGK_OPERATION_NOTIFY_ALLOC foi acrescentada.

Sinalizadores adicionados ao DXGK_ALLOCATIONINFOFLAGS2

Os sinalizadores a seguir são adicionados a DXGK_ALLOCATIONINFOFLAGS2.

  • NotifyEviction

    O KMD define o sinalizador NotifyEviction em sua implementação DxgkDdiCreateAllocation . Este indicador indica que o Dxgkrnl deve realizar a operação DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction para o driver antes de desalocar uma alocação.

    Quando o sinalizador é especificado e a alocação está prestes a ser removida:

    • O Dxgkrnl mapeia a alocação para o espaço de VA (endereço virtual de GPU) do processo de paginação.
    • Dxgkrnl chama DxgkDdiBuildPagingBuffer com a operação DXGK_OPERATION_NOTIFY_ALLOC e o sinalizador NotifyEviction .
    • O driver cria comandos no buffer de DMA de paginação.
    • O buffer de memória DMA de paginação é remetido para execução no contexto do sistema.
    • Dxgkrnl desmapeia a alocação do espaço de VA da GPU do processo de paginação.

    Essas etapas poderão ser executadas várias vezes se o tamanho da alocação for maior que o tamanho do espaço de VA da GPU do processo de paginação.

    Dxgkrnl envia a notificação para o driver somente quando uma alocação é removida de um segmento de abertura ou do segmento de memória do sistema implícito.

  • NotifyIoMmuUnmap

    O KMD define o sinalizador NotifyIoMmuUnmap em sua função DxgkDdiCreateAllocation . Este indicador indica que o Dxgkrnl deve emitir uma operação de DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap antes de desmapear a alocação da IOMMU. O driver tem a possibilidade de limpar caches internos. O driver deve garantir que o VA de GPU alocado não seja acessado após o retorno da operação de paginação.

    Quando o sinalizador é especificado e a alocação está prestes a ser desmapeada da IOMMU durante um despejo:

    • Dxgkrnl chama DxgkDdiBuildPagingBuffer com a operação DXGK_OPERATION_NOTIFY_ALLOC e o sinalizador NotifyIoMmuUnmap.
    • O driver cria comandos no buffer de DMA de paginação.
    • O buffer de DMA de paginação é enviado para execução no contexto do sistema.
    • Dxgkrnl aguarda a conclusão de todas as operações de paginação.
    • A alocação não é mapeada da IOMMU.

    A notificação é enviada somente quando o dispositivo dá suporte a modelos de endereçamento virtual GpuVaIoMmu ou GpuVaIoMmuGlobal.

Tamanho do espaço VA da GPU do processo de paginação

Para obter o tamanho do espaço de VA da GPU do processo de paginação, DXGKQAITYPE_PAGINGPROCESSGPUVASIZE é adicionado à enumeração DXGK_QUERYADAPTERINFOTYPE.

A operação NotifyEviction DXGK_OPERATION_NOTIFY_ALLOC requer que a alocação correspondente seja mapeada para o espaço de VA da GPU do processo de paginação. O Dxgkrnl aloca o espaço de VA da GPU para o processo de paginação (sistema) somente quando há um segmento de memória local ou quando o agendamento de hardware está habilitado. O tamanho do espaço de VA da GPU é um quarto do maior segmento de memória local ou do tamanho dos buffers de log de agendamento de hardware, o que for maior. O tamanho de VA da GPU resultante pode ser insuficiente para mapear uma alocação completa. Nesse caso, o driver precisa especificar o tamanho do espaço de endereço virtual (VA) da GPU para o processo de paginação.

Dxgkrnl chama DxgkDdiQueryAdapterInfo com uma estrutura DXGKARG_QUERYADAPTERINFO da seguinte maneira para obter o tamanho do espaço de VA de GPU do processo de paginação:

  • O tipo é definido DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
  • pInputData aponta para um valor UINT que especifica o índice do adaptador físico em uma configuração de LDA. Dxgkrnl define-o como zero para configurações não LDA.
  • InputDataDataSize é sizeof(UINT).
  • pOutputData aponta para um valor UINT no qual o driver retorna o tamanho, em megabytes, do espaço de VA da GPU utilizado pelo processo de paginação.
  • OutputDataSize é sizeof(UINT).

Se o driver falhar na chamada ou retornar um valor de pOutputData igual a zero, o sistema operacional determinará o tamanho do endereço virtual (VA) da GPU para o processo de paginação.

Se um adaptador tiver um segmento de memória local grande, o driver deverá retornar zero para permitir que o sistema operacional escolha o tamanho do espaço de VA da GPU do processo de paginação. Quanto maior o espaço de VA, mais memória é necessária para paginar tabelas de página de GPU do processo. As tabelas de página são sempre permanentemente residentes, portanto, o driver não deve especificar um tamanho desnecessariamente grande para o espaço de endereço virtual (VA).

As operações de paginação (preenchimento, transferência, alocação de notificação) são feitas em partes quando um tamanho de alocação excede o tamanho do espaço de VA da GPU do processo de paginação.