Commit 28e1a8f4 authored by Jinyu Tang's avatar Jinyu Tang Committed by Mike Rapoport
Browse files

memblock: avoid some repeat when add new range



The worst case is that the new memory range overlaps all existing
regions, which requires type->cnt + 1 empty struct memblock_region slots in
the type->regions array.
So if type->cnt + 1 + type->cnt is less than type->max, we can insert
regions directly rather than calculate the needed amount before the
insertion.
And becase of merge operation in the end of function, tpye->cnt will
increase slowly for many cases.

This change allows to avoid unnecessary repeat of memblock ranges traversal
for many cases when adding new memory range.

Signed-off-by: default avatarJinyu Tang <tjytimi@163.com>
[rppt: massaged comment and changelog text]
Signed-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
parent 03c765b0
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -593,6 +593,17 @@ static int __init_memblock memblock_add_range(struct memblock_type *type,
		type->total_size = size;
		return 0;
	}

	/*
	 * The worst case is when new range overlaps all existing regions,
	 * then we'll need type->cnt + 1 empty regions in @type. So if
	 * type->cnt * 2 + 1 is less than type->max, we know
	 * that there is enough empty regions in @type, and we can insert
	 * regions directly.
	 */
	if (type->cnt * 2 + 1 < type->max)
		insert = true;

repeat:
	/*
	 * The following is executed twice.  Once with %false @insert and