The GFX, compute and SDMA branches of AMDGPU_INFO_UQ_FW_AREAS work out
-EFAULT when the result can't be copied to userspace but return 0 all
the same, so the caller goes on with a buffer that was never written.

On navi31, querying any of the three into a read-only page returns 0,
while e.g. AMDGPU_INFO_DEV_INFO returns -EFAULT for the same page.

Return the result of the copy.

Fixes: 90c448fef312 ("drm/amdgpu: add new AMDGPU_INFO subquery for userq 
objects")
Fixes: 44b69cf1d35c ("drm/amdgpu: Update AMDGPU_INFO_UQ_FW_AREAS query for 
compute")
Fixes: 0030595c3e8b ("drm/amdgpu: Update AMDGPU_INFO_UQ_FW_AREAS query for 
sdma")
Signed-off-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

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

Reply via email to