Commit db004912 authored by Hawking Zhang's avatar Hawking Zhang Committed by Alex Deucher

drm/amdgpu: fix frame size of amdgpu_xgmi_add_devices excceed 1024 bytes

Instead of stack-allocated psp_xgmi_topology_info in function
amdgpu_xgmi_add_device, dynamically allocated this structure to
avoid the frame size of this function excceed 1024 bytes
Signed-off-by: default avatarHawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: default avatarXiaojie Yuan <xiaojie.yuan@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent bb8310cc
...@@ -63,7 +63,7 @@ static struct amdgpu_hive_info *amdgpu_get_xgmi_hive(struct amdgpu_device *adev) ...@@ -63,7 +63,7 @@ static struct amdgpu_hive_info *amdgpu_get_xgmi_hive(struct amdgpu_device *adev)
int amdgpu_xgmi_add_device(struct amdgpu_device *adev) int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
{ {
struct psp_xgmi_topology_info tmp_topology; struct psp_xgmi_topology_info *tmp_topology;
struct amdgpu_hive_info *hive; struct amdgpu_hive_info *hive;
struct amdgpu_xgmi *entry; struct amdgpu_xgmi *entry;
struct amdgpu_device *tmp_adev; struct amdgpu_device *tmp_adev;
...@@ -76,7 +76,9 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev) ...@@ -76,7 +76,9 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
adev->gmc.xgmi.node_id = psp_xgmi_get_node_id(&adev->psp); adev->gmc.xgmi.node_id = psp_xgmi_get_node_id(&adev->psp);
adev->gmc.xgmi.hive_id = psp_xgmi_get_hive_id(&adev->psp); adev->gmc.xgmi.hive_id = psp_xgmi_get_hive_id(&adev->psp);
memset(&tmp_topology, 0, sizeof(tmp_topology)); tmp_topology = kzalloc(sizeof(struct psp_xgmi_topology_info), GFP_KERNEL);
if (!tmp_topology)
return -ENOMEM;
mutex_lock(&xgmi_mutex); mutex_lock(&xgmi_mutex);
hive = amdgpu_get_xgmi_hive(adev); hive = amdgpu_get_xgmi_hive(adev);
if (!hive) if (!hive)
...@@ -84,9 +86,9 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev) ...@@ -84,9 +86,9 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
list_add_tail(&adev->gmc.xgmi.head, &hive->device_list); list_add_tail(&adev->gmc.xgmi.head, &hive->device_list);
list_for_each_entry(entry, &hive->device_list, head) list_for_each_entry(entry, &hive->device_list, head)
tmp_topology.nodes[count++].node_id = entry->node_id; tmp_topology->nodes[count++].node_id = entry->node_id;
ret = psp_xgmi_get_topology_info(&adev->psp, count, &tmp_topology); ret = psp_xgmi_get_topology_info(&adev->psp, count, tmp_topology);
if (ret) { if (ret) {
dev_err(adev->dev, dev_err(adev->dev,
"XGMI: Get topology failure on device %llx, hive %llx, ret %d", "XGMI: Get topology failure on device %llx, hive %llx, ret %d",
...@@ -96,7 +98,7 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev) ...@@ -96,7 +98,7 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
} }
/* Each psp need to set the latest topology */ /* Each psp need to set the latest topology */
list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) { list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) {
ret = psp_xgmi_set_topology_info(&tmp_adev->psp, count, &tmp_topology); ret = psp_xgmi_set_topology_info(&tmp_adev->psp, count, tmp_topology);
if (ret) { if (ret) {
dev_err(tmp_adev->dev, dev_err(tmp_adev->dev,
"XGMI: Set topology failure on device %llx, hive %llx, ret %d", "XGMI: Set topology failure on device %llx, hive %llx, ret %d",
...@@ -113,5 +115,6 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev) ...@@ -113,5 +115,6 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
exit: exit:
mutex_unlock(&xgmi_mutex); mutex_unlock(&xgmi_mutex);
kfree(tmp_topology);
return ret; return ret;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment