Re: [PATCH 0/7] drm/amdgpu: Fix topology device creation and proximity domain mappings for sparse and CPU-less NUMA systems

"Kuehling, Felix" <[email protected]> Wed, 5 Aug 2026 12:16:11 -0400
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <[email protected]>
On 2026-08-05 03:09, Donet Tom wrote:
>
> On 8/5/26 3:57 AM, Felix Kuehling wrote:
>>
>> On 2026-08-04 05:52, Donet Tom wrote:
>>> This series fixes topology device creation and proximity domain 
>>> mappings in
>>> AMDKFD when a system does not provide a CRAT table and the driver 
>>> generates a
>>> Virtual CRAT (VCRAT).
>>>
>>> The current implementation assumes that CPU NUMA node IDs are 
>>> contiguous and
>>> that every NUMA node contains CPUs. During VCRAT generation, CPU 
>>> topology
>>> entries and proximity domains are created only for NUMA nodes that 
>>> have CPUs.
>>> GPU proximity domains are then allocated immediately after the CPU 
>>> proximity
>>> domains, and the GPU I/O link (proximity_domain_to) is initialized 
>>> using the
>>> NUMA node ID to which the GPU is attached, implicitly assuming that 
>>> NUMA node
>>> IDs and proximity domains have a one-to-one mapping.
>>>
>>> These assumptions break on systems with:
>>>
>>> Sparse (non-contiguous) NUMA node IDs
>>> CPU-less NUMA nodes
>>> CPU-less and memory-less NUMA nodes
>>>
>>> For example:
>>>
>>> available: 3 nodes (0,2-3)
>>>
>>> node 0: CPUs present
>>> node 2: CPU-less
>>> node 3: CPU-less
>>>
>>> In this case, the driver creates a CPU topology device only for node 
>>> 0 and
>>> assigns a single CPU proximity domain (0). However, the GPU VCRAT still
>>> references the NUMA node ID to which the GPU is attached (for 
>>> example, node 3)
>>> in the proximity_domain_to field. Since no corresponding CPU 
>>> proximity domain
>>> exists for node 3, the parser cannot find a matching proximity 
>>> domain during
>>> VCRAT parsing, causing topology initialization to fail.
>>
>> Hi Tom, 
>
>
> Hi Felix,
>
>
>>
>> Thank you for the explanation and the patch series. I may have some 
>> gaps in my understanding that I would like to clarify. In my mind, I 
>> was using "proximity domain" and "NUMA node" interchangeably. You're 
>> demonstrating that they are not the same thing. Is that just a 
>> different way of labeling the same thing, or are NUMA nodes and 
>> proximity domains fundamentally different concepts.
>>
>> Your code in patch 5 (kfd_proximity_domain_to_numa_node and 
>> kfd_numa_node_to_proximity_domain) seems to imply that there is, in 
>> fact, a 1:1 mapping, as it assumes that there is a unique translation 
>> in both directions. Am I missing something?
>
>
>
> Thanks for the comment.
>
> IIUC, NUMA node IDs and proximity domains are different numbering 
> schemes. We have proximity domains for both CPU and GPU devices. CPU 
> proximity domains start from 0, and GPU proximity domains start after 
> the last CPU proximity domain.
>
> If the NUMA node IDs are contiguous, the CPU proximity domains happen 
> to match the NUMA node IDs. However, if the NUMA node IDs are 
> discontiguous, the CPU proximity domains and NUMA node IDs no longer 
> have a one-to-one mapping.
>
>>
>> If they are just different numbering systems, do we really need to 
>> keep track of both proximity domains and NUMA nodes in the KFD 
>> topology? Or would it be sufficient to only track NUMA nodes, if 
>> that's what we really care about in the uAPI (KFD sysfs)?
>
>
>
> Thanks for the suggestion. I also think we don't need to keep track of 
> both the proximity domains and the NUMA node IDs in KFD. Do you think 
> the approach below would be reasonable?
>
> Just to make sure I understand correctly, for CPU devices the 
> proximity domain will be the same as the NUMA node ID, and the GPU 
> proximity domains will start after the last CPU proximity domain.
>
> In that case, the CPU proximity domains and NUMA node IDs will always 
> have a one-to-one mapping, and the GPU proximity domains will follow 
> after them.
>
> For example, if a system has three NUMA nodes and two GPUs:
>
> NUMA node IDs:            0   2   3
> CPU proximity domains:    0   2   3
> GPU proximity domains:    4   5
>
> Would it be okay to proceed with this approach?

Yes, this looks good to me.

Regards,
   Felix


