]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Disallow partition query during reset
authorLijo Lazar <lijo.lazar@amd.com>
Wed, 16 Apr 2025 06:53:44 +0000 (12:23 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 30 Apr 2025 22:03:02 +0000 (18:03 -0400)
Reject queries to get current partition modes during reset. Also, don't
accept sysfs interface requests to switch compute partition mode while
in reset.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Asad Kamal <asad.kamal@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c

index e1dca45a152b6ba075ad08f8e35d894fe4f1cc6d..cb9ffb17ab98ff99f02a499a798b2f11f9fc3e50 100644 (file)
@@ -1353,6 +1353,10 @@ static ssize_t amdgpu_gfx_get_current_compute_partition(struct device *dev,
        struct amdgpu_device *adev = drm_to_adev(ddev);
        int mode;
 
+       /* Only minimal precaution taken to reject requests while in reset.*/
+       if (amdgpu_in_reset(adev))
+               return -EPERM;
+
        mode = amdgpu_xcp_query_partition_mode(adev->xcp_mgr,
                                               AMDGPU_XCP_FL_NONE);
 
@@ -1396,8 +1400,14 @@ static ssize_t amdgpu_gfx_set_compute_partition(struct device *dev,
                return -EINVAL;
        }
 
+       /* Don't allow a switch while under reset */
+       if (!down_read_trylock(&adev->reset_domain->sem))
+               return -EPERM;
+
        ret = amdgpu_xcp_switch_partition_mode(adev->xcp_mgr, mode);
 
+       up_read(&adev->reset_domain->sem);
+
        if (ret)
                return ret;
 
index ecb74ccf1d9081eb2b7840ff647c72b1c2bc03a2..6b0fbbb91e5795db95b3c7dcbbb22db8a8b89e13 100644 (file)
@@ -1230,6 +1230,10 @@ static ssize_t current_memory_partition_show(
        struct amdgpu_device *adev = drm_to_adev(ddev);
        enum amdgpu_memory_partition mode;
 
+       /* Only minimal precaution taken to reject requests while in reset */
+       if (amdgpu_in_reset(adev))
+               return -EPERM;
+
        mode = adev->gmc.gmc_funcs->query_mem_partition_mode(adev);
        if ((mode >= ARRAY_SIZE(nps_desc)) ||
            (BIT(mode) & AMDGPU_ALL_NPS_MASK) != BIT(mode))