割り当て通知
重要
一部の情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
ページングの削除または昇格操作を実行しようとしている割り当てに対して、特定の操作を実行する必要がある場合があります。 たとえば、割り当てはデバイス アクセスの下にあるときに圧縮される場合があります。 その割り当てが削除されるとき (つまり、デバイス アクセスの下になくなった場合)、カーネルモード ドライバー (KMD) は実際の削除の前に最初にそれを展開する必要があります。 DXGK_OPERATION_NOTIFY_ALLOC ページング操作はこの目的のために設計されています。 この操作は、Windows 11 バージョン 24H2 (WDDM 3.2) 以降で使用できます。
割り当て通知を要求する方法
システムが DxgkDdiCreateAllocation を呼び出して割り当てを作成すると、KMD はフラグを DXGK_ALLOCATIONINFOFLAGS2 で設定して、DXGK_OPERATION_NOTIFY_ALLOC ページング操作を実行するように Dxgkrnl に指示できます。 現在の通知フラグは次のとおりです。
- NotifyEviction
- NotifyIoMmuUnmap
DDI の変更内容
DXGK_OPERATION_NOTIFY_ALLOC ページング操作が追加された
DXGK_OPERATION_NOTIFY_ALLOC ページング操作が DXGK_BUILDPAGINGBUFFER_OPERATION に追加されます。
DXGK_BUILDPAGINGBUFFER_NOTIFYALLOC 構造体が、DXGK_OPERATION_NOTIFY_ALLOC 操作で使用するために追加されます。
DXGK_ALLOCATIONINFOFLAGS2 に追加されたフラグ
次のフラグが DXGK_ALLOCATIONINFOFLAGS2 に追加されます。
NotifyEviction
KMD は DxgkDdiCreateAllocation 実装で NotifyEviction フラグを設定します。 このフラグは、割り当てを削除する前に、Dxgkrnl が DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 操作をドライバーに発行する必要があることを示します。
フラグが指定され、割り当てが削除されようとしている場合:
- Dxgkrnl は、割り当てをページング プロセスの GPU 仮想アドレス (VA) スペースにマップします。
- Dxgkrnl は DXGK_OPERATION_NOTIFY_ALLOC 操作と NotifyEviction フラグを使用して DxgkDdiBuildPagingBuffer を呼び出します。
- ドライバーは、ページング DMA バッファーにコマンドをビルドします。
- ページング DMA バッファーは、システム コンテキストで実行するために送信されます。
- Dxgkrnl は、ページング プロセス GPU VA スペースからの割り当てをマップ解除します。
割り当てサイズがページング プロセス GPU VA スペースのサイズより大きい場合は、これらの手順を複数回実行できます。
Dxgkrnl は、割り当てがアパーチャ セグメントまたは暗黙的なシステム メモリ セグメントから削除された場合にのみ、ドライバーに通知を送信します。
NotifyIoMmuUnmap
KMD は、DxgkDdiCreateAllocation 関数に NotifyIoMmuUnmap フラグを設定します。 このフラグは、IOMMU から割り当てをマップ解除する前に、Dxgkrnl が DXGK_OPERATION_NOTIFY_ALLOC NotifyIoMmuUnmap 操作を発行する必要があることを示します。 ドライバーには内部キャッシュをクリアする機会があります。 ドライバーは、ページング操作から戻った後に割り当て GPU VA にアクセスしないようにする必要があります。
フラグが指定されており、強制削除中に割り当てが IOMMU からマップ解除されようとしている場合:
- Dxgkrnl は DXGK_OPERATION_NOTIFY_ALLOC 操作と NotifyIoMmuUnmap フラグを使用して DxgkDdiBuildPagingBuffer を呼び出します。
- ドライバーは、ページング DMA バッファーにコマンドをビルドします。
- ページング DMA バッファーは、システム コンテキストで実行するために送信されます。
- Dxgkrnl はすべてのページング操作が完了するまで待機します。
- 割り当ては IOMMU からマップ解除されます。
デバイスが GpuVaIoMmu または GpuVaIoMmuGlobal 仮想アドレス指定モデルをサポートしている場合にのみ通知が送信されます。
ページング プロセス GPU VA スペースのサイズ
ページング プロセス GPU VA スペースのサイズを取得するために、DXGKQAITYPE_PAGINGPROCESSGPUVASIZE が DXGK_QUERYADAPTERINFOTYPE リストに追加されます。
DXGK_OPERATION_NOTIFY_ALLOC NotifyEviction 操作では、対応する割り当てをページング プロセス GPU VA スぺースにマップする必要があります。 Dxgkrnl は、ローカル メモリ セグメントがある場合、またはハードウェア スケジューリングが有効になっている場合にのみ、ページング (システム) プロセスに GPU VA スぺースを割り当てます。 GPU VA スぺースのサイズは、最大のローカル メモリ セグメントの 4 分の 1、またはハードウェア スケジューリング ログ バッファーのサイズのいずれか大きい方です。 最終的な GPU VA サイズは、完全な割り当てをマップするには小さくなる場合があります。 この場合、ドライバーはページング プロセス GPU VA スぺースのサイズを指定する必要があります。
Dxgkrnl は、次のように DXGKARG_QUERYADAPTERINFO 構造体がある DxgkDdiQueryAdapterInfo を呼び出して、ページング プロセス GPU VA スぺースのサイズを取得します。
- 型 は DXGKQAITYPE_PAGINGPROCESSGPUVASIZE に設定されます。
- pInputData は、LDA 構成の物理アダプター インデックスを指定する UINT 値を指します。 Dxgkrnl は、LDA 以外の構成の場合は 0 に設定します。
- InputDataDataSize は
sizeof(UINT)
です。 - pOutputData は、ドライバーがページング プロセス GPU VA スぺースのサイズをメガバイト単位で返す UINT 値を指します。
- OutputDataSize は
sizeof(UINT)
です。
ドライバーが呼び出しに失敗した場合、または 0 の pOutputData 値を返す場合、OS がページング プロセスの GPU VA サイズを決定します。
アダプターに大きなローカル メモリ セグメントがある場合、ドライバーは 0 を返して、OS がページング プロセス GPU VA スぺースのサイズを選択できるようにする必要があります。 VA スぺースが大きいほど、プロセス GPU ページ テーブルのページングに必要なメモリが増えます。 ページ テーブルは常駐しているため、ドライバーでは VA スぺースに不必要に大きなサイズを指定しないでください。
ページング操作 (フィル、転送、通知の割り当て) は、割り当てサイズがページング プロセス GPU VA スぺース サイズを超えるとチャンク単位で実行されます。