diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-22 03:36:37 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-12-28 07:30:24 -0500 |
commit | 3f85fb3462dc1c87a9353eb38714468d46248b2e (patch) | |
tree | 0b992d89057a98e2c10452db13f4ad439bb8f074 | |
parent | 3fa489dabea9a1cb0656e2da90354f7c4e53f890 (diff) |
drm: Wrap drm_mm_node.hole_follows
Insulate users from changes to the internal hole tracking within
struct drm_mm_node by using an accessor for hole_follows.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
[danvet: resolve conflicts in i915_vma.c]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/drm_mm.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_vma.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/selftests/test-drm_mm.c | 18 | ||||
-rw-r--r-- | include/drm/drm_mm.h | 22 |
4 files changed, 37 insertions, 19 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index b59978fe4c6e..c0024719f32b 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
@@ -323,7 +323,7 @@ int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node) | |||
323 | } | 323 | } |
324 | 324 | ||
325 | hole = list_last_entry(&hole->node_list, typeof(*hole), node_list); | 325 | hole = list_last_entry(&hole->node_list, typeof(*hole), node_list); |
326 | if (!hole->hole_follows) | 326 | if (!drm_mm_hole_follows(hole)) |
327 | return -ENOSPC; | 327 | return -ENOSPC; |
328 | 328 | ||
329 | adj_start = hole_start = __drm_mm_hole_node_start(hole); | 329 | adj_start = hole_start = __drm_mm_hole_node_start(hole); |
@@ -408,7 +408,7 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, | |||
408 | u64 adj_start = hole_start; | 408 | u64 adj_start = hole_start; |
409 | u64 adj_end = hole_end; | 409 | u64 adj_end = hole_end; |
410 | 410 | ||
411 | DRM_MM_BUG_ON(!hole_node->hole_follows || node->allocated); | 411 | DRM_MM_BUG_ON(!drm_mm_hole_follows(hole_node) || node->allocated); |
412 | 412 | ||
413 | if (adj_start < start) | 413 | if (adj_start < start) |
414 | adj_start = start; | 414 | adj_start = start; |
@@ -523,16 +523,16 @@ void drm_mm_remove_node(struct drm_mm_node *node) | |||
523 | prev_node = | 523 | prev_node = |
524 | list_entry(node->node_list.prev, struct drm_mm_node, node_list); | 524 | list_entry(node->node_list.prev, struct drm_mm_node, node_list); |
525 | 525 | ||
526 | if (node->hole_follows) { | 526 | if (drm_mm_hole_follows(node)) { |
527 | DRM_MM_BUG_ON(__drm_mm_hole_node_start(node) == | 527 | DRM_MM_BUG_ON(__drm_mm_hole_node_start(node) == |
528 | __drm_mm_hole_node_end(node)); | 528 | __drm_mm_hole_node_end(node)); |
529 | list_del(&node->hole_stack); | 529 | list_del(&node->hole_stack); |
530 | } else | 530 | } else { |
531 | DRM_MM_BUG_ON(__drm_mm_hole_node_start(node) != | 531 | DRM_MM_BUG_ON(__drm_mm_hole_node_start(node) != |
532 | __drm_mm_hole_node_end(node)); | 532 | __drm_mm_hole_node_end(node)); |
533 | } | ||
533 | 534 | ||
534 | 535 | if (!drm_mm_hole_follows(prev_node)) { | |
535 | if (!prev_node->hole_follows) { | ||
536 | prev_node->hole_follows = 1; | 536 | prev_node->hole_follows = 1; |
537 | list_add(&prev_node->hole_stack, &mm->hole_stack); | 537 | list_add(&prev_node->hole_stack, &mm->hole_stack); |
538 | } else | 538 | } else |
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c index a792dcb902b5..325b917c5ad7 100644 --- a/drivers/gpu/drm/i915/i915_vma.c +++ b/drivers/gpu/drm/i915/i915_vma.c | |||
@@ -320,11 +320,11 @@ bool i915_gem_valid_gtt_space(struct i915_vma *vma, | |||
320 | return true; | 320 | return true; |
321 | 321 | ||
322 | other = list_entry(gtt_space->node_list.prev, struct drm_mm_node, node_list); | 322 | other = list_entry(gtt_space->node_list.prev, struct drm_mm_node, node_list); |
323 | if (other->allocated && !other->hole_follows && other->color != cache_level) | 323 | if (other->allocated && !drm_mm_hole_follows(other) && other->color != cache_level) |
324 | return false; | 324 | return false; |
325 | 325 | ||
326 | other = list_entry(gtt_space->node_list.next, struct drm_mm_node, node_list); | 326 | other = list_entry(gtt_space->node_list.next, struct drm_mm_node, node_list); |
327 | if (other->allocated && !gtt_space->hole_follows && other->color != cache_level) | 327 | if (other->allocated && !drm_mm_hole_follows(gtt_space) && other->color != cache_level) |
328 | return false; | 328 | return false; |
329 | 329 | ||
330 | return true; | 330 | return true; |
diff --git a/drivers/gpu/drm/selftests/test-drm_mm.c b/drivers/gpu/drm/selftests/test-drm_mm.c index f609e4f1eeaf..2ce92f4dcfc7 100644 --- a/drivers/gpu/drm/selftests/test-drm_mm.c +++ b/drivers/gpu/drm/selftests/test-drm_mm.c | |||
@@ -63,7 +63,7 @@ static bool assert_no_holes(const struct drm_mm *mm) | |||
63 | } | 63 | } |
64 | 64 | ||
65 | drm_mm_for_each_node(hole, mm) { | 65 | drm_mm_for_each_node(hole, mm) { |
66 | if (hole->hole_follows) { | 66 | if (drm_mm_hole_follows(hole)) { |
67 | pr_err("Hole follows node, expected none!\n"); | 67 | pr_err("Hole follows node, expected none!\n"); |
68 | return false; | 68 | return false; |
69 | } | 69 | } |
@@ -125,7 +125,7 @@ static bool assert_continuous(const struct drm_mm *mm, u64 size) | |||
125 | return false; | 125 | return false; |
126 | } | 126 | } |
127 | 127 | ||
128 | if (node->hole_follows) { | 128 | if (drm_mm_hole_follows(node)) { |
129 | pr_err("node[%ld] is followed by a hole!\n", n); | 129 | pr_err("node[%ld] is followed by a hole!\n", n); |
130 | return false; | 130 | return false; |
131 | } | 131 | } |
@@ -828,7 +828,8 @@ static bool assert_contiguous_in_range(struct drm_mm *mm, | |||
828 | return false; | 828 | return false; |
829 | } | 829 | } |
830 | 830 | ||
831 | if (node->hole_follows && drm_mm_hole_node_end(node) < end) { | 831 | if (drm_mm_hole_follows(node) && |
832 | drm_mm_hole_node_end(node) < end) { | ||
832 | pr_err("node %d is followed by a hole!\n", n); | 833 | pr_err("node %d is followed by a hole!\n", n); |
833 | return false; | 834 | return false; |
834 | } | 835 | } |
@@ -1337,11 +1338,12 @@ static int evict_something(struct drm_mm *mm, | |||
1337 | err = -EINVAL; | 1338 | err = -EINVAL; |
1338 | } | 1339 | } |
1339 | 1340 | ||
1340 | if (!assert_node(&tmp, mm, size, alignment, 0) || tmp.hole_follows) { | 1341 | if (!assert_node(&tmp, mm, size, alignment, 0) || |
1342 | drm_mm_hole_follows(&tmp)) { | ||
1341 | pr_err("Inserted did not fill the eviction hole: size=%lld [%d], align=%d [rem=%lld], start=%llx, hole-follows?=%d\n", | 1343 | pr_err("Inserted did not fill the eviction hole: size=%lld [%d], align=%d [rem=%lld], start=%llx, hole-follows?=%d\n", |
1342 | tmp.size, size, | 1344 | tmp.size, size, |
1343 | alignment, misalignment(&tmp, alignment), | 1345 | alignment, misalignment(&tmp, alignment), |
1344 | tmp.start, tmp.hole_follows); | 1346 | tmp.start, drm_mm_hole_follows(&tmp)); |
1345 | err = -EINVAL; | 1347 | err = -EINVAL; |
1346 | } | 1348 | } |
1347 | 1349 | ||
@@ -1618,7 +1620,7 @@ static int igt_topdown(void *ignored) | |||
1618 | goto out; | 1620 | goto out; |
1619 | } | 1621 | } |
1620 | 1622 | ||
1621 | if (nodes[n].hole_follows) { | 1623 | if (drm_mm_hole_follows(&nodes[n])) { |
1622 | pr_err("hole after topdown insert %d, start=%llx\n, size=%u", | 1624 | pr_err("hole after topdown insert %d, start=%llx\n, size=%u", |
1623 | n, nodes[n].start, size); | 1625 | n, nodes[n].start, size); |
1624 | goto out; | 1626 | goto out; |
@@ -1650,7 +1652,7 @@ static int igt_topdown(void *ignored) | |||
1650 | goto out; | 1652 | goto out; |
1651 | } | 1653 | } |
1652 | 1654 | ||
1653 | if (node->hole_follows) { | 1655 | if (drm_mm_hole_follows(node)) { |
1654 | pr_err("hole after topdown insert %d/%d, start=%llx\n", | 1656 | pr_err("hole after topdown insert %d/%d, start=%llx\n", |
1655 | m, n, node->start); | 1657 | m, n, node->start); |
1656 | goto out; | 1658 | goto out; |
@@ -1705,7 +1707,7 @@ static void separate_adjacent_colors(const struct drm_mm_node *node, | |||
1705 | 1707 | ||
1706 | static bool colors_abutt(const struct drm_mm_node *node) | 1708 | static bool colors_abutt(const struct drm_mm_node *node) |
1707 | { | 1709 | { |
1708 | if (!node->hole_follows && | 1710 | if (!drm_mm_hole_follows(node) && |
1709 | list_next_entry(node, node_list)->allocated) { | 1711 | list_next_entry(node, node_list)->allocated) { |
1710 | pr_err("colors abutt; %ld [%llx + %llx] is next to %ld [%llx + %llx]!\n", | 1712 | pr_err("colors abutt; %ld [%llx + %llx] is next to %ld [%llx + %llx]!\n", |
1711 | node->color, node->start, node->size, | 1713 | node->color, node->start, node->size, |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index aed93cbc4bde..7da7a171d6d5 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
@@ -155,6 +155,22 @@ static inline bool drm_mm_initialized(const struct drm_mm *mm) | |||
155 | return mm->hole_stack.next; | 155 | return mm->hole_stack.next; |
156 | } | 156 | } |
157 | 157 | ||
158 | /** | ||
159 | * drm_mm_hole_follows - checks whether a hole follows this node | ||
160 | * @node: drm_mm_node to check | ||
161 | * | ||
162 | * Holes are embedded into the drm_mm using the tail of a drm_mm_node. | ||
163 | * If you wish to know whether a hole follows this particular node, | ||
164 | * query this function. | ||
165 | * | ||
166 | * Returns: | ||
167 | * True if a hole follows the @node. | ||
168 | */ | ||
169 | static inline bool drm_mm_hole_follows(const struct drm_mm_node *node) | ||
170 | { | ||
171 | return node->hole_follows; | ||
172 | } | ||
173 | |||
158 | static inline u64 __drm_mm_hole_node_start(const struct drm_mm_node *hole_node) | 174 | static inline u64 __drm_mm_hole_node_start(const struct drm_mm_node *hole_node) |
159 | { | 175 | { |
160 | return hole_node->start + hole_node->size; | 176 | return hole_node->start + hole_node->size; |
@@ -166,14 +182,14 @@ static inline u64 __drm_mm_hole_node_start(const struct drm_mm_node *hole_node) | |||
166 | * | 182 | * |
167 | * This is useful for driver-specific debug dumpers. Otherwise drivers should | 183 | * This is useful for driver-specific debug dumpers. Otherwise drivers should |
168 | * not inspect holes themselves. Drivers must check first whether a hole indeed | 184 | * not inspect holes themselves. Drivers must check first whether a hole indeed |
169 | * follows by looking at node->hole_follows. | 185 | * follows by looking at drm_mm_hole_follows() |
170 | * | 186 | * |
171 | * Returns: | 187 | * Returns: |
172 | * Start of the subsequent hole. | 188 | * Start of the subsequent hole. |
173 | */ | 189 | */ |
174 | static inline u64 drm_mm_hole_node_start(const struct drm_mm_node *hole_node) | 190 | static inline u64 drm_mm_hole_node_start(const struct drm_mm_node *hole_node) |
175 | { | 191 | { |
176 | DRM_MM_BUG_ON(!hole_node->hole_follows); | 192 | DRM_MM_BUG_ON(!drm_mm_hole_follows(hole_node)); |
177 | return __drm_mm_hole_node_start(hole_node); | 193 | return __drm_mm_hole_node_start(hole_node); |
178 | } | 194 | } |
179 | 195 | ||
@@ -188,7 +204,7 @@ static inline u64 __drm_mm_hole_node_end(const struct drm_mm_node *hole_node) | |||
188 | * | 204 | * |
189 | * This is useful for driver-specific debug dumpers. Otherwise drivers should | 205 | * This is useful for driver-specific debug dumpers. Otherwise drivers should |
190 | * not inspect holes themselves. Drivers must check first whether a hole indeed | 206 | * not inspect holes themselves. Drivers must check first whether a hole indeed |
191 | * follows by looking at node->hole_follows. | 207 | * follows by looking at drm_mm_hole_follows(). |
192 | * | 208 | * |
193 | * Returns: | 209 | * Returns: |
194 | * End of the subsequent hole. | 210 | * End of the subsequent hole. |