Skip to content

Commit

Permalink
drm: Memory fragmentation from lost alignment blocks
Browse files Browse the repository at this point in the history
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@chris-wilson.co.uk>
Acked-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Chris Wilson authored and Dave Airlie committed Jun 14, 2009
1 parent 602c11a commit e6c03c5
Showing 1 changed file with 9 additions and 11 deletions.
20 changes: 9 additions & 11 deletions drivers/gpu/drm/drm_mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -188,36 +188,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,
unsigned long size, unsigned alignment)
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, 0);
drm_mm_split_at_start(node, alignment - tmp, 0);
if (unlikely(align_splitoff == NULL))
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, 0);
node = drm_mm_split_at_start(node, size, 0);
}

if (align_splitoff)
drm_mm_put_block(align_splitoff);

return child;
return node;
}

EXPORT_SYMBOL(drm_mm_get_block);
Expand Down

0 comments on commit e6c03c5

Please sign in to comment.