]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/amdgpu: fix frame size of amdgpu_xgmi_add_devices excceed 1024 bytes
authorHawking Zhang <Hawking.Zhang@amd.com>
Wed, 7 Nov 2018 04:00:50 +0000 (12:00 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 7 Nov 2018 22:05:54 +0000 (17:05 -0500)
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: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Xiaojie Yuan <xiaojie.yuan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c

index e92b4548db49b60e2fe981d3eebc9cb803354bb1..56acdeab38125965b5daf1489608bf36d4fa5ce9 100644 (file)
@@ -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)
 {
-       struct psp_xgmi_topology_info tmp_topology;
+       struct psp_xgmi_topology_info *tmp_topology;
        struct amdgpu_hive_info *hive;
        struct amdgpu_xgmi      *entry;
        struct amdgpu_device    *tmp_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.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);
        hive = amdgpu_get_xgmi_hive(adev);
        if (!hive)
@@ -84,9 +86,9 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
 
        list_add_tail(&adev->gmc.xgmi.head, &hive->device_list);
        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) {
                dev_err(adev->dev,
                        "XGMI: Get topology failure on device %llx, hive %llx, ret %d",
@@ -96,7 +98,7 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
        }
        /* Each psp need to set the latest topology */
        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) {
                        dev_err(tmp_adev->dev,
                                "XGMI: Set topology failure on device %llx, hive %llx, ret %d",
@@ -113,5 +115,6 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)
 
 exit:
        mutex_unlock(&xgmi_mutex);
+       kfree(tmp_topology);
        return ret;
 }