[PATCH 1/7] evict-stack

Chris Wilson chris at chris-wilson.co.uk
Sat May 12 22:23:45 UTC 2018


---
 drivers/gpu/drm/drm_mm.c | 38 ++++++++++++++++++++++++++------------
 1 file changed, 26 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index 3166026a1874..fe9bc0406fd9 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -239,7 +239,7 @@ static void drm_mm_interval_tree_add_node(struct drm_mm_node *hole_node,
 #define HOLE_SIZE(NODE) ((NODE)->hole_size)
 #define HOLE_ADDR(NODE) (__drm_mm_hole_node_start(NODE))
 
-static void add_hole(struct drm_mm_node *node)
+static void add_hole(struct drm_mm_node *node, struct list_head *after)
 {
 	struct drm_mm *mm = node->mm;
 
@@ -250,7 +250,19 @@ static void add_hole(struct drm_mm_node *node)
 	RB_INSERT(mm->holes_size, rb_hole_size, HOLE_SIZE);
 	RB_INSERT(mm->holes_addr, rb_hole_addr, HOLE_ADDR);
 
-	list_add(&node->hole_stack, &mm->hole_stack);
+	list_add(&node->hole_stack, after);
+}
+
+static void resize_hole(struct drm_mm_node *node)
+{
+	struct drm_mm *mm = node->mm;
+
+	node->hole_size =
+		__drm_mm_hole_node_end(node) - __drm_mm_hole_node_start(node);
+	DRM_MM_BUG_ON(!drm_mm_hole_follows(node));
+
+	rb_erase(&node->rb_hole_size, &mm->holes_size);
+	RB_INSERT(mm->holes_size, rb_hole_size, HOLE_SIZE);
 }
 
 static void rm_hole(struct drm_mm_node *node)
@@ -415,11 +427,12 @@ int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node)
 	node->allocated = true;
 	node->hole_size = 0;
 
-	rm_hole(hole);
-	if (node->start > hole_start)
-		add_hole(hole);
 	if (end < hole_end)
-		add_hole(node);
+		add_hole(node, &hole->hole_stack);
+	if (node->start > hole_start)
+		resize_hole(hole);
+	else
+		rm_hole(hole);
 
 	save_stack(node);
 	return 0;
@@ -520,11 +533,12 @@ int drm_mm_insert_node_in_range(struct drm_mm * const mm,
 		drm_mm_interval_tree_add_node(hole, node);
 		node->allocated = true;
 
-		rm_hole(hole);
-		if (adj_start > hole_start)
-			add_hole(hole);
 		if (adj_start + size < hole_end)
-			add_hole(node);
+			add_hole(node, &hole->hole_stack);
+		if (adj_start > hole_start)
+			resize_hole(hole);
+		else
+			rm_hole(hole);
 
 		save_stack(node);
 		return 0;
@@ -561,7 +575,7 @@ void drm_mm_remove_node(struct drm_mm_node *node)
 
 	if (drm_mm_hole_follows(prev_node))
 		rm_hole(prev_node);
-	add_hole(prev_node);
+	add_hole(prev_node, &mm->hole_stack);
 }
 EXPORT_SYMBOL(drm_mm_remove_node);
 
@@ -894,7 +908,7 @@ void drm_mm_init(struct drm_mm *mm, u64 start, u64 size)
 	mm->head_node.mm = mm;
 	mm->head_node.start = start + size;
 	mm->head_node.size = -size;
-	add_hole(&mm->head_node);
+	add_hole(&mm->head_node, &mm->hole_stack);
 
 	mm->scan_active = 0;
 }
-- 
2.17.0



More information about the Intel-gfx-trybot mailing list