The UQ_FW_AREAS query computes the copy_to_user() result into ret and
then returns 0 anyway, so userspace never learns that the metadata was
not written. With an invalid return pointer all three IP types (GFX,
COMPUTE, DMA) report success on Navi31.

Return the copy_to_user() result like the other INFO queries do.

Fixes: 44b69cf1d35c ("drm/amdgpu: Update AMDGPU_INFO_UQ_FW_AREAS query for 
compute")
Signed-off-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 1589b6a6575f..b98091f31dda 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -1430,25 +1430,22 @@ int amdgpu_info_ioctl(struct drm_device *dev, void 
*data, struct drm_file *filp)
                        if (ret)
                                return ret;
 
-                       ret = copy_to_user(out, &meta_info,
-                                               min((size_t)size, 
sizeof(meta_info))) ? -EFAULT : 0;
-                       return 0;
+                       return copy_to_user(out, &meta_info,
+                                           min((size_t)size, 
sizeof(meta_info))) ? -EFAULT : 0;
                case AMDGPU_HW_IP_COMPUTE:
                        ret = amdgpu_userq_metadata_info_compute(adev, info, 
&meta_info.compute);
                        if (ret)
                                return ret;
 
-                       ret = copy_to_user(out, &meta_info,
-                                               min((size_t)size, 
sizeof(meta_info))) ? -EFAULT : 0;
-                       return 0;
+                       return copy_to_user(out, &meta_info,
+                                           min((size_t)size, 
sizeof(meta_info))) ? -EFAULT : 0;
                case AMDGPU_HW_IP_DMA:
                        ret = amdgpu_userq_metadata_info_sdma(adev, info, 
&meta_info.sdma);
                        if (ret)
                                return ret;
 
-                       ret = copy_to_user(out, &meta_info,
-                                               min((size_t)size, 
sizeof(meta_info))) ? -EFAULT : 0;
-                       return 0;
+                       return copy_to_user(out, &meta_info,
+                                           min((size_t)size, 
sizeof(meta_info))) ? -EFAULT : 0;
                default:
                        return -EINVAL;
                }
-- 
2.50.1

Reply via email to