Replace kmalloc_array() + copy_from_user() with memdup_array_user().

This shrinks the source code and improves separation between the kernel
and userspace slabs.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@igalia.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index a2adaacf6adb..7e2ab0e5be96 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1764,30 +1764,21 @@ int amdgpu_cs_wait_fences_ioctl(struct drm_device *dev, 
void *data,
 {
        struct amdgpu_device *adev = drm_to_adev(dev);
        union drm_amdgpu_wait_fences *wait = data;
-       uint32_t fence_count = wait->in.fence_count;
-       struct drm_amdgpu_fence *fences_user;
        struct drm_amdgpu_fence *fences;
        int r;
 
        /* Get the fences from userspace */
-       fences = kmalloc_array(fence_count, sizeof(struct drm_amdgpu_fence),
-                       GFP_KERNEL);
-       if (fences == NULL)
-               return -ENOMEM;
-
-       fences_user = u64_to_user_ptr(wait->in.fences);
-       if (copy_from_user(fences, fences_user,
-               sizeof(struct drm_amdgpu_fence) * fence_count)) {
-               r = -EFAULT;
-               goto err_free_fences;
-       }
+       fences = memdup_array_user(u64_to_user_ptr(wait->in.fences),
+                                  wait->in.fence_count,
+                                  sizeof(struct drm_amdgpu_fence));
+       if (IS_ERR(fences))
+               return PTR_ERR(fences);
 
        if (wait->in.wait_all)
                r = amdgpu_cs_wait_all_fences(adev, filp, wait, fences);
        else
                r = amdgpu_cs_wait_any_fence(adev, filp, wait, fences);
 
-err_free_fences:
        kfree(fences);
 
        return r;
-- 
2.48.0

Reply via email to