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.
v2: return copy_to_user() ? -EFAULT : 0 directly (Christian)
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 | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 084d8517c194..54e3cd04e7ee 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -1431,24 +1431,24 @@ int amdgpu_info_ioctl(struct drm_device *dev, void
*data, struct drm_file *filp)
return ret;
ret = copy_to_user(out, &meta_info,
- min((size_t)size,
sizeof(meta_info))) ? -EFAULT : 0;
- return 0;
+ min((size_t)size,
sizeof(meta_info)));
+ return ret ? -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;
+ min((size_t)size,
sizeof(meta_info)));
+ return ret ? -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;
+ min((size_t)size,
sizeof(meta_info)));
+ return ret ? -EFAULT : 0;
default:
return -EINVAL;
}
--
2.50.1