Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 210079
b: refs/heads/master
c: 7521473
h: refs/heads/master
i:
  210077: 644287a
  210075: 79742e3
  210071: 84f731d
  210063: 47d1386
  210047: 6461ab6
v: v3
  • Loading branch information
Daniel Vetter authored and Dave Airlie committed Aug 26, 2010
1 parent d76fa70 commit 62a9f2e
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 11 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: 5afda9e9a4625d771795a5f540fb202eec08a49c
refs/heads/master: 7521473305f1379403b893a30ac09a2132dc1e25
24 changes: 14 additions & 10 deletions trunk/drivers/gpu/drm/drm_mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,21 +285,21 @@ 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)
static int check_free_hole(unsigned long start, unsigned long end,
unsigned long size, unsigned alignment)
{
unsigned wasted = 0;

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

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

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

Expand All @@ -320,7 +320,8 @@ struct drm_mm_node *drm_mm_search_free(const struct drm_mm *mm,
best_size = ~0UL;

list_for_each_entry(entry, &mm->free_stack, free_stack) {
if (!check_free_mm_node(entry, size, alignment))
if (!check_free_hole(entry->start, entry->start + entry->size,
size, alignment))
continue;

if (!best_match)
Expand Down Expand Up @@ -353,10 +354,12 @@ struct drm_mm_node *drm_mm_search_free_in_range(const struct drm_mm *mm,
best_size = ~0UL;

list_for_each_entry(entry, &mm->free_stack, free_stack) {
if (entry->start > end || (entry->start+entry->size) < start)
continue;
unsigned long adj_start = entry->start < start ?
start : entry->start;
unsigned long adj_end = entry->start + entry->size > end ?
end : entry->start + entry->size;

if (!check_free_mm_node(entry, size, alignment))
if (!check_free_hole(adj_start, adj_end, size, alignment))
continue;

if (!best_match)
Expand Down Expand Up @@ -449,7 +452,8 @@ int drm_mm_scan_add_block(struct drm_mm_node *node)
node->free_stack.prev = prev_free;
node->free_stack.next = next_free;

if (check_free_mm_node(node, mm->scan_size, mm->scan_alignment)) {
if (check_free_hole(node->start, node->start + node->size,
mm->scan_size, mm->scan_alignment)) {
mm->scan_hit_start = node->start;
mm->scan_hit_size = node->size;

Expand Down

0 comments on commit 62a9f2e

Please sign in to comment.