Fungsi KeQueryNodeActiveAffinity2 (wdm.h)
Rutinitas ini mengembalikan afinitas prosesor multi-grup saat ini dari simpul NUMA yang diberikan.
NTSTATUS KeQueryNodeActiveAffinity2(
[in] USHORT NodeNumber,
[out] PGROUP_AFFINITY GroupAffinities,
[in] USHORT GroupAffinitiesCount,
[out] PUSHORT GroupAffinitiesRequired
);
[in] NodeNumber
Menyediakan nomor simpul dari simpul yang akan dikueri.
[out] GroupAffinities
Memasok pointer ke array struktur GROUP_AFFINITY yang setelah berhasil menerima nomor grup dan masker afinitas dari grup yang diidentifikasi.
[in] GroupAffinitiesCount
Nilai jenis USHORT yang menentukan jumlah elemen dalam array afinitas grup. Jika array terlalu kecil untuk menahan afinitas simpul, maka STATUS_BUFFER_TOO_SMALL dikembalikan dan jumlah elemen yang diperlukan dikembalikan dalam GroupAffinitiesRequired.
[out] GroupAffinitiesRequired
Pointer ke nilai jenis USHORT yang menerima jumlah afinitas grup yang diperlukan untuk mewakili afinitas simpul. Dalam kasus simpul NUMA khusus memori, nol dikembalikan.
STATUS_SUCCESS jika afinitas simpul berhasil dikueri.
STATUS_INVALID_PARAMETER jika nomor simpul yang tidak valid ditentukan.
STATUS_BUFFER_TOO_SMALL jika array yang disediakan terlalu kecil.
Mulai Windows Server 2022, sistem operasi tidak lagi membagi simpul NUMA besar; sebagai gantinya, Windows melaporkan topologi NUMA yang sebenarnya dari sistem. Ketika node berisi lebih dari 64 prosesor, simpul NUMA mencakup lebih dari satu grup. Dalam hal ini, sistem menetapkan grup utama untuk setiap simpul NUMA. Grup utama selalu yang berisi prosesor terbanyak. Untuk menentukan jumlah prosesor aktif dalam simpul NUMA tertentu (di semua grup), panggil KeQueryNodeActiveProcessorCount. Untuk informasi selengkapnya tentang perubahan perilaku ini, lihat Dukungan NUMA .
Untuk mengaktifkan kembali perilaku pemisahan simpul warisan, lakukan perubahan berikut pada registri dan boot ulang sistem:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NUMA" /v SplitLargeNodes /t REG_DWORD /d 1
Jika driver Anda memetakan prosesor ke simpul NUMA dengan memanggil KeQueryNodeActiveAffinity, dan kode Anda berjalan pada sistem dengan lebih dari 64 prosesor per simpul NUMA, gunakan salah satu solusi berikut:
Migrasikan ke API afinitas simpul multi-grup (mode pengguna dan mode kernel), seperti KeQueryNodeActiveAffinity2.
Panggil KeQueryLogicalProcessorRelationship dengan RelationNumaNode untuk langsung mengkueri simpul NUMA yang terkait dengan nomor prosesor tertentu.
Contoh berikut menunjukkan kode yang akan bermasalah pada Windows Server 2022 dan yang lebih baru, lalu memperlihatkan kedua solusi tersebut.
//
// Problematic implementation using KeQueryNodeActiveAffinity.
//
USHORT CurrentNode;
USHORT HighestNodeNumber;
GROUP_AFFINITY NodeAffinity;
ULONG ProcessorIndex;
PROCESSOR_NUMBER ProcessorNumber;
HighestNodeNumber = KeQueryHighestNodeNumber();
for (CurrentNode = 0; CurrentNode <= HighestNodeNumber; CurrentNode += 1) {
KeQueryNodeActiveAffinity(CurrentNode, &NodeAffinity, NULL);
while (NodeAffinity.Mask != 0) {
ProcessorNumber.Group = NodeAffinity.Group;
BitScanForward(&ProcessorNumber.Number, NodeAffinity.Mask);
ProcessorIndex = KeGetProcessorIndexFromNumber(&ProcessorNumber);
ProcessorNodeContexts[ProcessorIndex] = NodeContexts[CurrentNode;]
NodeAffinity.Mask &= ~((KAFFINITY)1 << ProcessorNumber.Number);
}
}
//
// Resolution using KeQueryNodeActiveAffinity2.
//
USHORT CurrentIndex;
USHORT CurrentNode;
USHORT CurrentNodeAffinityCount;
USHORT HighestNodeNumber;
ULONG MaximumGroupCount;
PGROUP_AFFINITY NodeAffinityMasks;
ULONG ProcessorIndex;
PROCESSOR_NUMBER ProcessorNumber;
NTSTATUS Status;
MaximumGroupCount = KeQueryMaximumGroupCount();
NodeAffinityMasks = ExAllocatePool2(POOL_FLAG_PAGED,
sizeof(GROUP_AFFINITY) * MaximumGroupCount,
'tseT');
if (NodeAffinityMasks == NULL) {
return STATUS_NO_MEMORY;
}
HighestNodeNumber = KeQueryHighestNodeNumber();
for (CurrentNode = 0; CurrentNode <= HighestNodeNumber; CurrentNode += 1) {
Status = KeQueryNodeActiveAffinity2(CurrentNode,
NodeAffinityMasks,
MaximumGroupCount,
&CurrentNodeAffinityCount);
NT_ASSERT(NT_SUCCESS(Status));
for (CurrentIndex = 0; CurrentIndex < CurrentNodeAffinityCount; CurrentIndex += 1) {
CurrentAffinity = &NodeAffinityMasks[CurrentIndex];
while (CurrentAffinity->Mask != 0) {
ProcessorNumber.Group = CurrentAffinity.Group;
BitScanForward(&ProcessorNumber.Number, CurrentAffinity->Mask);
ProcessorIndex = KeGetProcessorIndexFromNumber(&ProcessorNumber);
ProcessorNodeContexts[ProcessorIndex] = NodeContexts[CurrentNode];
CurrentAffinity->Mask &= ~((KAFFINITY)1 << ProcessorNumber.Number);
}
}
}
//
// Resolution using KeQueryLogicalProcessorRelationship.
//
ULONG ProcessorCount;
ULONG ProcessorIndex;
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX ProcessorInformation;
ULONG ProcessorInformationSize;
PROCESSOR_NUMBER ProcessorNumber;
NTSTATUS Status;
ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
for (ProcessorIndex = 0; ProcessorIndex < ProcessorCount; ProcessorIndex += 1) {
Status = KeGetProcessorNumberFromIndex(ProcessorIndex, &ProcessorNumber);
NT_ASSERT(NT_SUCCESS(Status));
ProcessorInformationSize = sizeof(ProcessorInformation);
Status = KeQueryLogicalProcessorRelationship(&ProcessorNumber,
RelationNumaNode,
&ProcessorInformation,
&ProcessorInformationSize);
NT_ASSERT(NT_SUCCESS(Status));
NodeNumber = ProcessorInformation.NumaNode.NodeNumber;
ProcessorNodeContexts[ProcessorIndex] = NodeContexts[NodeNumber];
}
Syarat | Nilai |
---|---|
server minimum yang didukung | Windows Server 2022 |
Header | wdm.h |
IRQL | Tingkat apa pun |