On 10/15/26 04:09, Jesse Zhang wrote:
> 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]>

Reviewed-by: Christian König <[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;
>               }

Reply via email to