[PATCH 2/2] drm/amdkfd: Improve chances of unique gpu_id

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



gpu_id needs to be unique for user space to identify GPUs via KFD
interface. Do a single pass search to detect collision. If
detected, increment gpu_id by one.

Probability of collisons are very rare. Hence, no more complexity is
added to ensure uniqueness.

Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@xxxxxxx>
---
 drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index b93913934b03..f2d1e82e7bed 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -1095,6 +1095,8 @@ static uint32_t kfd_generate_gpu_id(struct kfd_node *gpu)
 	uint32_t hashout;
 	uint32_t buf[8];
 	uint64_t local_mem_size;
+	struct kfd_topology_device *dev;
+	bool is_unique = true;
 	int i;
 
 	if (!gpu)
@@ -1115,7 +1117,13 @@ static uint32_t kfd_generate_gpu_id(struct kfd_node *gpu)
 	for (i = 0, hashout = 0; i < 8; i++)
 		hashout ^= hash_32(buf[i], KFD_GPU_ID_HASH_WIDTH);
 
-	return hashout;
+	down_read(&topology_lock);
+	list_for_each_entry(dev, &topology_device_list, list) {
+		if (dev->gpu && dev->gpu_id == hashout)
+			is_unique = false;
+	}
+	up_read(&topology_lock);
+	return is_unique ? hashout : ++hashout;
 }
 /* kfd_assign_gpu - Attach @gpu to the correct kfd topology device. If
  *		the GPU device is not already present in the topology device
@@ -1946,7 +1954,6 @@ int kfd_topology_add_device(struct kfd_node *gpu)
 	struct amdgpu_gfx_config *gfx_info = &gpu->adev->gfx.config;
 	struct amdgpu_cu_info *cu_info = &gpu->adev->gfx.cu_info;
 
-	gpu_id = kfd_generate_gpu_id(gpu);
 	if (gpu->xcp && !gpu->xcp->ddev) {
 		dev_warn(gpu->adev->dev,
 			 "Won't add GPU to topology since it has no drm node assigned.");
@@ -1969,6 +1976,7 @@ int kfd_topology_add_device(struct kfd_node *gpu)
 	if (res)
 		return res;
 
+	gpu_id = kfd_generate_gpu_id(gpu);
 	dev->gpu_id = gpu_id;
 	gpu->id = gpu_id;
 
-- 
2.34.1




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux