Rev 4075 | Rev 5078 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4075 | Rev 4112 | ||
---|---|---|---|
Line 59... | Line 59... | ||
59 | int ret; |
59 | int ret; |
Line 60... | Line 60... | ||
60 | 60 | ||
61 | lpfn = placement->lpfn; |
61 | lpfn = placement->lpfn; |
62 | if (!lpfn) |
62 | if (!lpfn) |
63 | lpfn = man->size; |
63 | lpfn = man->size; |
64 | do { |
64 | |
65 | ret = drm_mm_pre_get(mm); |
65 | node = kzalloc(sizeof(*node), GFP_KERNEL); |
66 | if (unlikely(ret)) |
66 | if (!node) |
Line 67... | Line 67... | ||
67 | return ret; |
67 | return -ENOMEM; |
68 | - | ||
69 | spin_lock(&rman->lock); |
- | |
70 | node = drm_mm_search_free_in_range(mm, |
- | |
71 | mem->num_pages, mem->page_alignment, |
- | |
72 | placement->fpfn, lpfn, 1); |
- | |
73 | if (unlikely(node == NULL)) { |
- | |
74 | spin_unlock(&rman->lock); |
- | |
75 | return 0; |
68 | |
76 | } |
69 | spin_lock(&rman->lock); |
77 | node = drm_mm_get_block_atomic_range(node, mem->num_pages, |
70 | ret = drm_mm_insert_node_in_range(mm, node, mem->num_pages, |
78 | mem->page_alignment, |
71 | mem->page_alignment, |
79 | placement->fpfn, |
72 | placement->fpfn, lpfn, |
80 | lpfn); |
- | |
Line -... | Line 73... | ||
- | 73 | DRM_MM_SEARCH_BEST); |
|
- | 74 | spin_unlock(&rman->lock); |
|
- | 75 | ||
81 | spin_unlock(&rman->lock); |
76 | if (unlikely(ret)) { |
82 | } while (node == NULL); |
77 | kfree(node); |
- | 78 | } else { |
|
- | 79 | mem->mm_node = node; |
|
83 | 80 | mem->start = node->start; |
|
84 | mem->mm_node = node; |
81 | } |
Line 85... | Line 82... | ||
85 | mem->start = node->start; |
82 | |
86 | return 0; |
83 | return 0; |
87 | } |
84 | } |
88 | 85 | ||
Line 89... | Line 86... | ||
89 | static void ttm_bo_man_put_node(struct ttm_mem_type_manager *man, |
86 | static void ttm_bo_man_put_node(struct ttm_mem_type_manager *man, |
90 | struct ttm_mem_reg *mem) |
87 | struct ttm_mem_reg *mem) |
91 | { |
88 | { |
92 | struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv; |
89 | struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv; |
- | 90 | ||
- | 91 | if (mem->mm_node) { |
|
93 | 92 | spin_lock(&rman->lock); |
|
94 | if (mem->mm_node) { |
93 | drm_mm_remove_node(mem->mm_node); |
95 | spin_lock(&rman->lock); |
94 | spin_unlock(&rman->lock); |
Line 96... | Line 95... | ||
96 | drm_mm_put_block(mem->mm_node); |
95 |