Skip to content

Commit

Permalink
drm: Fix application of color vs range restriction when scanning drm_mm
Browse files Browse the repository at this point in the history
The range restriction should be applied after the color adjustment, or
else we may inadvertently apply the color adjustment to the restricted
hole (and not against its neighbours).

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20161222083641.2691-30-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson authored and Daniel Vetter committed Dec 28, 2016
1 parent 2c4b389 commit 268c649
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions drivers/gpu/drm/drm_mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -772,6 +772,7 @@ bool drm_mm_scan_add_block(struct drm_mm_scan *scan,
struct drm_mm *mm = scan->mm;
struct drm_mm_node *hole;
u64 hole_start, hole_end;
u64 col_start, col_end;
u64 adj_start, adj_end;

DRM_MM_BUG_ON(node->mm != mm);
Expand All @@ -789,14 +790,16 @@ bool drm_mm_scan_add_block(struct drm_mm_scan *scan,
node->node_list.next = &scan->prev_scanned_node->node_list;
scan->prev_scanned_node = node;

hole_start = drm_mm_hole_node_start(hole);
hole_end = drm_mm_hole_node_end(hole);

adj_start = max(hole_start, scan->range_start);
adj_end = min(hole_end, scan->range_end);
hole_start = __drm_mm_hole_node_start(hole);
hole_end = __drm_mm_hole_node_end(hole);

col_start = hole_start;
col_end = hole_end;
if (mm->color_adjust)
mm->color_adjust(hole, scan->color, &adj_start, &adj_end);
mm->color_adjust(hole, scan->color, &col_start, &col_end);

adj_start = max(col_start, scan->range_start);
adj_end = min(col_end, scan->range_end);

if (check_free_hole(adj_start, adj_end,
scan->size, scan->alignment)) {
Expand Down

0 comments on commit 268c649

Please sign in to comment.