memblock: avoid some repeat when add new range
authorJinyu Tang <tjytimi@163.com>
Wed, 15 Jun 2022 09:40:15 +0000 (17:40 +0800)
committerMike Rapoport <rppt@linux.ibm.com>
Thu, 30 Jun 2022 08:55:00 +0000 (11:55 +0300)
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: Jinyu Tang <tjytimi@163.com>
[rppt: massaged comment and changelog text]
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
mm/memblock.c

index e4f03a6e8e56e751a807df41bff38e9aabc83ce2..16f006521afad8a82ddba134a4f0678a43aaa337 100644 (file)
@@ -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