浏览代码

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
Chris Wilson 8 年之前
父节点
当前提交
9a956b1548
共有 2 个文件被更改,包括 9 次插入1 次删除
  1. 8 1
      drivers/gpu/drm/drm_mm.c
  2. 1 0
      include/drm/drm_mm.h

+ 8 - 1
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;
 	scan->mm = mm;
 
 
+	if (alignment <= 1)
+		alignment = 0;
+
 	scan->color = color;
 	scan->color = color;
 	scan->alignment = alignment;
 	scan->alignment = alignment;
+	scan->remainder_mask = is_power_of_2(alignment) ? alignment - 1 : 0;
 	scan->size = size;
 	scan->size = size;
 	scan->flags = flags;
 	scan->flags = flags;
 
 
@@ -811,7 +815,10 @@ bool drm_mm_scan_add_block(struct drm_mm_scan *scan,
 	if (scan->alignment) {
 	if (scan->alignment) {
 		u64 rem;
 		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) {
 		if (rem) {
 			adj_start -= rem;
 			adj_start -= rem;
 			if (scan->flags != DRM_MM_CREATE_TOP)
 			if (scan->flags != DRM_MM_CREATE_TOP)

+ 1 - 0
include/drm/drm_mm.h

@@ -110,6 +110,7 @@ struct drm_mm_scan {
 
 
 	u64 size;
 	u64 size;
 	u64 alignment;
 	u64 alignment;
+	u64 remainder_mask;
 
 
 	u64 range_start;
 	u64 range_start;
 	u64 range_end;
 	u64 range_end;