aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_mm.c2
-rw-r--r--drivers/gpu/drm/selftests/test-drm_mm.c10
-rw-r--r--include/drm/drm_mm.h5
3 files changed, 11 insertions, 6 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
index 8bfb0b327267..f794089d30ac 100644
--- a/drivers/gpu/drm/drm_mm.c
+++ b/drivers/gpu/drm/drm_mm.c
@@ -170,7 +170,7 @@ struct drm_mm_node *
170__drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last) 170__drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last)
171{ 171{
172 return drm_mm_interval_tree_iter_first((struct rb_root *)&mm->interval_tree, 172 return drm_mm_interval_tree_iter_first((struct rb_root *)&mm->interval_tree,
173 start, last); 173 start, last) ?: (struct drm_mm_node *)&mm->head_node;
174} 174}
175EXPORT_SYMBOL(__drm_mm_interval_first); 175EXPORT_SYMBOL(__drm_mm_interval_first);
176 176
diff --git a/drivers/gpu/drm/selftests/test-drm_mm.c b/drivers/gpu/drm/selftests/test-drm_mm.c
index 1e71bc182ca9..2958f596081e 100644
--- a/drivers/gpu/drm/selftests/test-drm_mm.c
+++ b/drivers/gpu/drm/selftests/test-drm_mm.c
@@ -839,16 +839,18 @@ static bool assert_contiguous_in_range(struct drm_mm *mm,
839 n++; 839 n++;
840 } 840 }
841 841
842 drm_mm_for_each_node_in_range(node, mm, 0, start) { 842 if (start > 0) {
843 if (node) { 843 node = __drm_mm_interval_first(mm, 0, start - 1);
844 if (node->allocated) {
844 pr_err("node before start: node=%llx+%llu, start=%llx\n", 845 pr_err("node before start: node=%llx+%llu, start=%llx\n",
845 node->start, node->size, start); 846 node->start, node->size, start);
846 return false; 847 return false;
847 } 848 }
848 } 849 }
849 850
850 drm_mm_for_each_node_in_range(node, mm, end, U64_MAX) { 851 if (end < U64_MAX) {
851 if (node) { 852 node = __drm_mm_interval_first(mm, end, U64_MAX);
853 if (node->allocated) {
852 pr_err("node after end: node=%llx+%llu, end=%llx\n", 854 pr_err("node after end: node=%llx+%llu, end=%llx\n",
853 node->start, node->size, end); 855 node->start, node->size, end);
854 return false; 856 return false;
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h
index d81b0ba9921f..f262da180117 100644
--- a/include/drm/drm_mm.h
+++ b/include/drm/drm_mm.h
@@ -459,10 +459,13 @@ __drm_mm_interval_first(const struct drm_mm *mm, u64 start, u64 last);
459 * but using the internal interval tree to accelerate the search for the 459 * but using the internal interval tree to accelerate the search for the
460 * starting node, and so not safe against removal of elements. It assumes 460 * starting node, and so not safe against removal of elements. It assumes
461 * that @end is within (or is the upper limit of) the drm_mm allocator. 461 * that @end is within (or is the upper limit of) the drm_mm allocator.
462 * If [@start, @end] are beyond the range of the drm_mm, the iterator may walk
463 * over the special _unallocated_ &drm_mm.head_node, and may even continue
464 * indefinitely.
462 */ 465 */
463#define drm_mm_for_each_node_in_range(node__, mm__, start__, end__) \ 466#define drm_mm_for_each_node_in_range(node__, mm__, start__, end__) \
464 for (node__ = __drm_mm_interval_first((mm__), (start__), (end__)-1); \ 467 for (node__ = __drm_mm_interval_first((mm__), (start__), (end__)-1); \
465 node__ && node__->start < (end__); \ 468 node__->start < (end__); \
466 node__ = list_next_entry(node__, node_list)) 469 node__ = list_next_entry(node__, node_list))
467 470
468void drm_mm_scan_init_with_range(struct drm_mm_scan *scan, 471void drm_mm_scan_init_with_range(struct drm_mm_scan *scan,