drm/amdgpu: cleanup bo list bucket handling
authorChristian König <christian.koenig@amd.com>
Fri, 18 Dec 2015 20:26:47 +0000 (21:26 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 10 Feb 2016 19:16:47 +0000 (14:16 -0500)
Move that into the BO list. No functional change.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@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 9c1113a..b705664 100644 (file)
@@ -1097,6 +1097,8 @@ struct amdgpu_bo_list {
 
 struct amdgpu_bo_list *
 amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id);
+void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
+                            struct list_head *validated);
 void amdgpu_bo_list_put(struct amdgpu_bo_list *list);
 void amdgpu_bo_list_free(struct amdgpu_bo_list *list);
 
index f82a2dd..9da4bd0 100644 (file)
@@ -32,6 +32,9 @@
 #include "amdgpu.h"
 #include "amdgpu_trace.h"
 
+#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,
                                 int *id)
@@ -106,7 +109,8 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
 
                entry->robj = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
                drm_gem_object_unreference_unlocked(gobj);
-               entry->priority = info[i].bo_priority;
+               entry->priority = min(info[i].bo_priority,
+                                     AMDGPU_BO_LIST_MAX_PRIORITY);
                entry->prefered_domains = entry->robj->initial_domain;
                entry->allowed_domains = entry->prefered_domains;
                if (entry->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
@@ -161,6 +165,36 @@ amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id)
        return result;
 }
 
+void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
+                            struct list_head *validated)
+{
+       /* This is based on the bucket sort with O(n) time complexity.
+        * An item with priority "i" is added to bucket[i]. The lists are then
+        * concatenated in descending order.
+        */
+       struct list_head bucket[AMDGPU_BO_LIST_NUM_BUCKETS];
+       unsigned i;
+
+       for (i = 0; i < AMDGPU_BO_LIST_NUM_BUCKETS; i++)
+               INIT_LIST_HEAD(&bucket[i]);
+
+       /* Since buffers which appear sooner in the relocation list are
+        * likely to be used more often than buffers which appear later
+        * in the list, the sort mustn't change the ordering of buffers
+        * with the same priority, i.e. it must be stable.
+        */
+       for (i = 0; i < list->num_entries; i++) {
+               unsigned priority = list->array[i].priority;
+
+               list_add_tail(&list->array[i].tv.head,
+                             &bucket[priority]);
+       }
+
+       /* Connect the sorted buckets in the output list. */
+       for (i = 0; i < AMDGPU_BO_LIST_NUM_BUCKETS; i++)
+               list_splice(&bucket[i], validated);
+}
+
 void amdgpu_bo_list_put(struct amdgpu_bo_list *list)
 {
        mutex_unlock(&list->lock);
index 5986da2..d249e9e 100644 (file)
 #include "amdgpu.h"
 #include "amdgpu_trace.h"
 
-#define AMDGPU_CS_MAX_PRIORITY         32u
-#define AMDGPU_CS_NUM_BUCKETS          (AMDGPU_CS_MAX_PRIORITY + 1)
-
-/* This is based on the bucket sort with O(n) time complexity.
- * An item with priority "i" is added to bucket[i]. The lists are then
- * concatenated in descending order.
- */
-struct amdgpu_cs_buckets {
-       struct list_head bucket[AMDGPU_CS_NUM_BUCKETS];
-};
-
-static void amdgpu_cs_buckets_init(struct amdgpu_cs_buckets *b)
-{
-       unsigned i;
-
-       for (i = 0; i < AMDGPU_CS_NUM_BUCKETS; i++)
-               INIT_LIST_HEAD(&b->bucket[i]);
-}
-
-static void amdgpu_cs_buckets_add(struct amdgpu_cs_buckets *b,
-                                 struct list_head *item, unsigned priority)
-{
-       /* Since buffers which appear sooner in the relocation list are
-        * likely to be used more often than buffers which appear later
-        * in the list, the sort mustn't change the ordering of buffers
-        * with the same priority, i.e. it must be stable.
-        */
-       list_add_tail(item, &b->bucket[min(priority, AMDGPU_CS_MAX_PRIORITY)]);
-}
-
-static void amdgpu_cs_buckets_get_list(struct amdgpu_cs_buckets *b,
-                                      struct list_head *out_list)
-{
-       unsigned i;
-
-       /* Connect the sorted buckets in the output list. */
-       for (i = 0; i < AMDGPU_CS_NUM_BUCKETS; i++) {
-               list_splice(&b->bucket[i], out_list);
-       }
-}
-
 int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
                       u32 ip_instance, u32 ring,
                       struct amdgpu_ring **out_ring)
@@ -382,22 +341,16 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
                                union drm_amdgpu_cs *cs)
 {
        struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
-       struct amdgpu_cs_buckets buckets;
        struct list_head duplicates;
        bool need_mmap_lock = false;
-       int i, r;
+       int r;
 
        INIT_LIST_HEAD(&p->validated);
 
        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;
-               amdgpu_cs_buckets_init(&buckets);
-               for (i = 0; i < p->bo_list->num_entries; i++)
-                       amdgpu_cs_buckets_add(&buckets, &p->bo_list->array[i].tv.head,
-                                             p->bo_list->array[i].priority);
-
-               amdgpu_cs_buckets_get_list(&buckets, &p->validated);
+               amdgpu_bo_list_get_list(p->bo_list, &p->validated);
        }
 
        INIT_LIST_HEAD(&duplicates);