>
> I think this approach should also resolve the driver loading issue.
>
>
> Thanks
> Donet Tom
>
>
>>
>> Thanks,
>>   Felix
>>
>>
>>>
>>> The failure is observed as:
>>>
>>> amdgpu: Virtual CRAT table created for GPU
>>> amdgpu: Error parsing VCRAT
>>> kfd: amdgpu: Error adding device to topology
>>> kfd: amdgpu: Error initializing KFD node
>>>
>>>
>>> Since every online NUMA node is a valid topology object and can contain
>>> CPUs, memory, I/O links, or any combination of these, topology devices
>>> and proximity domains should be created for every online NUMA node
>>> rather than only for NUMA nodes that contain CPUs.
>>>
>>> To address this, this series introduces a new VCRAT subtype that
>>> records the mapping between the NUMA node ID and the generated VCRAT
>>> proximity domain. When topology devices are created, this information
>>> is stored in the corresponding topology device, allowing the driver to
>>> translate a NUMA node ID into its associated proximity domain whenever
>>> required.
>>>
>>> Returning to the previous example, the system contains three online
>>> NUMA nodes, so three CPU topology devices and three proximity domains
>>> are created, even though only one NUMA node contains CPUs. The NUMA
>>> node ID is stored in each topology device together with its generated
>>> proximity domain.
>>>
>>> Later, when the GPU VCRAT is generated, the driver only knows the NUMA
>>> node ID to which the GPU is attached (for example, node 3). Instead of
>>> assuming that the NUMA node ID is equal to the proximity domain, the
>>> driver walks the existing topology devices to locate the corresponding
>>> NUMA node and retrieves its generated proximity domain. In this
>>> example, NUMA node 3 maps to proximity domain 2, so
>>> proximity_domain_to is populated with the correct value.
>>>
>>> Since the GPU I/O link now references a valid proximity domain, VCRAT
>>> parsing completes successfully and topology initialization proceeds
>>> without errors on systems with sparse NUMA node IDs, CPU-less NUMA
>>> nodes, and CPU-less/memory-less NUMA nodes.
>>>
>>> This series consists of the following patches:
>>>
>>> Patch 1 removes an unused argument from
>>> kfd_create_crat_image_virtual() as a preparatory cleanup.
>>>
>>> Patch 2 introduces a new VCRAT NUMA affinity subtype that stores the
>>> NUMA node ID and its corresponding proximity domain.
>>>
>>> Patch 3 populates the NUMA affinity entries during VCRAT generation
>>> for every online NUMA node.
>>>
>>> Patch 4 parses the NUMA affinity entries from the VCRAT and stores the
>>> NUMA node ID and proximity domain in the corresponding topology
>>> device.
>>>
>>> Patch 5 fixes GPU VCRAT proximity domain mappings by translating the
>>> GPU's NUMA node ID to the corresponding CPU proximity domain before
>>> programming proximity_domain_to.
>>>
>>> Patch 6 creates proximity domains and VCRAT entries for all online
>>> NUMA nodes, including CPU-less and memory-less nodes.
>>>
>>> Patch 7 adds a numa_node sysfs attribute for CPU and GPU topology
>>> devices, exposing the associated NUMA node through the topology sysfs
>>> interface.
>>>
>>> Please note that the changes in this series are on a best effort 
>>> basis from our
>>> end. Therefore, requesting the amd-gfx community (who have deeper 
>>> knowledge of the
>>> HW & SW stack) to kindly help with the review and provide feedback / 
>>> comments on
>>> these patches
>>>
>>> Donet Tom (7):
>>>    drm/amdgpu: Remove unused argument from 
>>> kfd_create_crat_image_virtual
>>>    drm/amdgpu: Add VCRAT NUMA affinity entry
>>>    drm/amdgpu: Populate NUMA affinity entries in VCRAT
>>>    drm/amdgpu: Parse NUMA affinity entries from VCRAT
>>>    drm/amdgpu: Fix VCRAT proximity domain mappings for GPU nodes
>>>    drm/amdgpu: Create proximity domains and VCRAT entries for CPU-less
>>>      and memory-less NUMA nodes
>>>    drm/amdgpu: Add numa_node in cpu/gpu topology device sysfs entry
>>>
>>>   drivers/gpu/drm/amd/amdkfd/kfd_crat.c     | 152 
>>> +++++++++++++++-------
>>>   drivers/gpu/drm/amd/amdkfd/kfd_crat.h     |  19 ++-
>>>   drivers/gpu/drm/amd/amdkfd/kfd_topology.c |  49 +++++--
>>>   drivers/gpu/drm/amd/amdkfd/kfd_topology.h |   4 +
>>>   4 files changed, 168 insertions(+), 56 deletions(-)
>>>