Partager via


Notification d’allocation

Important

Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.

Il peut arriver que certaines opérations doivent être effectuées sur une allocation qui est sur le point de subir une opération d’éviction ou de promotion de pagination. Par exemple, une allocation peut être compressée lorsqu’elle est accessible par l'appareil. Lorsque cette allocation est en cours d'éviction (c'est-à-dire qu'elle n'est plus accessible par l'appareil), le pilote doit d’abord la décompresser avant de procéder à la véritable éviction. L’opération de pagination DXGK_OPERATION_NOTIFY_ALLOC est conçue à cet effet. Cette opération est disponible à partir de Windows 11, version 24H2 (WDDM 3.2).

Procédure de demande de notifications d’allocation

Lorsque le système appelle DxgkDdiCreateAllocation pour créer une allocation, le pilote en mode noyau (KMD) peut définir des indicateurs dansDXGK_ALLOCATIONINFOFLAGS2 pour indiquer à Dxgkrnl d’effectuer l’opération de pagination DXGK_OPERATION_NOTIFY_ALLOC. Les indicateurs de notification actuels sont les suivants :

  • NotifyEviction
  • NotifyIoMmuUnmap

Modifications de l’DDI

Opération de pagination DXGK_OPERATION_NOTIFY_ALLOC ajoutée

Indicateurs ajoutés à DXGK_ALLOCATIONINFOFLAGS2

Les indicateurs suivants sont ajoutés à DXGK_ALLOCATIONINFOFLAGS2.

  • NotifyEviction

    Le pilote définit l’indicateur NotifyEviction dans son implémentation DxgkDdiCreateAllocation. Cet indicateur indique que Dxgkrnl doit effectuer une opération DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction au niveau du pilote avant de procéder à l'éviction d'une allocation.

    Lorsque l’indicateur est spécifié et que l'éviction de l’allocation est sur le point d’avoir lieu :

    • Dxgkrnl mappe l’allocation à l’espace d’adressage virtuel (VA) GPU du processus de pagination.
    • Dxgkrnl appelle DxgkDdiBuildPagingBuffer avec l’opération DXGK_OPERATION_NOTIFY_ALLOC et l’indicateur NotifyEviction.
    • Le pilote génère des commandes dans le tampon DMA de pagination.
    • Le tampon DMA de pagination est soumis pour exécution dans le contexte du système.
    • Dxgkrnl démappe l’allocation de l’espace d’adressage virtuel (VA) GPU du processus de pagination.

    Ces étapes peuvent être exécutées plusieurs fois si la taille d’allocation est supérieure à la taille de l’espace d’adressage virtuel (VA) GPU du processus de pagination.

    Dxgkrnl envoie la notification au pilote uniquement lorsqu’une allocation est supprimée d’un segment d’ouverture ou du segment de mémoire système implicite.

  • NotifyIoMmuUnmap

    Le pilote définit l’indicateur NotifyIoMmuUnmap dans sa fonction DxgkDdiCreateAllocation. Cet indicateur indique que Dxgkrnl doit effectuer une opérationDXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap avant de démapper l’allocation de l'IOMMU. Le pilote a la possibilité de vider les caches internes. Le pilote doit s’assurer que l’allocation d’adressage virtuel (VA) GPU n’est pas accessible après le retour de l’opération de pagination.

    Lorsque l’indicateur est spécifié et que l'éviction de l’allocation est sur le point d’avoir lieu :

    • Dxgkrnl mappe l’allocation à l’espace d’adressage virtuel (VA) GPU du processus de pagination.
    • Dxgkrnl appelle DxgkDdiBuildPagingBuffer avec l’opération DXGK_OPERATION_NOTIFY_ALLOC et l’indicateur NotifyIoMmuUnmap.
    • Le pilote génère des commandes dans le tampon DMA de pagination.
    • Le tampon DMA de pagination est soumis pour exécution dans le contexte du système.
    • Dxgkrnl démappe l’allocation de l’espace d’adressage virtuel (VA) GPU du processus de pagination.

    Ces étapes peuvent être exécutées plusieurs fois si la taille d’allocation est supérieure à la taille de l’espace d’adressage virtuel (VA) GPU du processus de pagination.

    Dxgkrnl envoie la notification au pilote uniquement lorsqu’une allocation est supprimée d’un segment d’ouverture ou du segment de mémoire système implicite.

Taille de l’espace d’adressage virtuel (VA) GPU du processus de pagination

Pour obtenir la taille de l’espace d’adressage virtuel (VA) GPU du processus de pagination., DXGKQAITYPE_PAGINGPROCESSGPUVASIZE est ajouté à l’énumération DXGK_QUERYADAPTERINFOTYPE.

L’opération DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction nécessite que l’allocation correspondante soit mappée à l’espace d’adressage virtuel (VA) GPU du processus de pagination. Dxgkrnl alloue l’espace d’adressage virtuel (VA) GPU pour le processus de pagination (système) uniquement lorsqu’il existe un segment de mémoire locale ou lorsque la planification matérielle est activée. La taille de l’espace d’adressage virtuel (VA) GPU correspond à un quart du plus grand segment de mémoire locale ou à la taille des mémoires tampon de journalisation de la planification matérielle, selon la valeur la plus élevée. La taille de l’espace d’adressage virtuel (VA) GPU qui en résulte peut être insuffisante pour mapper une allocation complète. Dans ce cas, le pilote doit spécifier la taille de l’espace d’adressage virtuel (VA) GPU du processus de pagination.

Pour obtenir la taille de l’espace d’adressage virtuel (VA) GPU du processus de pagination, Dxgkrnl appelle DxgkDdiQueryAdapterInfo avec une structure DXGKARG_QUERYADAPTERINFO comme suit :

  • Type est défini sur DXGKQAITYPE_PAGINGPROCESSGPUVASIZE.
  • pInputData pointe vers une valeur UINT qui spécifie l’index d'une carte physique dans une configuration LDA. Dxgkrnl la définit sur zéro pour les configurations non LDA.
  • InputDataDataSize est sizeof(UINT).
  • pOutputData pointe vers une valeur UINT dans laquelle le pilote retourne la taille de l’espace d’adressage virtuel (VA) GPU du processus de pagination en mégaoctets.
  • OutputDataSize est sizeof(UINT).

Si l’appel effectué par le pilote échoue ou retourne une valeur pOutputData de zéro, le système d’exploitation détermine la taille d’espace d’adressage virtuel (VA) GPU du processus de pagination.

Si une carte dispose d'un grand segment de mémoire locale, le pilote doit retourner une valeur de zéro pour laisser le système d’exploitation choisir la taille de l’espace d’adressage virtuel (VA) GPU du processus de pagination. Plus l’espace d'adressage virtuel est élevé, plus il faut de mémoire pour les tables de pages GPU du processus de pagination. Les tables de pages sont toujours résidentes. Il est donc inutile pour le pilote de spécifier une grande taille pour l’espace d'adressage virtuel.

Les opérations de pagination (remplissage, transfert, allocation de notification) sont effectuées en morcelant une allocation par blocs lorsque sa taille dépasse celle de l’espace d’adressage virtuel (VA) GPU du processus de pagination.