[Intel-gfx] [PATCH] drm: Memory fragmentation from lost alignment blocks
Chris Wilson
chris at chris-wilson.co.uk
Fri May 22 15:14:22 CEST 2009
If the block needs an alignment but otherwise fits exactly into the tail,
then the split-off block from the start would remain marked as non-free.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
drivers/gpu/drm/drm_mm.c | 20 +++++++++-----------
1 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index 367c590..68e1b06 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -138,36 +138,34 @@ static struct drm_mm_node *drm_mm_split_at_start(struct drm_mm_node *parent,
}
-
-struct drm_mm_node *drm_mm_get_block(struct drm_mm_node * parent,
+struct drm_mm_node *drm_mm_get_block(struct drm_mm_node * node,
unsigned long size, unsigned alignment)
{
struct drm_mm_node *align_splitoff = NULL;
- struct drm_mm_node *child;
unsigned tmp = 0;
if (alignment)
- tmp = parent->start % alignment;
+ tmp = node->start % alignment;
if (tmp) {
- align_splitoff = drm_mm_split_at_start(parent, alignment - tmp);
+ align_splitoff = drm_mm_split_at_start(node, alignment - tmp);
if (!align_splitoff)
return NULL;
+
}
- if (parent->size == size) {
- list_del_init(&parent->fl_entry);
- parent->free = 0;
- return parent;
+ if (node->size == size) {
+ list_del_init(&node->fl_entry);
+ node->free = 0;
} else {
- child = drm_mm_split_at_start(parent, size);
+ node = drm_mm_split_at_start(node, size);
}
if (align_splitoff)
drm_mm_put_block(align_splitoff);
- return child;
+ return node;
}
EXPORT_SYMBOL(drm_mm_get_block);
--
1.6.3.1
More information about the Intel-gfx
mailing list