diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2016-12-22 03:36:34 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-12-28 05:51:52 -0500 |
commit | 9a956b1548794033d5b893d6d6fcc00b197cfc9b (patch) | |
tree | 8b8cfbe1b61e48ac2a8a7aca0620a16bc29fcd15 | |
parent | 0b04d474a611e2831d142e246422a03a10998ae1 (diff) |
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 <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-32-chris@chris-wilson.co.uk
-rw-r--r-- | drivers/gpu/drm/drm_mm.c | 9 | ||||
-rw-r--r-- | include/drm/drm_mm.h | 1 |
2 files changed, 9 insertions, 1 deletions
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, | |||
742 | 742 | ||
743 | scan->mm = mm; | 743 | scan->mm = mm; |
744 | 744 | ||
745 | if (alignment <= 1) | ||
746 | alignment = 0; | ||
747 | |||
745 | scan->color = color; | 748 | scan->color = color; |
746 | scan->alignment = alignment; | 749 | scan->alignment = alignment; |
750 | scan->remainder_mask = is_power_of_2(alignment) ? alignment - 1 : 0; | ||
747 | scan->size = size; | 751 | scan->size = size; |
748 | scan->flags = flags; | 752 | scan->flags = flags; |
749 | 753 | ||
@@ -811,7 +815,10 @@ bool drm_mm_scan_add_block(struct drm_mm_scan *scan, | |||
811 | if (scan->alignment) { | 815 | if (scan->alignment) { |
812 | u64 rem; | 816 | u64 rem; |
813 | 817 | ||
814 | div64_u64_rem(adj_start, scan->alignment, &rem); | 818 | if (likely(scan->remainder_mask)) |
819 | rem = adj_start & scan->remainder_mask; | ||
820 | else | ||
821 | div64_u64_rem(adj_start, scan->alignment, &rem); | ||
815 | if (rem) { | 822 | if (rem) { |
816 | adj_start -= rem; | 823 | adj_start -= rem; |
817 | if (scan->flags != DRM_MM_CREATE_TOP) | 824 | 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 { | |||
110 | 110 | ||
111 | u64 size; | 111 | u64 size; |
112 | u64 alignment; | 112 | u64 alignment; |
113 | u64 remainder_mask; | ||
113 | 114 | ||
114 | u64 range_start; | 115 | u64 range_start; |
115 | u64 range_end; | 116 | u64 range_end; |