drm/amdgpu: group userptr in the BO list v2
authorChristian König <christian.koenig@amd.com>
Mon, 22 Feb 2016 14:40:59 +0000 (15:40 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 8 Mar 2016 16:01:45 +0000 (11:01 -0500)
We need them together with the next patch.

v2: Don't take bo reference twice

Signed-off-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c

index 497ca587cc35d14f4152fb7f5279e30b9e583d9e..11a9f5899995aa4db0ffd0ee328c5d18e58623ab 100644 (file)
@@ -1048,7 +1048,7 @@ struct amdgpu_bo_list {
        struct amdgpu_bo *gds_obj;
        struct amdgpu_bo *gws_obj;
        struct amdgpu_bo *oa_obj;
-       bool has_userptr;
+       unsigned first_userptr;
        unsigned num_entries;
        struct amdgpu_bo_list_entry *array;
 };
index 4792f9d0b7d40ff33d616b3a8daeb027e5d4698e..9763e52886fe1ceeb9dd3dbe1d147a94b7644d2b 100644 (file)
@@ -91,7 +91,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
        struct amdgpu_bo *gws_obj = adev->gds.gws_gfx_bo;
        struct amdgpu_bo *oa_obj = adev->gds.oa_gfx_bo;
 
-       bool has_userptr = false;
+       unsigned last_entry = 0, first_userptr = num_entries;
        unsigned i;
        int r;
 
@@ -101,8 +101,9 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
        memset(array, 0, num_entries * sizeof(struct amdgpu_bo_list_entry));
 
        for (i = 0; i < num_entries; ++i) {
-               struct amdgpu_bo_list_entry *entry = &array[i];
+               struct amdgpu_bo_list_entry *entry;
                struct drm_gem_object *gobj;
+               struct amdgpu_bo *bo;
                struct mm_struct *usermm;
 
                gobj = drm_gem_object_lookup(adev->ddev, filp, info[i].bo_handle);
@@ -111,19 +112,24 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
                        goto error_free;
                }
 
-               entry->robj = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
+               bo = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
                drm_gem_object_unreference_unlocked(gobj);
-               entry->priority = min(info[i].bo_priority,
-                                     AMDGPU_BO_LIST_MAX_PRIORITY);
-               usermm = amdgpu_ttm_tt_get_usermm(entry->robj->tbo.ttm);
+
+               usermm = amdgpu_ttm_tt_get_usermm(bo->tbo.ttm);
                if (usermm) {
                        if (usermm != current->mm) {
-                               amdgpu_bo_unref(&entry->robj);
+                               amdgpu_bo_unref(&bo);
                                r = -EPERM;
                                goto error_free;
                        }
-                       has_userptr = true;
+                       entry = &array[--first_userptr];
+               } else {
+                       entry = &array[last_entry++];
                }
+
+               entry->robj = bo;
+               entry->priority = min(info[i].bo_priority,
+                                     AMDGPU_BO_LIST_MAX_PRIORITY);
                entry->tv.bo = &entry->robj->tbo;
                entry->tv.shared = true;
 
@@ -145,7 +151,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
        list->gds_obj = gds_obj;
        list->gws_obj = gws_obj;
        list->oa_obj = oa_obj;
-       list->has_userptr = has_userptr;
+       list->first_userptr = first_userptr;
        list->array = array;
        list->num_entries = num_entries;
 
index 52c3eb96b1993312579230198531ef7683b52a70..7833dfb1ff6e7457e3035e6c0547880bb09eebd1 100644 (file)
@@ -350,7 +350,8 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
 
        p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle);
        if (p->bo_list) {
-               need_mmap_lock = p->bo_list->has_userptr;
+               need_mmap_lock = p->bo_list->first_userptr !=
+                       p->bo_list->num_entries;
                amdgpu_bo_list_get_list(p->bo_list, &p->validated);
        }