From 9a956b1548794033d5b893d6d6fcc00b197cfc9b Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 22 Dec 2016 08:36:34 +0000 Subject: [PATCH] drm: Optimise power-of-two alignments in drm_mm_scan_add_block() For power-of-two alignments, we can avoid the 64bit divide and do a simple bitwise add instead. v2: s/alignment_mask/remainder_mask/ Signed-off-by: Chris Wilson Reviewed-by: Joonas Lahtinen Signed-off-by: Daniel Vetter Link: http://patchwork.freedesktop.org/patch/msgid/20161222083641.2691-32-chris@chris-wilson.co.uk --- drivers/gpu/drm/drm_mm.c | 9 ++++++++- include/drm/drm_mm.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index 189ab84c5a59..0441d84fba74 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c @@ -742,8 +742,12 @@ void drm_mm_scan_init_with_range(struct drm_mm_scan *scan, scan->mm = mm; + if (alignment <= 1) + alignment = 0; + scan->color = color; scan->alignment = alignment; + scan->remainder_mask = is_power_of_2(alignment) ? alignment - 1 : 0; scan->size = size; scan->flags = flags; @@ -811,7 +815,10 @@ bool drm_mm_scan_add_block(struct drm_mm_scan *scan, if (scan->alignment) { u64 rem; - div64_u64_rem(adj_start, scan->alignment, &rem); + if (likely(scan->remainder_mask)) + rem = adj_start & scan->remainder_mask; + else + div64_u64_rem(adj_start, scan->alignment, &rem); if (rem) { adj_start -= rem; if (scan->flags != DRM_MM_CREATE_TOP) diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 606336fc229a..d6701d56ea74 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h @@ -110,6 +110,7 @@ struct drm_mm_scan { u64 size; u64 alignment; + u64 remainder_mask; u64 range_start; u64 range_end; -- 2.20.1