[PATCH 1/2] evict-stack
Chris Wilson
chris at chris-wilson.co.uk
Sat May 12 19:55:59 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