Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 204986
b: refs/heads/master
c: 7a6b289
h: refs/heads/master
v: v3
  • Loading branch information
Daniel Vetter authored and Dave Airlie committed Jul 7, 2010
1 parent a1937ab commit 5efb420
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 38 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d1024ce91ff4c2c4ccbf692d204c71cbf215157a
refs/heads/master: 7a6b2896f261894dde287d3faefa4b432cddca53
71 changes: 34 additions & 37 deletions trunk/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 5efb420

Please sign in to comment.