drm: Convert drm_vma_manager to embedded interval-tree in drm_mm
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 3 Aug 2016 15:04:10 +0000 (16:04 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 8 Aug 2016 08:05:17 +0000 (10:05 +0200)
Having added an interval-tree to struct drm_mm, we can replace the
auxiliary rb-tree inside the drm_vma_manager with it.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: David Herrmann <dh.herrmann@gmail.com>
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/1470236651-678-2-git-send-email-chris@chris-wilson.co.uk
drivers/gpu/drm/drm_vma_manager.c
include/drm/drm_vma_manager.h

index f306c885597869051eafd3924fb312bf78c6cf49..0aef432679f9a64a066d1c9dc77c06b37e088d4a 100644 (file)
@@ -86,7 +86,6 @@ void drm_vma_offset_manager_init(struct drm_vma_offset_manager *mgr,
                                 unsigned long page_offset, unsigned long size)
 {
        rwlock_init(&mgr->vm_lock);
-       mgr->vm_addr_space_rb = RB_ROOT;
        drm_mm_init(&mgr->vm_addr_space_mm, page_offset, size);
 }
 EXPORT_SYMBOL(drm_vma_offset_manager_init);
@@ -145,16 +144,16 @@ struct drm_vma_offset_node *drm_vma_offset_lookup_locked(struct drm_vma_offset_m
                                                         unsigned long start,
                                                         unsigned long pages)
 {
-       struct drm_vma_offset_node *node, *best;
+       struct drm_mm_node *node, *best;
        struct rb_node *iter;
        unsigned long offset;
 
-       iter = mgr->vm_addr_space_rb.rb_node;
+       iter = mgr->vm_addr_space_mm.interval_tree.rb_node;
        best = NULL;
 
        while (likely(iter)) {
-               node = rb_entry(iter, struct drm_vma_offset_node, vm_rb);
-               offset = node->vm_node.start;
+               node = rb_entry(iter, struct drm_mm_node, rb);
+               offset = node->start;
                if (start >= offset) {
                        iter = iter->rb_right;
                        best = node;
@@ -167,38 +166,17 @@ struct drm_vma_offset_node *drm_vma_offset_lookup_locked(struct drm_vma_offset_m
 
        /* verify that the node spans the requested area */
        if (best) {
-               offset = best->vm_node.start + best->vm_node.size;
+               offset = best->start + best->size;
                if (offset < start + pages)
                        best = NULL;
        }
 
-       return best;
-}
-EXPORT_SYMBOL(drm_vma_offset_lookup_locked);
-
-/* internal helper to link @node into the rb-tree */
-static void _drm_vma_offset_add_rb(struct drm_vma_offset_manager *mgr,
-                                  struct drm_vma_offset_node *node)
-{
-       struct rb_node **iter = &mgr->vm_addr_space_rb.rb_node;
-       struct rb_node *parent = NULL;
-       struct drm_vma_offset_node *iter_node;
-
-       while (likely(*iter)) {
-               parent = *iter;
-               iter_node = rb_entry(*iter, struct drm_vma_offset_node, vm_rb);
+       if (!best)
+               return NULL;
 
-               if (node->vm_node.start < iter_node->vm_node.start)
-                       iter = &(*iter)->rb_left;
-               else if (node->vm_node.start > iter_node->vm_node.start)
-                       iter = &(*iter)->rb_right;
-               else
-                       BUG();
-       }
-
-       rb_link_node(&node->vm_rb, parent, iter);
-       rb_insert_color(&node->vm_rb, &mgr->vm_addr_space_rb);
+       return container_of(best, struct drm_vma_offset_node, vm_node);
 }
+EXPORT_SYMBOL(drm_vma_offset_lookup_locked);
 
 /**
  * drm_vma_offset_add() - Add offset node to manager
@@ -240,8 +218,6 @@ int drm_vma_offset_add(struct drm_vma_offset_manager *mgr,
        if (ret)
                goto out_unlock;
 
-       _drm_vma_offset_add_rb(mgr, node);
-
 out_unlock:
        write_unlock(&mgr->vm_lock);
        return ret;
@@ -265,7 +241,6 @@ void drm_vma_offset_remove(struct drm_vma_offset_manager *mgr,
        write_lock(&mgr->vm_lock);
 
        if (drm_mm_node_allocated(&node->vm_node)) {
-               rb_erase(&node->vm_rb, &mgr->vm_addr_space_rb);
                drm_mm_remove_node(&node->vm_node);
                memset(&node->vm_node, 0, sizeof(node->vm_node));
        }
index 06ea8e077ec2f6435a9a34b38275db9408307fca..afba6fcac85314c36e2924bc40603ffe62941fc9 100644 (file)
@@ -40,13 +40,11 @@ struct drm_vma_offset_file {
 struct drm_vma_offset_node {
        rwlock_t vm_lock;
        struct drm_mm_node vm_node;
-       struct rb_node vm_rb;
        struct rb_root vm_files;
 };
 
 struct drm_vma_offset_manager {
        rwlock_t vm_lock;
-       struct rb_root vm_addr_space_rb;
        struct drm_mm vm_addr_space_mm;
 };