drm/amdgpu: Optimization of AMDGPU_BO_LIST_OP_CREATE (v2)
authorAlex Xie <AlexBin.Xie@amd.com>
Fri, 16 Jun 2017 04:23:41 +0000 (00:23 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 19 Jun 2017 21:31:22 +0000 (17:31 -0400)
v2: Remove duplication of zeroing of bo list (Christian König)
    Move idr_alloc function to end of ioctl (Christian König)
    Call kfree bo_list when amdgpu_bo_list_set return error.
    Combine the previous two patches into this patch.
    Add amdgpu_bo_list_set function prototype.

Signed-off-by: Alex Xie <AlexBin.Xie@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c

index 9f0247cdda5e69ea5f14b6e2a2260ee0cbf8ef26..7b5c3bb2142ed2d87e2fdddafc5ed885d5562d22 100644 (file)
 #define AMDGPU_BO_LIST_MAX_PRIORITY    32u
 #define AMDGPU_BO_LIST_NUM_BUCKETS     (AMDGPU_BO_LIST_MAX_PRIORITY + 1)
 
-static int amdgpu_bo_list_create(struct amdgpu_fpriv *fpriv,
-                                struct amdgpu_bo_list **result,
+static int amdgpu_bo_list_set(struct amdgpu_device *adev,
+                                    struct drm_file *filp,
+                                    struct amdgpu_bo_list *list,
+                                    struct drm_amdgpu_bo_list_entry *info,
+                                    unsigned num_entries);
+
+static int amdgpu_bo_list_create(struct amdgpu_device *adev,
+                                struct drm_file *filp,
+                                struct drm_amdgpu_bo_list_entry *info,
+                                unsigned num_entries,
                                 int *id)
 {
        int r;
+       struct amdgpu_fpriv *fpriv = filp->driver_priv;
+       struct amdgpu_bo_list *list;
 
-       *result = kzalloc(sizeof(struct amdgpu_bo_list), GFP_KERNEL);
-       if (!*result)
+       list = kzalloc(sizeof(struct amdgpu_bo_list), GFP_KERNEL);
+       if (!list)
                return -ENOMEM;
 
+       /* initialize bo list*/
+       mutex_init(&list->lock);
+
+       r = amdgpu_bo_list_set(adev, filp, list, info, num_entries);
+       if (r) {
+               kfree(list);
+               return r;
+       }
+
+       /* idr alloc should be called only after initialization of bo list. */
        mutex_lock(&fpriv->bo_list_lock);
-       r = idr_alloc(&fpriv->bo_list_handles, *result,
-                     1, 0, GFP_KERNEL);
+       r = idr_alloc(&fpriv->bo_list_handles, list, 1, 0, GFP_KERNEL);
+       mutex_unlock(&fpriv->bo_list_lock);
        if (r < 0) {
-               mutex_unlock(&fpriv->bo_list_lock);
-               kfree(*result);
+               kfree(list);
                return r;
        }
        *id = r;
 
-       mutex_init(&(*result)->lock);
-       (*result)->num_entries = 0;
-       (*result)->array = NULL;
-
-       mutex_lock(&(*result)->lock);
-       mutex_unlock(&fpriv->bo_list_lock);
-
        return 0;
 }
 
@@ -77,6 +89,7 @@ static void amdgpu_bo_list_destroy(struct amdgpu_fpriv *fpriv, int id)
                mutex_unlock(&list->lock);
                amdgpu_bo_list_free(list);
        }
+
        mutex_unlock(&fpriv->bo_list_lock);
 }
 
@@ -273,16 +286,10 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
 
        switch (args->in.operation) {
        case AMDGPU_BO_LIST_OP_CREATE:
-               r = amdgpu_bo_list_create(fpriv, &list, &handle);
+               r = amdgpu_bo_list_create(adev, filp, info, args->in.bo_number,
+                                         &handle);
                if (r)
                        goto error_free;
-
-               r = amdgpu_bo_list_set(adev, filp, list, info,
-                                             args->in.bo_number);
-               amdgpu_bo_list_put(list);
-               if (r)
-                       goto error_free;
-
                break;
 
        case AMDGPU_BO_LIST_OP_DESTROY: