1 // SPDX-License-Identifier: GPL-2.0-or-later
3 #include <linux/memblock.h>
6 #define EXPECTED_MEMBLOCK_REGIONS 128
7 #define FUNC_ADD "memblock_add"
8 #define FUNC_RESERVE "memblock_reserve"
9 #define FUNC_REMOVE "memblock_remove"
10 #define FUNC_FREE "memblock_free"
12 static int memblock_initialization_check(void)
16 ASSERT_NE(memblock.memory.regions, NULL);
17 ASSERT_EQ(memblock.memory.cnt, 1);
18 ASSERT_EQ(memblock.memory.max, EXPECTED_MEMBLOCK_REGIONS);
19 ASSERT_EQ(strcmp(memblock.memory.name, "memory"), 0);
21 ASSERT_NE(memblock.reserved.regions, NULL);
22 ASSERT_EQ(memblock.reserved.cnt, 1);
23 ASSERT_EQ(memblock.memory.max, EXPECTED_MEMBLOCK_REGIONS);
24 ASSERT_EQ(strcmp(memblock.reserved.name, "reserved"), 0);
26 ASSERT_EQ(memblock.bottom_up, false);
27 ASSERT_EQ(memblock.current_limit, MEMBLOCK_ALLOC_ANYWHERE);
35 * A simple test that adds a memory block of a specified base address
36 * and size to the collection of available memory regions (memblock.memory).
37 * Expect to create a new entry. The region counter and total memory get
40 static int memblock_add_simple_check(void)
42 struct memblock_region *rgn;
44 rgn = &memblock.memory.regions[0];
53 reset_memblock_regions();
54 memblock_add(r.base, r.size);
56 ASSERT_EQ(rgn->base, r.base);
57 ASSERT_EQ(rgn->size, r.size);
59 ASSERT_EQ(memblock.memory.cnt, 1);
60 ASSERT_EQ(memblock.memory.total_size, r.size);
68 * A simple test that adds a memory block of a specified base address, size,
69 * NUMA node and memory flags to the collection of available memory regions.
70 * Expect to create a new entry. The region counter and total memory get
73 static int memblock_add_node_simple_check(void)
75 struct memblock_region *rgn;
77 rgn = &memblock.memory.regions[0];
86 reset_memblock_regions();
87 memblock_add_node(r.base, r.size, 1, MEMBLOCK_HOTPLUG);
89 ASSERT_EQ(rgn->base, r.base);
90 ASSERT_EQ(rgn->size, r.size);
92 ASSERT_EQ(rgn->nid, 1);
94 ASSERT_EQ(rgn->flags, MEMBLOCK_HOTPLUG);
96 ASSERT_EQ(memblock.memory.cnt, 1);
97 ASSERT_EQ(memblock.memory.total_size, r.size);
105 * A test that tries to add two memory blocks that don't overlap with one
108 * | +--------+ +--------+ |
110 * +--------+--------+--------+--------+--+
112 * Expect to add two correctly initialized entries to the collection of
113 * available memory regions (memblock.memory). The total size and
114 * region counter fields get updated.
116 static int memblock_add_disjoint_check(void)
118 struct memblock_region *rgn1, *rgn2;
120 rgn1 = &memblock.memory.regions[0];
121 rgn2 = &memblock.memory.regions[1];
128 .base = SZ_1G + SZ_16K,
134 reset_memblock_regions();
135 memblock_add(r1.base, r1.size);
136 memblock_add(r2.base, r2.size);
138 ASSERT_EQ(rgn1->base, r1.base);
139 ASSERT_EQ(rgn1->size, r1.size);
141 ASSERT_EQ(rgn2->base, r2.base);
142 ASSERT_EQ(rgn2->size, r2.size);
144 ASSERT_EQ(memblock.memory.cnt, 2);
145 ASSERT_EQ(memblock.memory.total_size, r1.size + r2.size);
153 * A test that tries to add two memory blocks r1 and r2, where r2 overlaps
154 * with the beginning of r1 (that is r1.base < r2.base + r2.size):
156 * | +----+----+------------+ |
158 * +----+----+----+------------+----------+
165 * Expect to merge the two entries into one region that starts at r2.base
166 * and has size of two regions minus their intersection. The total size of
167 * the available memory is updated, and the region counter stays the same.
169 static int memblock_add_overlap_top_check(void)
171 struct memblock_region *rgn;
172 phys_addr_t total_size;
174 rgn = &memblock.memory.regions[0];
187 total_size = (r1.base - r2.base) + r1.size;
189 reset_memblock_regions();
190 memblock_add(r1.base, r1.size);
191 memblock_add(r2.base, r2.size);
193 ASSERT_EQ(rgn->base, r2.base);
194 ASSERT_EQ(rgn->size, total_size);
196 ASSERT_EQ(memblock.memory.cnt, 1);
197 ASSERT_EQ(memblock.memory.total_size, total_size);
205 * A test that tries to add two memory blocks r1 and r2, where r2 overlaps
206 * with the end of r1 (that is r2.base < r1.base + r1.size):
208 * | +--+------+----------+ |
210 * +--+--+------+----------+--------------+
217 * Expect to merge the two entries into one region that starts at r1.base
218 * and has size of two regions minus their intersection. The total size of
219 * the available memory is updated, and the region counter stays the same.
221 static int memblock_add_overlap_bottom_check(void)
223 struct memblock_region *rgn;
224 phys_addr_t total_size;
226 rgn = &memblock.memory.regions[0];
239 total_size = (r2.base - r1.base) + r2.size;
241 reset_memblock_regions();
242 memblock_add(r1.base, r1.size);
243 memblock_add(r2.base, r2.size);
245 ASSERT_EQ(rgn->base, r1.base);
246 ASSERT_EQ(rgn->size, total_size);
248 ASSERT_EQ(memblock.memory.cnt, 1);
249 ASSERT_EQ(memblock.memory.total_size, total_size);
257 * A test that tries to add two memory blocks r1 and r2, where r2 is
258 * within the range of r1 (that is r1.base < r2.base &&
259 * r2.base + r2.size < r1.base + r1.size):
261 * | +-------+--+-----------------------+
263 * +---+-------+--+-----------------------+
268 * Expect to merge two entries into one region that stays the same.
269 * The counter and total size of available memory are not updated.
271 static int memblock_add_within_check(void)
273 struct memblock_region *rgn;
275 rgn = &memblock.memory.regions[0];
288 reset_memblock_regions();
289 memblock_add(r1.base, r1.size);
290 memblock_add(r2.base, r2.size);
292 ASSERT_EQ(rgn->base, r1.base);
293 ASSERT_EQ(rgn->size, r1.size);
295 ASSERT_EQ(memblock.memory.cnt, 1);
296 ASSERT_EQ(memblock.memory.total_size, r1.size);
304 * A simple test that tries to add the same memory block twice. Expect
305 * the counter and total size of available memory to not be updated.
307 static int memblock_add_twice_check(void)
316 reset_memblock_regions();
318 memblock_add(r.base, r.size);
319 memblock_add(r.base, r.size);
321 ASSERT_EQ(memblock.memory.cnt, 1);
322 ASSERT_EQ(memblock.memory.total_size, r.size);
329 static int memblock_add_checks(void)
332 prefix_push(FUNC_ADD);
333 test_print("Running %s tests...\n", FUNC_ADD);
335 memblock_add_simple_check();
336 memblock_add_node_simple_check();
337 memblock_add_disjoint_check();
338 memblock_add_overlap_top_check();
339 memblock_add_overlap_bottom_check();
340 memblock_add_within_check();
341 memblock_add_twice_check();
349 * A simple test that marks a memory block of a specified base address
350 * and size as reserved and to the collection of reserved memory regions
351 * (memblock.reserved). Expect to create a new entry. The region counter
352 * and total memory size are updated.
354 static int memblock_reserve_simple_check(void)
356 struct memblock_region *rgn;
358 rgn = &memblock.reserved.regions[0];
367 reset_memblock_regions();
368 memblock_reserve(r.base, r.size);
370 ASSERT_EQ(rgn->base, r.base);
371 ASSERT_EQ(rgn->size, r.size);
379 * A test that tries to mark two memory blocks that don't overlap as reserved:
381 * | +--+ +----------------+ |
383 * +--------+--+------+----------------+--+
385 * Expect to add two entries to the collection of reserved memory regions
386 * (memblock.reserved). The total size and region counter for
387 * memblock.reserved are updated.
389 static int memblock_reserve_disjoint_check(void)
391 struct memblock_region *rgn1, *rgn2;
393 rgn1 = &memblock.reserved.regions[0];
394 rgn2 = &memblock.reserved.regions[1];
407 reset_memblock_regions();
408 memblock_reserve(r1.base, r1.size);
409 memblock_reserve(r2.base, r2.size);
411 ASSERT_EQ(rgn1->base, r1.base);
412 ASSERT_EQ(rgn1->size, r1.size);
414 ASSERT_EQ(rgn2->base, r2.base);
415 ASSERT_EQ(rgn2->size, r2.size);
417 ASSERT_EQ(memblock.reserved.cnt, 2);
418 ASSERT_EQ(memblock.reserved.total_size, r1.size + r2.size);
426 * A test that tries to mark two memory blocks r1 and r2 as reserved,
427 * where r2 overlaps with the beginning of r1 (that is
428 * r1.base < r2.base + r2.size):
430 * | +--------------+--+--------------+ |
432 * +--+--------------+--+--------------+--+
439 * Expect to merge two entries into one region that starts at r2.base and
440 * has size of two regions minus their intersection. The total size of the
441 * reserved memory is updated, and the region counter is not updated.
443 static int memblock_reserve_overlap_top_check(void)
445 struct memblock_region *rgn;
446 phys_addr_t total_size;
448 rgn = &memblock.reserved.regions[0];
461 total_size = (r1.base - r2.base) + r1.size;
463 reset_memblock_regions();
464 memblock_reserve(r1.base, r1.size);
465 memblock_reserve(r2.base, r2.size);
467 ASSERT_EQ(rgn->base, r2.base);
468 ASSERT_EQ(rgn->size, total_size);
470 ASSERT_EQ(memblock.reserved.cnt, 1);
471 ASSERT_EQ(memblock.reserved.total_size, total_size);
479 * A test that tries to mark two memory blocks r1 and r2 as reserved,
480 * where r2 overlaps with the end of r1 (that is
481 * r2.base < r1.base + r1.size):
483 * | +--------------+--+--------------+ |
485 * +--+--------------+--+--------------+--+
492 * Expect to merge two entries into one region that starts at r1.base and
493 * has size of two regions minus their intersection. The total size of the
494 * reserved memory is updated, and the region counter is not updated.
496 static int memblock_reserve_overlap_bottom_check(void)
498 struct memblock_region *rgn;
499 phys_addr_t total_size;
501 rgn = &memblock.reserved.regions[0];
514 total_size = (r2.base - r1.base) + r2.size;
516 reset_memblock_regions();
517 memblock_reserve(r1.base, r1.size);
518 memblock_reserve(r2.base, r2.size);
520 ASSERT_EQ(rgn->base, r1.base);
521 ASSERT_EQ(rgn->size, total_size);
523 ASSERT_EQ(memblock.reserved.cnt, 1);
524 ASSERT_EQ(memblock.reserved.total_size, total_size);
532 * A test that tries to mark two memory blocks r1 and r2 as reserved,
533 * where r2 is within the range of r1 (that is
534 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
536 * | +-----+--+---------------------------|
538 * +-+-----+--+---------------------------+
545 * Expect to merge two entries into one region that stays the same. The
546 * counter and total size of available memory are not updated.
548 static int memblock_reserve_within_check(void)
550 struct memblock_region *rgn;
552 rgn = &memblock.reserved.regions[0];
565 reset_memblock_regions();
566 memblock_reserve(r1.base, r1.size);
567 memblock_reserve(r2.base, r2.size);
569 ASSERT_EQ(rgn->base, r1.base);
570 ASSERT_EQ(rgn->size, r1.size);
572 ASSERT_EQ(memblock.reserved.cnt, 1);
573 ASSERT_EQ(memblock.reserved.total_size, r1.size);
581 * A simple test that tries to reserve the same memory block twice.
582 * Expect the region counter and total size of reserved memory to not
585 static int memblock_reserve_twice_check(void)
594 reset_memblock_regions();
596 memblock_reserve(r.base, r.size);
597 memblock_reserve(r.base, r.size);
599 ASSERT_EQ(memblock.reserved.cnt, 1);
600 ASSERT_EQ(memblock.reserved.total_size, r.size);
607 static int memblock_reserve_checks(void)
610 prefix_push(FUNC_RESERVE);
611 test_print("Running %s tests...\n", FUNC_RESERVE);
613 memblock_reserve_simple_check();
614 memblock_reserve_disjoint_check();
615 memblock_reserve_overlap_top_check();
616 memblock_reserve_overlap_bottom_check();
617 memblock_reserve_within_check();
618 memblock_reserve_twice_check();
626 * A simple test that tries to remove a region r1 from the array of
627 * available memory regions. By "removing" a region we mean overwriting it
628 * with the next region r2 in memblock.memory:
630 * | ...... +----------------+ |
632 * +--+----+----------+----------------+--+
637 * Expect to add two memory blocks r1 and r2 and then remove r1 so that
638 * r2 is the first available region. The region counter and total size
641 static int memblock_remove_simple_check(void)
643 struct memblock_region *rgn;
645 rgn = &memblock.memory.regions[0];
658 reset_memblock_regions();
659 memblock_add(r1.base, r1.size);
660 memblock_add(r2.base, r2.size);
661 memblock_remove(r1.base, r1.size);
663 ASSERT_EQ(rgn->base, r2.base);
664 ASSERT_EQ(rgn->size, r2.size);
666 ASSERT_EQ(memblock.memory.cnt, 1);
667 ASSERT_EQ(memblock.memory.total_size, r2.size);
675 * A test that tries to remove a region r2 that was not registered as
676 * available memory (i.e. has no corresponding entry in memblock.memory):
683 * +--+----+------------------------------+
688 * Expect the array, regions counter and total size to not be modified.
690 static int memblock_remove_absent_check(void)
692 struct memblock_region *rgn;
694 rgn = &memblock.memory.regions[0];
707 reset_memblock_regions();
708 memblock_add(r1.base, r1.size);
709 memblock_remove(r2.base, r2.size);
711 ASSERT_EQ(rgn->base, r1.base);
712 ASSERT_EQ(rgn->size, r1.size);
714 ASSERT_EQ(memblock.memory.cnt, 1);
715 ASSERT_EQ(memblock.memory.total_size, r1.size);
723 * A test that tries to remove a region r2 that overlaps with the
724 * beginning of the already existing entry r1
725 * (that is r1.base < r2.base + r2.size):
727 * +-----------------+
729 * +-----------------+
730 * | .........+--------+ |
732 * +-----------------+--------+--------+--+
738 * Expect that only the intersection of both regions is removed from the
739 * available memory pool. The regions counter and total size are updated.
741 static int memblock_remove_overlap_top_check(void)
743 struct memblock_region *rgn;
744 phys_addr_t r1_end, r2_end, total_size;
746 rgn = &memblock.memory.regions[0];
759 r1_end = r1.base + r1.size;
760 r2_end = r2.base + r2.size;
761 total_size = r1_end - r2_end;
763 reset_memblock_regions();
764 memblock_add(r1.base, r1.size);
765 memblock_remove(r2.base, r2.size);
767 ASSERT_EQ(rgn->base, r1.base + r2.base);
768 ASSERT_EQ(rgn->size, total_size);
770 ASSERT_EQ(memblock.memory.cnt, 1);
771 ASSERT_EQ(memblock.memory.total_size, total_size);
779 * A test that tries to remove a region r2 that overlaps with the end of
780 * the already existing region r1 (that is r2.base < r1.base + r1.size):
782 * +--------------------------------+
784 * +--------------------------------+
787 * +-+---+----+---------------------------+
792 * Expect that only the intersection of both regions is removed from the
793 * available memory pool. The regions counter and total size are updated.
795 static int memblock_remove_overlap_bottom_check(void)
797 struct memblock_region *rgn;
798 phys_addr_t total_size;
800 rgn = &memblock.memory.regions[0];
813 total_size = r2.base - r1.base;
815 reset_memblock_regions();
816 memblock_add(r1.base, r1.size);
817 memblock_remove(r2.base, r2.size);
819 ASSERT_EQ(rgn->base, r1.base);
820 ASSERT_EQ(rgn->size, total_size);
822 ASSERT_EQ(memblock.memory.cnt, 1);
823 ASSERT_EQ(memblock.memory.total_size, total_size);
831 * A test that tries to remove a region r2 that is within the range of
832 * the already existing entry r1 (that is
833 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
838 * | +-------------+....+---------------+ |
839 * | | rgn1 | r1 | rgn2 | |
840 * +-+-------------+----+---------------+-+
845 * Expect that the region is split into two - one that ends at r2.base and
846 * another that starts at r2.base + r2.size, with appropriate sizes. The
847 * region counter and total size are updated.
849 static int memblock_remove_within_check(void)
851 struct memblock_region *rgn1, *rgn2;
852 phys_addr_t r1_size, r2_size, total_size;
854 rgn1 = &memblock.memory.regions[0];
855 rgn2 = &memblock.memory.regions[1];
868 r1_size = r2.base - r1.base;
869 r2_size = (r1.base + r1.size) - (r2.base + r2.size);
870 total_size = r1_size + r2_size;
872 reset_memblock_regions();
873 memblock_add(r1.base, r1.size);
874 memblock_remove(r2.base, r2.size);
876 ASSERT_EQ(rgn1->base, r1.base);
877 ASSERT_EQ(rgn1->size, r1_size);
879 ASSERT_EQ(rgn2->base, r2.base + r2.size);
880 ASSERT_EQ(rgn2->size, r2_size);
882 ASSERT_EQ(memblock.memory.cnt, 2);
883 ASSERT_EQ(memblock.memory.total_size, total_size);
890 static int memblock_remove_checks(void)
893 prefix_push(FUNC_REMOVE);
894 test_print("Running %s tests...\n", FUNC_REMOVE);
896 memblock_remove_simple_check();
897 memblock_remove_absent_check();
898 memblock_remove_overlap_top_check();
899 memblock_remove_overlap_bottom_check();
900 memblock_remove_within_check();
908 * A simple test that tries to free a memory block r1 that was marked
909 * earlier as reserved. By "freeing" a region we mean overwriting it with
910 * the next entry r2 in memblock.reserved:
914 * +--------------+----+-----------+----+-+
919 * Expect to reserve two memory regions and then erase r1 region with the
920 * value of r2. The region counter and total size are updated.
922 static int memblock_free_simple_check(void)
924 struct memblock_region *rgn;
926 rgn = &memblock.reserved.regions[0];
939 reset_memblock_regions();
940 memblock_reserve(r1.base, r1.size);
941 memblock_reserve(r2.base, r2.size);
942 memblock_free((void *)r1.base, r1.size);
944 ASSERT_EQ(rgn->base, r2.base);
945 ASSERT_EQ(rgn->size, r2.size);
947 ASSERT_EQ(memblock.reserved.cnt, 1);
948 ASSERT_EQ(memblock.reserved.total_size, r2.size);
956 * A test that tries to free a region r2 that was not marked as reserved
957 * (i.e. has no corresponding entry in memblock.reserved):
964 * +--+----+------------------------------+
969 * The array, regions counter and total size are not modified.
971 static int memblock_free_absent_check(void)
973 struct memblock_region *rgn;
975 rgn = &memblock.reserved.regions[0];
988 reset_memblock_regions();
989 memblock_reserve(r1.base, r1.size);
990 memblock_free((void *)r2.base, r2.size);
992 ASSERT_EQ(rgn->base, r1.base);
993 ASSERT_EQ(rgn->size, r1.size);
995 ASSERT_EQ(memblock.reserved.cnt, 1);
996 ASSERT_EQ(memblock.reserved.total_size, r1.size);
1004 * A test that tries to free a region r2 that overlaps with the beginning
1005 * of the already existing entry r1 (that is r1.base < r2.base + r2.size):
1010 * | ...+--------------+ |
1012 * +----+--+--------------+---------------+
1019 * Expect that only the intersection of both regions is freed. The
1020 * regions counter and total size are updated.
1022 static int memblock_free_overlap_top_check(void)
1024 struct memblock_region *rgn;
1025 phys_addr_t total_size;
1027 rgn = &memblock.reserved.regions[0];
1029 struct region r1 = {
1033 struct region r2 = {
1040 total_size = (r1.size + r1.base) - (r2.base + r2.size);
1042 reset_memblock_regions();
1043 memblock_reserve(r1.base, r1.size);
1044 memblock_free((void *)r2.base, r2.size);
1046 ASSERT_EQ(rgn->base, r2.base + r2.size);
1047 ASSERT_EQ(rgn->size, total_size);
1049 ASSERT_EQ(memblock.reserved.cnt, 1);
1050 ASSERT_EQ(memblock.reserved.total_size, total_size);
1058 * A test that tries to free a region r2 that overlaps with the end of
1059 * the already existing entry r1 (that is r2.base < r1.base + r1.size):
1061 * +----------------+
1063 * +----------------+
1064 * | +-----------+..... |
1066 * +----+-----------+----+----------------+
1068 * Expect that only the intersection of both regions is freed. The
1069 * regions counter and total size are updated.
1071 static int memblock_free_overlap_bottom_check(void)
1073 struct memblock_region *rgn;
1074 phys_addr_t total_size;
1076 rgn = &memblock.reserved.regions[0];
1078 struct region r1 = {
1082 struct region r2 = {
1089 total_size = r2.base - r1.base;
1091 reset_memblock_regions();
1092 memblock_reserve(r1.base, r1.size);
1093 memblock_free((void *)r2.base, r2.size);
1095 ASSERT_EQ(rgn->base, r1.base);
1096 ASSERT_EQ(rgn->size, total_size);
1098 ASSERT_EQ(memblock.reserved.cnt, 1);
1099 ASSERT_EQ(memblock.reserved.total_size, total_size);
1107 * A test that tries to free a region r2 that is within the range of the
1108 * already existing entry r1 (that is
1109 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
1114 * | +------------+....+---------------+
1115 * | | rgn1 | r1 | rgn2 |
1116 * +----+------------+----+---------------+
1121 * Expect that the region is split into two - one that ends at r2.base and
1122 * another that starts at r2.base + r2.size, with appropriate sizes. The
1123 * region counter and total size fields are updated.
1125 static int memblock_free_within_check(void)
1127 struct memblock_region *rgn1, *rgn2;
1128 phys_addr_t r1_size, r2_size, total_size;
1130 rgn1 = &memblock.reserved.regions[0];
1131 rgn2 = &memblock.reserved.regions[1];
1133 struct region r1 = {
1137 struct region r2 = {
1144 r1_size = r2.base - r1.base;
1145 r2_size = (r1.base + r1.size) - (r2.base + r2.size);
1146 total_size = r1_size + r2_size;
1148 reset_memblock_regions();
1149 memblock_reserve(r1.base, r1.size);
1150 memblock_free((void *)r2.base, r2.size);
1152 ASSERT_EQ(rgn1->base, r1.base);
1153 ASSERT_EQ(rgn1->size, r1_size);
1155 ASSERT_EQ(rgn2->base, r2.base + r2.size);
1156 ASSERT_EQ(rgn2->size, r2_size);
1158 ASSERT_EQ(memblock.reserved.cnt, 2);
1159 ASSERT_EQ(memblock.reserved.total_size, total_size);
1166 static int memblock_free_checks(void)
1169 prefix_push(FUNC_FREE);
1170 test_print("Running %s tests...\n", FUNC_FREE);
1172 memblock_free_simple_check();
1173 memblock_free_absent_check();
1174 memblock_free_overlap_top_check();
1175 memblock_free_overlap_bottom_check();
1176 memblock_free_within_check();
1183 int memblock_basic_checks(void)
1185 memblock_initialization_check();
1186 memblock_add_checks();
1187 memblock_reserve_checks();
1188 memblock_remove_checks();
1189 memblock_free_checks();