Skip to content

Commit

Permalink
drm_mm: extract check_free_mm_node
Browse files Browse the repository at this point in the history
There are already two copies of this logic. And the new scanning
stuff will add some more. So extract it into a small helper
function.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: Thomas Hellstrom <thellstrom@vmwgfx.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Daniel Vetter authored and Dave Airlie committed Jul 7, 2010
1 parent d1024ce commit 7a6b289
Showing 1 changed file with 34 additions and 37 deletions.
71 changes: 34 additions & 37 deletions drivers/gpu/drm/drm_mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,37 +283,48 @@ void drm_mm_put_block(struct drm_mm_node *cur)

EXPORT_SYMBOL(drm_mm_put_block);

static int check_free_mm_node(struct drm_mm_node *entry, unsigned long size,
unsigned alignment)
{
unsigned wasted = 0;

if (entry->size < size)
return 0;

if (alignment) {
register unsigned tmp = entry->start % alignment;
if (tmp)
wasted = alignment - tmp;
}

if (entry->size >= size + wasted) {
return 1;
}

return 0;
}

struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
unsigned long size,
unsigned alignment, int best_match)
{
struct drm_mm_node *entry;
struct drm_mm_node *best;
unsigned long best_size;
unsigned wasted;

best = NULL;
best_size = ~0UL;

list_for_each_entry(entry, &mm->free_stack, free_stack) {
wasted = 0;

if (entry->size < size)
if (!check_free_mm_node(entry, size, alignment))
continue;

if (alignment) {
register unsigned tmp = entry->start % alignment;
if (tmp)
wasted += alignment - tmp;
}
if (!best_match)
return entry;

if (entry->size >= size + wasted) {
if (!best_match)
return entry;
if (entry->size < best_size) {
best = entry;
best_size = entry->size;
}
if (entry->size < best_size) {
best = entry;
best_size = entry->size;
}
}

Expand All @@ -331,37 +342,23 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm,
struct drm_mm_node *entry;
struct drm_mm_node *best;
unsigned long best_size;
unsigned wasted;

best = NULL;
best_size = ~0UL;

list_for_each_entry(entry, &mm->free_stack, free_stack) {
wasted = 0;

if (entry->size < size)
if (entry->start > end || (entry->start+entry->size) < start)
continue;

if (entry->start > end || (entry->start+entry->size) < start)
if (!check_free_mm_node(entry, size, alignment))
continue;

if (entry->start < start)
wasted += start - entry->start;
if (!best_match)
return entry;

if (alignment) {
register unsigned tmp = (entry->start + wasted) % alignment;
if (tmp)
wasted += alignment - tmp;
}

if (entry->size >= size + wasted &&
(entry->start + wasted + size) <= end) {
if (!best_match)
return entry;
if (entry->size < best_size) {
best = entry;
best_size = entry->size;
}
if (entry->size < best_size) {
best = entry;
best_size = entry->size;
}
}

Expand Down

0 comments on commit 7a6b289

Please sign in to comment.