1 // SPDX-License-Identifier: GPL-2.0-or-later 2 #include "basic_api.h" 3 #include <string.h> 4 #include <linux/memblock.h> 5 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" 11 #define FUNC_TRIM "memblock_trim_memory" 12 13 static int memblock_initialization_check(void) 14 { 15 PREFIX_PUSH(); 16 17 ASSERT_NE(memblock.memory.regions, NULL); 18 ASSERT_EQ(memblock.memory.cnt, 1); 19 ASSERT_EQ(memblock.memory.max, EXPECTED_MEMBLOCK_REGIONS); 20 ASSERT_EQ(strcmp(memblock.memory.name, "memory"), 0); 21 22 ASSERT_NE(memblock.reserved.regions, NULL); 23 ASSERT_EQ(memblock.reserved.cnt, 1); 24 ASSERT_EQ(memblock.memory.max, EXPECTED_MEMBLOCK_REGIONS); 25 ASSERT_EQ(strcmp(memblock.reserved.name, "reserved"), 0); 26 27 ASSERT_EQ(memblock.bottom_up, false); 28 ASSERT_EQ(memblock.current_limit, MEMBLOCK_ALLOC_ANYWHERE); 29 30 test_pass_pop(); 31 32 return 0; 33 } 34 35 /* 36 * A simple test that adds a memory block of a specified base address 37 * and size to the collection of available memory regions (memblock.memory). 38 * Expect to create a new entry. The region counter and total memory get 39 * updated. 40 */ 41 static int memblock_add_simple_check(void) 42 { 43 struct memblock_region *rgn; 44 45 rgn = &memblock.memory.regions[0]; 46 47 struct region r = { 48 .base = SZ_1G, 49 .size = SZ_4M 50 }; 51 52 PREFIX_PUSH(); 53 54 reset_memblock_regions(); 55 memblock_add(r.base, r.size); 56 57 ASSERT_EQ(rgn->base, r.base); 58 ASSERT_EQ(rgn->size, r.size); 59 60 ASSERT_EQ(memblock.memory.cnt, 1); 61 ASSERT_EQ(memblock.memory.total_size, r.size); 62 63 test_pass_pop(); 64 65 return 0; 66 } 67 68 /* 69 * A simple test that adds a memory block of a specified base address, size, 70 * NUMA node and memory flags to the collection of available memory regions. 71 * Expect to create a new entry. The region counter and total memory get 72 * updated. 73 */ 74 static int memblock_add_node_simple_check(void) 75 { 76 struct memblock_region *rgn; 77 78 rgn = &memblock.memory.regions[0]; 79 80 struct region r = { 81 .base = SZ_1M, 82 .size = SZ_16M 83 }; 84 85 PREFIX_PUSH(); 86 87 reset_memblock_regions(); 88 memblock_add_node(r.base, r.size, 1, MEMBLOCK_HOTPLUG); 89 90 ASSERT_EQ(rgn->base, r.base); 91 ASSERT_EQ(rgn->size, r.size); 92 #ifdef CONFIG_NUMA 93 ASSERT_EQ(rgn->nid, 1); 94 #endif 95 ASSERT_EQ(rgn->flags, MEMBLOCK_HOTPLUG); 96 97 ASSERT_EQ(memblock.memory.cnt, 1); 98 ASSERT_EQ(memblock.memory.total_size, r.size); 99 100 test_pass_pop(); 101 102 return 0; 103 } 104 105 /* 106 * A test that tries to add two memory blocks that don't overlap with one 107 * another: 108 * 109 * | +--------+ +--------+ | 110 * | | r1 | | r2 | | 111 * +--------+--------+--------+--------+--+ 112 * 113 * Expect to add two correctly initialized entries to the collection of 114 * available memory regions (memblock.memory). The total size and 115 * region counter fields get updated. 116 */ 117 static int memblock_add_disjoint_check(void) 118 { 119 struct memblock_region *rgn1, *rgn2; 120 121 rgn1 = &memblock.memory.regions[0]; 122 rgn2 = &memblock.memory.regions[1]; 123 124 struct region r1 = { 125 .base = SZ_1G, 126 .size = SZ_8K 127 }; 128 struct region r2 = { 129 .base = SZ_1G + SZ_16K, 130 .size = SZ_8K 131 }; 132 133 PREFIX_PUSH(); 134 135 reset_memblock_regions(); 136 memblock_add(r1.base, r1.size); 137 memblock_add(r2.base, r2.size); 138 139 ASSERT_EQ(rgn1->base, r1.base); 140 ASSERT_EQ(rgn1->size, r1.size); 141 142 ASSERT_EQ(rgn2->base, r2.base); 143 ASSERT_EQ(rgn2->size, r2.size); 144 145 ASSERT_EQ(memblock.memory.cnt, 2); 146 ASSERT_EQ(memblock.memory.total_size, r1.size + r2.size); 147 148 test_pass_pop(); 149 150 return 0; 151 } 152 153 /* 154 * A test that tries to add two memory blocks r1 and r2, where r2 overlaps 155 * with the beginning of r1 (that is r1.base < r2.base + r2.size): 156 * 157 * | +----+----+------------+ | 158 * | | |r2 | r1 | | 159 * +----+----+----+------------+----------+ 160 * ^ ^ 161 * | | 162 * | r1.base 163 * | 164 * r2.base 165 * 166 * Expect to merge the two entries into one region that starts at r2.base 167 * and has size of two regions minus their intersection. The total size of 168 * the available memory is updated, and the region counter stays the same. 169 */ 170 static int memblock_add_overlap_top_check(void) 171 { 172 struct memblock_region *rgn; 173 phys_addr_t total_size; 174 175 rgn = &memblock.memory.regions[0]; 176 177 struct region r1 = { 178 .base = SZ_512M, 179 .size = SZ_1G 180 }; 181 struct region r2 = { 182 .base = SZ_256M, 183 .size = SZ_512M 184 }; 185 186 PREFIX_PUSH(); 187 188 total_size = (r1.base - r2.base) + r1.size; 189 190 reset_memblock_regions(); 191 memblock_add(r1.base, r1.size); 192 memblock_add(r2.base, r2.size); 193 194 ASSERT_EQ(rgn->base, r2.base); 195 ASSERT_EQ(rgn->size, total_size); 196 197 ASSERT_EQ(memblock.memory.cnt, 1); 198 ASSERT_EQ(memblock.memory.total_size, total_size); 199 200 test_pass_pop(); 201 202 return 0; 203 } 204 205 /* 206 * A test that tries to add two memory blocks r1 and r2, where r2 overlaps 207 * with the end of r1 (that is r2.base < r1.base + r1.size): 208 * 209 * | +--+------+----------+ | 210 * | | | r1 | r2 | | 211 * +--+--+------+----------+--------------+ 212 * ^ ^ 213 * | | 214 * | r2.base 215 * | 216 * r1.base 217 * 218 * Expect to merge the two entries into one region that starts at r1.base 219 * and has size of two regions minus their intersection. The total size of 220 * the available memory is updated, and the region counter stays the same. 221 */ 222 static int memblock_add_overlap_bottom_check(void) 223 { 224 struct memblock_region *rgn; 225 phys_addr_t total_size; 226 227 rgn = &memblock.memory.regions[0]; 228 229 struct region r1 = { 230 .base = SZ_128M, 231 .size = SZ_512M 232 }; 233 struct region r2 = { 234 .base = SZ_256M, 235 .size = SZ_1G 236 }; 237 238 PREFIX_PUSH(); 239 240 total_size = (r2.base - r1.base) + r2.size; 241 242 reset_memblock_regions(); 243 memblock_add(r1.base, r1.size); 244 memblock_add(r2.base, r2.size); 245 246 ASSERT_EQ(rgn->base, r1.base); 247 ASSERT_EQ(rgn->size, total_size); 248 249 ASSERT_EQ(memblock.memory.cnt, 1); 250 ASSERT_EQ(memblock.memory.total_size, total_size); 251 252 test_pass_pop(); 253 254 return 0; 255 } 256 257 /* 258 * A test that tries to add two memory blocks r1 and r2, where r2 is 259 * within the range of r1 (that is r1.base < r2.base && 260 * r2.base + r2.size < r1.base + r1.size): 261 * 262 * | +-------+--+-----------------------+ 263 * | | |r2| r1 | 264 * +---+-------+--+-----------------------+ 265 * ^ 266 * | 267 * r1.base 268 * 269 * Expect to merge two entries into one region that stays the same. 270 * The counter and total size of available memory are not updated. 271 */ 272 static int memblock_add_within_check(void) 273 { 274 struct memblock_region *rgn; 275 276 rgn = &memblock.memory.regions[0]; 277 278 struct region r1 = { 279 .base = SZ_8M, 280 .size = SZ_32M 281 }; 282 struct region r2 = { 283 .base = SZ_16M, 284 .size = SZ_1M 285 }; 286 287 PREFIX_PUSH(); 288 289 reset_memblock_regions(); 290 memblock_add(r1.base, r1.size); 291 memblock_add(r2.base, r2.size); 292 293 ASSERT_EQ(rgn->base, r1.base); 294 ASSERT_EQ(rgn->size, r1.size); 295 296 ASSERT_EQ(memblock.memory.cnt, 1); 297 ASSERT_EQ(memblock.memory.total_size, r1.size); 298 299 test_pass_pop(); 300 301 return 0; 302 } 303 304 /* 305 * A simple test that tries to add the same memory block twice. Expect 306 * the counter and total size of available memory to not be updated. 307 */ 308 static int memblock_add_twice_check(void) 309 { 310 struct region r = { 311 .base = SZ_16K, 312 .size = SZ_2M 313 }; 314 315 PREFIX_PUSH(); 316 317 reset_memblock_regions(); 318 319 memblock_add(r.base, r.size); 320 memblock_add(r.base, r.size); 321 322 ASSERT_EQ(memblock.memory.cnt, 1); 323 ASSERT_EQ(memblock.memory.total_size, r.size); 324 325 test_pass_pop(); 326 327 return 0; 328 } 329 330 /* 331 * A test that tries to add two memory blocks that don't overlap with one 332 * another and then add a third memory block in the space between the first two: 333 * 334 * | +--------+--------+--------+ | 335 * | | r1 | r3 | r2 | | 336 * +--------+--------+--------+--------+--+ 337 * 338 * Expect to merge the three entries into one region that starts at r1.base 339 * and has size of r1.size + r2.size + r3.size. The region counter and total 340 * size of the available memory are updated. 341 */ 342 static int memblock_add_between_check(void) 343 { 344 struct memblock_region *rgn; 345 phys_addr_t total_size; 346 347 rgn = &memblock.memory.regions[0]; 348 349 struct region r1 = { 350 .base = SZ_1G, 351 .size = SZ_8K 352 }; 353 struct region r2 = { 354 .base = SZ_1G + SZ_16K, 355 .size = SZ_8K 356 }; 357 struct region r3 = { 358 .base = SZ_1G + SZ_8K, 359 .size = SZ_8K 360 }; 361 362 PREFIX_PUSH(); 363 364 total_size = r1.size + r2.size + r3.size; 365 366 reset_memblock_regions(); 367 memblock_add(r1.base, r1.size); 368 memblock_add(r2.base, r2.size); 369 memblock_add(r3.base, r3.size); 370 371 ASSERT_EQ(rgn->base, r1.base); 372 ASSERT_EQ(rgn->size, total_size); 373 374 ASSERT_EQ(memblock.memory.cnt, 1); 375 ASSERT_EQ(memblock.memory.total_size, total_size); 376 377 test_pass_pop(); 378 379 return 0; 380 } 381 382 /* 383 * A simple test that tries to add a memory block r when r extends past 384 * PHYS_ADDR_MAX: 385 * 386 * +--------+ 387 * | r | 388 * +--------+ 389 * | +----+ 390 * | | rgn| 391 * +----------------------------+----+ 392 * 393 * Expect to add a memory block of size PHYS_ADDR_MAX - r.base. Expect the 394 * total size of available memory and the counter to be updated. 395 */ 396 static int memblock_add_near_max_check(void) 397 { 398 struct memblock_region *rgn; 399 phys_addr_t total_size; 400 401 rgn = &memblock.memory.regions[0]; 402 403 struct region r = { 404 .base = PHYS_ADDR_MAX - SZ_1M, 405 .size = SZ_2M 406 }; 407 408 PREFIX_PUSH(); 409 410 total_size = PHYS_ADDR_MAX - r.base; 411 412 reset_memblock_regions(); 413 memblock_add(r.base, r.size); 414 415 ASSERT_EQ(rgn->base, r.base); 416 ASSERT_EQ(rgn->size, total_size); 417 418 ASSERT_EQ(memblock.memory.cnt, 1); 419 ASSERT_EQ(memblock.memory.total_size, total_size); 420 421 test_pass_pop(); 422 423 return 0; 424 } 425 426 /* 427 * A test that trying to add the 129th memory block. 428 * Expect to trigger memblock_double_array() to double the 429 * memblock.memory.max, find a new valid memory as 430 * memory.regions. 431 */ 432 static int memblock_add_many_check(void) 433 { 434 int i; 435 void *orig_region; 436 struct region r = { 437 .base = SZ_16K, 438 .size = SZ_16K, 439 }; 440 phys_addr_t new_memory_regions_size; 441 phys_addr_t base, size = SZ_64; 442 phys_addr_t gap_size = SZ_64; 443 444 PREFIX_PUSH(); 445 446 reset_memblock_regions(); 447 memblock_allow_resize(); 448 449 dummy_physical_memory_init(); 450 /* 451 * We allocated enough memory by using dummy_physical_memory_init(), and 452 * split it into small block. First we split a large enough memory block 453 * as the memory region which will be choosed by memblock_double_array(). 454 */ 455 base = PAGE_ALIGN(dummy_physical_memory_base()); 456 new_memory_regions_size = PAGE_ALIGN(INIT_MEMBLOCK_REGIONS * 2 * 457 sizeof(struct memblock_region)); 458 memblock_add(base, new_memory_regions_size); 459 460 /* This is the base of small memory block. */ 461 base += new_memory_regions_size + gap_size; 462 463 orig_region = memblock.memory.regions; 464 465 for (i = 0; i < INIT_MEMBLOCK_REGIONS; i++) { 466 /* 467 * Add these small block to fulfill the memblock. We keep a 468 * gap between the nearby memory to avoid being merged. 469 */ 470 memblock_add(base, size); 471 base += size + gap_size; 472 473 ASSERT_EQ(memblock.memory.cnt, i + 2); 474 ASSERT_EQ(memblock.memory.total_size, new_memory_regions_size + 475 (i + 1) * size); 476 } 477 478 /* 479 * At there, memblock_double_array() has been succeed, check if it 480 * update the memory.max. 481 */ 482 ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2); 483 484 /* memblock_double_array() will reserve the memory it used. Check it. */ 485 ASSERT_EQ(memblock.reserved.cnt, 1); 486 ASSERT_EQ(memblock.reserved.total_size, new_memory_regions_size); 487 488 /* 489 * Now memblock_double_array() works fine. Let's check after the 490 * double_array(), the memblock_add() still works as normal. 491 */ 492 memblock_add(r.base, r.size); 493 ASSERT_EQ(memblock.memory.regions[0].base, r.base); 494 ASSERT_EQ(memblock.memory.regions[0].size, r.size); 495 496 ASSERT_EQ(memblock.memory.cnt, INIT_MEMBLOCK_REGIONS + 2); 497 ASSERT_EQ(memblock.memory.total_size, INIT_MEMBLOCK_REGIONS * size + 498 new_memory_regions_size + 499 r.size); 500 ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2); 501 502 dummy_physical_memory_cleanup(); 503 504 /* 505 * The current memory.regions is occupying a range of memory that 506 * allocated from dummy_physical_memory_init(). After free the memory, 507 * we must not use it. So restore the origin memory region to make sure 508 * the tests can run as normal and not affected by the double array. 509 */ 510 memblock.memory.regions = orig_region; 511 memblock.memory.cnt = INIT_MEMBLOCK_REGIONS; 512 513 test_pass_pop(); 514 515 return 0; 516 } 517 518 static int memblock_add_checks(void) 519 { 520 prefix_reset(); 521 prefix_push(FUNC_ADD); 522 test_print("Running %s tests...\n", FUNC_ADD); 523 524 memblock_add_simple_check(); 525 memblock_add_node_simple_check(); 526 memblock_add_disjoint_check(); 527 memblock_add_overlap_top_check(); 528 memblock_add_overlap_bottom_check(); 529 memblock_add_within_check(); 530 memblock_add_twice_check(); 531 memblock_add_between_check(); 532 memblock_add_near_max_check(); 533 memblock_add_many_check(); 534 535 prefix_pop(); 536 537 return 0; 538 } 539 540 /* 541 * A simple test that marks a memory block of a specified base address 542 * and size as reserved and to the collection of reserved memory regions 543 * (memblock.reserved). Expect to create a new entry. The region counter 544 * and total memory size are updated. 545 */ 546 static int memblock_reserve_simple_check(void) 547 { 548 struct memblock_region *rgn; 549 550 rgn = &memblock.reserved.regions[0]; 551 552 struct region r = { 553 .base = SZ_2G, 554 .size = SZ_128M 555 }; 556 557 PREFIX_PUSH(); 558 559 reset_memblock_regions(); 560 memblock_reserve(r.base, r.size); 561 562 ASSERT_EQ(rgn->base, r.base); 563 ASSERT_EQ(rgn->size, r.size); 564 565 test_pass_pop(); 566 567 return 0; 568 } 569 570 /* 571 * A test that tries to mark two memory blocks that don't overlap as reserved: 572 * 573 * | +--+ +----------------+ | 574 * | |r1| | r2 | | 575 * +--------+--+------+----------------+--+ 576 * 577 * Expect to add two entries to the collection of reserved memory regions 578 * (memblock.reserved). The total size and region counter for 579 * memblock.reserved are updated. 580 */ 581 static int memblock_reserve_disjoint_check(void) 582 { 583 struct memblock_region *rgn1, *rgn2; 584 585 rgn1 = &memblock.reserved.regions[0]; 586 rgn2 = &memblock.reserved.regions[1]; 587 588 struct region r1 = { 589 .base = SZ_256M, 590 .size = SZ_16M 591 }; 592 struct region r2 = { 593 .base = SZ_512M, 594 .size = SZ_512M 595 }; 596 597 PREFIX_PUSH(); 598 599 reset_memblock_regions(); 600 memblock_reserve(r1.base, r1.size); 601 memblock_reserve(r2.base, r2.size); 602 603 ASSERT_EQ(rgn1->base, r1.base); 604 ASSERT_EQ(rgn1->size, r1.size); 605 606 ASSERT_EQ(rgn2->base, r2.base); 607 ASSERT_EQ(rgn2->size, r2.size); 608 609 ASSERT_EQ(memblock.reserved.cnt, 2); 610 ASSERT_EQ(memblock.reserved.total_size, r1.size + r2.size); 611 612 test_pass_pop(); 613 614 return 0; 615 } 616 617 /* 618 * A test that tries to mark two memory blocks r1 and r2 as reserved, 619 * where r2 overlaps with the beginning of r1 (that is 620 * r1.base < r2.base + r2.size): 621 * 622 * | +--------------+--+--------------+ | 623 * | | r2 | | r1 | | 624 * +--+--------------+--+--------------+--+ 625 * ^ ^ 626 * | | 627 * | r1.base 628 * | 629 * r2.base 630 * 631 * Expect to merge two entries into one region that starts at r2.base and 632 * has size of two regions minus their intersection. The total size of the 633 * reserved memory is updated, and the region counter is not updated. 634 */ 635 static int memblock_reserve_overlap_top_check(void) 636 { 637 struct memblock_region *rgn; 638 phys_addr_t total_size; 639 640 rgn = &memblock.reserved.regions[0]; 641 642 struct region r1 = { 643 .base = SZ_1G, 644 .size = SZ_1G 645 }; 646 struct region r2 = { 647 .base = SZ_128M, 648 .size = SZ_1G 649 }; 650 651 PREFIX_PUSH(); 652 653 total_size = (r1.base - r2.base) + r1.size; 654 655 reset_memblock_regions(); 656 memblock_reserve(r1.base, r1.size); 657 memblock_reserve(r2.base, r2.size); 658 659 ASSERT_EQ(rgn->base, r2.base); 660 ASSERT_EQ(rgn->size, total_size); 661 662 ASSERT_EQ(memblock.reserved.cnt, 1); 663 ASSERT_EQ(memblock.reserved.total_size, total_size); 664 665 test_pass_pop(); 666 667 return 0; 668 } 669 670 /* 671 * A test that tries to mark two memory blocks r1 and r2 as reserved, 672 * where r2 overlaps with the end of r1 (that is 673 * r2.base < r1.base + r1.size): 674 * 675 * | +--------------+--+--------------+ | 676 * | | r1 | | r2 | | 677 * +--+--------------+--+--------------+--+ 678 * ^ ^ 679 * | | 680 * | r2.base 681 * | 682 * r1.base 683 * 684 * Expect to merge two entries into one region that starts at r1.base and 685 * has size of two regions minus their intersection. The total size of the 686 * reserved memory is updated, and the region counter is not updated. 687 */ 688 static int memblock_reserve_overlap_bottom_check(void) 689 { 690 struct memblock_region *rgn; 691 phys_addr_t total_size; 692 693 rgn = &memblock.reserved.regions[0]; 694 695 struct region r1 = { 696 .base = SZ_2K, 697 .size = SZ_128K 698 }; 699 struct region r2 = { 700 .base = SZ_128K, 701 .size = SZ_128K 702 }; 703 704 PREFIX_PUSH(); 705 706 total_size = (r2.base - r1.base) + r2.size; 707 708 reset_memblock_regions(); 709 memblock_reserve(r1.base, r1.size); 710 memblock_reserve(r2.base, r2.size); 711 712 ASSERT_EQ(rgn->base, r1.base); 713 ASSERT_EQ(rgn->size, total_size); 714 715 ASSERT_EQ(memblock.reserved.cnt, 1); 716 ASSERT_EQ(memblock.reserved.total_size, total_size); 717 718 test_pass_pop(); 719 720 return 0; 721 } 722 723 /* 724 * A test that tries to mark two memory blocks r1 and r2 as reserved, 725 * where r2 is within the range of r1 (that is 726 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)): 727 * 728 * | +-----+--+---------------------------| 729 * | | |r2| r1 | 730 * +-+-----+--+---------------------------+ 731 * ^ ^ 732 * | | 733 * | r2.base 734 * | 735 * r1.base 736 * 737 * Expect to merge two entries into one region that stays the same. The 738 * counter and total size of available memory are not updated. 739 */ 740 static int memblock_reserve_within_check(void) 741 { 742 struct memblock_region *rgn; 743 744 rgn = &memblock.reserved.regions[0]; 745 746 struct region r1 = { 747 .base = SZ_1M, 748 .size = SZ_8M 749 }; 750 struct region r2 = { 751 .base = SZ_2M, 752 .size = SZ_64K 753 }; 754 755 PREFIX_PUSH(); 756 757 reset_memblock_regions(); 758 memblock_reserve(r1.base, r1.size); 759 memblock_reserve(r2.base, r2.size); 760 761 ASSERT_EQ(rgn->base, r1.base); 762 ASSERT_EQ(rgn->size, r1.size); 763 764 ASSERT_EQ(memblock.reserved.cnt, 1); 765 ASSERT_EQ(memblock.reserved.total_size, r1.size); 766 767 test_pass_pop(); 768 769 return 0; 770 } 771 772 /* 773 * A simple test that tries to reserve the same memory block twice. 774 * Expect the region counter and total size of reserved memory to not 775 * be updated. 776 */ 777 static int memblock_reserve_twice_check(void) 778 { 779 struct region r = { 780 .base = SZ_16K, 781 .size = SZ_2M 782 }; 783 784 PREFIX_PUSH(); 785 786 reset_memblock_regions(); 787 788 memblock_reserve(r.base, r.size); 789 memblock_reserve(r.base, r.size); 790 791 ASSERT_EQ(memblock.reserved.cnt, 1); 792 ASSERT_EQ(memblock.reserved.total_size, r.size); 793 794 test_pass_pop(); 795 796 return 0; 797 } 798 799 /* 800 * A test that tries to mark two memory blocks that don't overlap as reserved 801 * and then reserve a third memory block in the space between the first two: 802 * 803 * | +--------+--------+--------+ | 804 * | | r1 | r3 | r2 | | 805 * +--------+--------+--------+--------+--+ 806 * 807 * Expect to merge the three entries into one reserved region that starts at 808 * r1.base and has size of r1.size + r2.size + r3.size. The region counter and 809 * total for memblock.reserved are updated. 810 */ 811 static int memblock_reserve_between_check(void) 812 { 813 struct memblock_region *rgn; 814 phys_addr_t total_size; 815 816 rgn = &memblock.reserved.regions[0]; 817 818 struct region r1 = { 819 .base = SZ_1G, 820 .size = SZ_8K 821 }; 822 struct region r2 = { 823 .base = SZ_1G + SZ_16K, 824 .size = SZ_8K 825 }; 826 struct region r3 = { 827 .base = SZ_1G + SZ_8K, 828 .size = SZ_8K 829 }; 830 831 PREFIX_PUSH(); 832 833 total_size = r1.size + r2.size + r3.size; 834 835 reset_memblock_regions(); 836 memblock_reserve(r1.base, r1.size); 837 memblock_reserve(r2.base, r2.size); 838 memblock_reserve(r3.base, r3.size); 839 840 ASSERT_EQ(rgn->base, r1.base); 841 ASSERT_EQ(rgn->size, total_size); 842 843 ASSERT_EQ(memblock.reserved.cnt, 1); 844 ASSERT_EQ(memblock.reserved.total_size, total_size); 845 846 test_pass_pop(); 847 848 return 0; 849 } 850 851 /* 852 * A simple test that tries to reserve a memory block r when r extends past 853 * PHYS_ADDR_MAX: 854 * 855 * +--------+ 856 * | r | 857 * +--------+ 858 * | +----+ 859 * | | rgn| 860 * +----------------------------+----+ 861 * 862 * Expect to reserve a memory block of size PHYS_ADDR_MAX - r.base. Expect the 863 * total size of reserved memory and the counter to be updated. 864 */ 865 static int memblock_reserve_near_max_check(void) 866 { 867 struct memblock_region *rgn; 868 phys_addr_t total_size; 869 870 rgn = &memblock.reserved.regions[0]; 871 872 struct region r = { 873 .base = PHYS_ADDR_MAX - SZ_1M, 874 .size = SZ_2M 875 }; 876 877 PREFIX_PUSH(); 878 879 total_size = PHYS_ADDR_MAX - r.base; 880 881 reset_memblock_regions(); 882 memblock_reserve(r.base, r.size); 883 884 ASSERT_EQ(rgn->base, r.base); 885 ASSERT_EQ(rgn->size, total_size); 886 887 ASSERT_EQ(memblock.reserved.cnt, 1); 888 ASSERT_EQ(memblock.reserved.total_size, total_size); 889 890 test_pass_pop(); 891 892 return 0; 893 } 894 895 /* 896 * A test that trying to reserve the 129th memory block. 897 * Expect to trigger memblock_double_array() to double the 898 * memblock.memory.max, find a new valid memory as 899 * reserved.regions. 900 */ 901 static int memblock_reserve_many_check(void) 902 { 903 int i; 904 void *orig_region; 905 struct region r = { 906 .base = SZ_16K, 907 .size = SZ_16K, 908 }; 909 phys_addr_t memory_base = SZ_128K; 910 phys_addr_t new_reserved_regions_size; 911 912 PREFIX_PUSH(); 913 914 reset_memblock_regions(); 915 memblock_allow_resize(); 916 917 /* Add a valid memory region used by double_array(). */ 918 dummy_physical_memory_init(); 919 memblock_add(dummy_physical_memory_base(), MEM_SIZE); 920 921 for (i = 0; i < INIT_MEMBLOCK_REGIONS; i++) { 922 /* Reserve some fakes memory region to fulfill the memblock. */ 923 memblock_reserve(memory_base, MEM_SIZE); 924 925 ASSERT_EQ(memblock.reserved.cnt, i + 1); 926 ASSERT_EQ(memblock.reserved.total_size, (i + 1) * MEM_SIZE); 927 928 /* Keep the gap so these memory region will not be merged. */ 929 memory_base += MEM_SIZE * 2; 930 } 931 932 orig_region = memblock.reserved.regions; 933 934 /* This reserve the 129 memory_region, and makes it double array. */ 935 memblock_reserve(memory_base, MEM_SIZE); 936 937 /* 938 * This is the memory region size used by the doubled reserved.regions, 939 * and it has been reserved due to it has been used. The size is used to 940 * calculate the total_size that the memblock.reserved have now. 941 */ 942 new_reserved_regions_size = PAGE_ALIGN((INIT_MEMBLOCK_REGIONS * 2) * 943 sizeof(struct memblock_region)); 944 /* 945 * The double_array() will find a free memory region as the new 946 * reserved.regions, and the used memory region will be reserved, so 947 * there will be one more region exist in the reserved memblock. And the 948 * one more reserved region's size is new_reserved_regions_size. 949 */ 950 ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 2); 951 ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE + 952 new_reserved_regions_size); 953 ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2); 954 955 /* 956 * Now memblock_double_array() works fine. Let's check after the 957 * double_array(), the memblock_reserve() still works as normal. 958 */ 959 memblock_reserve(r.base, r.size); 960 ASSERT_EQ(memblock.reserved.regions[0].base, r.base); 961 ASSERT_EQ(memblock.reserved.regions[0].size, r.size); 962 963 ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 3); 964 ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE + 965 new_reserved_regions_size + 966 r.size); 967 ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2); 968 969 dummy_physical_memory_cleanup(); 970 971 /* 972 * The current reserved.regions is occupying a range of memory that 973 * allocated from dummy_physical_memory_init(). After free the memory, 974 * we must not use it. So restore the origin memory region to make sure 975 * the tests can run as normal and not affected by the double array. 976 */ 977 memblock.reserved.regions = orig_region; 978 memblock.reserved.cnt = INIT_MEMBLOCK_RESERVED_REGIONS; 979 980 test_pass_pop(); 981 982 return 0; 983 } 984 985 static int memblock_reserve_checks(void) 986 { 987 prefix_reset(); 988 prefix_push(FUNC_RESERVE); 989 test_print("Running %s tests...\n", FUNC_RESERVE); 990 991 memblock_reserve_simple_check(); 992 memblock_reserve_disjoint_check(); 993 memblock_reserve_overlap_top_check(); 994 memblock_reserve_overlap_bottom_check(); 995 memblock_reserve_within_check(); 996 memblock_reserve_twice_check(); 997 memblock_reserve_between_check(); 998 memblock_reserve_near_max_check(); 999 memblock_reserve_many_check(); 1000 1001 prefix_pop(); 1002 1003 return 0; 1004 } 1005 1006 /* 1007 * A simple test that tries to remove a region r1 from the array of 1008 * available memory regions. By "removing" a region we mean overwriting it 1009 * with the next region r2 in memblock.memory: 1010 * 1011 * | ...... +----------------+ | 1012 * | : r1 : | r2 | | 1013 * +--+----+----------+----------------+--+ 1014 * ^ 1015 * | 1016 * rgn.base 1017 * 1018 * Expect to add two memory blocks r1 and r2 and then remove r1 so that 1019 * r2 is the first available region. The region counter and total size 1020 * are updated. 1021 */ 1022 static int memblock_remove_simple_check(void) 1023 { 1024 struct memblock_region *rgn; 1025 1026 rgn = &memblock.memory.regions[0]; 1027 1028 struct region r1 = { 1029 .base = SZ_2K, 1030 .size = SZ_4K 1031 }; 1032 struct region r2 = { 1033 .base = SZ_128K, 1034 .size = SZ_4M 1035 }; 1036 1037 PREFIX_PUSH(); 1038 1039 reset_memblock_regions(); 1040 memblock_add(r1.base, r1.size); 1041 memblock_add(r2.base, r2.size); 1042 memblock_remove(r1.base, r1.size); 1043 1044 ASSERT_EQ(rgn->base, r2.base); 1045 ASSERT_EQ(rgn->size, r2.size); 1046 1047 ASSERT_EQ(memblock.memory.cnt, 1); 1048 ASSERT_EQ(memblock.memory.total_size, r2.size); 1049 1050 test_pass_pop(); 1051 1052 return 0; 1053 } 1054 1055 /* 1056 * A test that tries to remove a region r2 that was not registered as 1057 * available memory (i.e. has no corresponding entry in memblock.memory): 1058 * 1059 * +----------------+ 1060 * | r2 | 1061 * +----------------+ 1062 * | +----+ | 1063 * | | r1 | | 1064 * +--+----+------------------------------+ 1065 * ^ 1066 * | 1067 * rgn.base 1068 * 1069 * Expect the array, regions counter and total size to not be modified. 1070 */ 1071 static int memblock_remove_absent_check(void) 1072 { 1073 struct memblock_region *rgn; 1074 1075 rgn = &memblock.memory.regions[0]; 1076 1077 struct region r1 = { 1078 .base = SZ_512K, 1079 .size = SZ_4M 1080 }; 1081 struct region r2 = { 1082 .base = SZ_64M, 1083 .size = SZ_1G 1084 }; 1085 1086 PREFIX_PUSH(); 1087 1088 reset_memblock_regions(); 1089 memblock_add(r1.base, r1.size); 1090 memblock_remove(r2.base, r2.size); 1091 1092 ASSERT_EQ(rgn->base, r1.base); 1093 ASSERT_EQ(rgn->size, r1.size); 1094 1095 ASSERT_EQ(memblock.memory.cnt, 1); 1096 ASSERT_EQ(memblock.memory.total_size, r1.size); 1097 1098 test_pass_pop(); 1099 1100 return 0; 1101 } 1102 1103 /* 1104 * A test that tries to remove a region r2 that overlaps with the 1105 * beginning of the already existing entry r1 1106 * (that is r1.base < r2.base + r2.size): 1107 * 1108 * +-----------------+ 1109 * | r2 | 1110 * +-----------------+ 1111 * | .........+--------+ | 1112 * | : r1 | rgn | | 1113 * +-----------------+--------+--------+--+ 1114 * ^ ^ 1115 * | | 1116 * | rgn.base 1117 * r1.base 1118 * 1119 * Expect that only the intersection of both regions is removed from the 1120 * available memory pool. The regions counter and total size are updated. 1121 */ 1122 static int memblock_remove_overlap_top_check(void) 1123 { 1124 struct memblock_region *rgn; 1125 phys_addr_t r1_end, r2_end, total_size; 1126 1127 rgn = &memblock.memory.regions[0]; 1128 1129 struct region r1 = { 1130 .base = SZ_32M, 1131 .size = SZ_32M 1132 }; 1133 struct region r2 = { 1134 .base = SZ_16M, 1135 .size = SZ_32M 1136 }; 1137 1138 PREFIX_PUSH(); 1139 1140 r1_end = r1.base + r1.size; 1141 r2_end = r2.base + r2.size; 1142 total_size = r1_end - r2_end; 1143 1144 reset_memblock_regions(); 1145 memblock_add(r1.base, r1.size); 1146 memblock_remove(r2.base, r2.size); 1147 1148 ASSERT_EQ(rgn->base, r1.base + r2.base); 1149 ASSERT_EQ(rgn->size, total_size); 1150 1151 ASSERT_EQ(memblock.memory.cnt, 1); 1152 ASSERT_EQ(memblock.memory.total_size, total_size); 1153 1154 test_pass_pop(); 1155 1156 return 0; 1157 } 1158 1159 /* 1160 * A test that tries to remove a region r2 that overlaps with the end of 1161 * the already existing region r1 (that is r2.base < r1.base + r1.size): 1162 * 1163 * +--------------------------------+ 1164 * | r2 | 1165 * +--------------------------------+ 1166 * | +---+..... | 1167 * | |rgn| r1 : | 1168 * +-+---+----+---------------------------+ 1169 * ^ 1170 * | 1171 * r1.base 1172 * 1173 * Expect that only the intersection of both regions is removed from the 1174 * available memory pool. The regions counter and total size are updated. 1175 */ 1176 static int memblock_remove_overlap_bottom_check(void) 1177 { 1178 struct memblock_region *rgn; 1179 phys_addr_t total_size; 1180 1181 rgn = &memblock.memory.regions[0]; 1182 1183 struct region r1 = { 1184 .base = SZ_2M, 1185 .size = SZ_64M 1186 }; 1187 struct region r2 = { 1188 .base = SZ_32M, 1189 .size = SZ_256M 1190 }; 1191 1192 PREFIX_PUSH(); 1193 1194 total_size = r2.base - r1.base; 1195 1196 reset_memblock_regions(); 1197 memblock_add(r1.base, r1.size); 1198 memblock_remove(r2.base, r2.size); 1199 1200 ASSERT_EQ(rgn->base, r1.base); 1201 ASSERT_EQ(rgn->size, total_size); 1202 1203 ASSERT_EQ(memblock.memory.cnt, 1); 1204 ASSERT_EQ(memblock.memory.total_size, total_size); 1205 1206 test_pass_pop(); 1207 1208 return 0; 1209 } 1210 1211 /* 1212 * A test that tries to remove a region r2 that is within the range of 1213 * the already existing entry r1 (that is 1214 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)): 1215 * 1216 * +----+ 1217 * | r2 | 1218 * +----+ 1219 * | +-------------+....+---------------+ | 1220 * | | rgn1 | r1 | rgn2 | | 1221 * +-+-------------+----+---------------+-+ 1222 * ^ 1223 * | 1224 * r1.base 1225 * 1226 * Expect that the region is split into two - one that ends at r2.base and 1227 * another that starts at r2.base + r2.size, with appropriate sizes. The 1228 * region counter and total size are updated. 1229 */ 1230 static int memblock_remove_within_check(void) 1231 { 1232 struct memblock_region *rgn1, *rgn2; 1233 phys_addr_t r1_size, r2_size, total_size; 1234 1235 rgn1 = &memblock.memory.regions[0]; 1236 rgn2 = &memblock.memory.regions[1]; 1237 1238 struct region r1 = { 1239 .base = SZ_1M, 1240 .size = SZ_32M 1241 }; 1242 struct region r2 = { 1243 .base = SZ_16M, 1244 .size = SZ_1M 1245 }; 1246 1247 PREFIX_PUSH(); 1248 1249 r1_size = r2.base - r1.base; 1250 r2_size = (r1.base + r1.size) - (r2.base + r2.size); 1251 total_size = r1_size + r2_size; 1252 1253 reset_memblock_regions(); 1254 memblock_add(r1.base, r1.size); 1255 memblock_remove(r2.base, r2.size); 1256 1257 ASSERT_EQ(rgn1->base, r1.base); 1258 ASSERT_EQ(rgn1->size, r1_size); 1259 1260 ASSERT_EQ(rgn2->base, r2.base + r2.size); 1261 ASSERT_EQ(rgn2->size, r2_size); 1262 1263 ASSERT_EQ(memblock.memory.cnt, 2); 1264 ASSERT_EQ(memblock.memory.total_size, total_size); 1265 1266 test_pass_pop(); 1267 1268 return 0; 1269 } 1270 1271 /* 1272 * A simple test that tries to remove a region r1 from the array of 1273 * available memory regions when r1 is the only available region. 1274 * Expect to add a memory block r1 and then remove r1 so that a dummy 1275 * region is added. The region counter stays the same, and the total size 1276 * is updated. 1277 */ 1278 static int memblock_remove_only_region_check(void) 1279 { 1280 struct memblock_region *rgn; 1281 1282 rgn = &memblock.memory.regions[0]; 1283 1284 struct region r1 = { 1285 .base = SZ_2K, 1286 .size = SZ_4K 1287 }; 1288 1289 PREFIX_PUSH(); 1290 1291 reset_memblock_regions(); 1292 memblock_add(r1.base, r1.size); 1293 memblock_remove(r1.base, r1.size); 1294 1295 ASSERT_EQ(rgn->base, 0); 1296 ASSERT_EQ(rgn->size, 0); 1297 1298 ASSERT_EQ(memblock.memory.cnt, 1); 1299 ASSERT_EQ(memblock.memory.total_size, 0); 1300 1301 test_pass_pop(); 1302 1303 return 0; 1304 } 1305 1306 /* 1307 * A simple test that tries remove a region r2 from the array of available 1308 * memory regions when r2 extends past PHYS_ADDR_MAX: 1309 * 1310 * +--------+ 1311 * | r2 | 1312 * +--------+ 1313 * | +---+....+ 1314 * | |rgn| | 1315 * +------------------------+---+----+ 1316 * 1317 * Expect that only the portion between PHYS_ADDR_MAX and r2.base is removed. 1318 * Expect the total size of available memory to be updated and the counter to 1319 * not be updated. 1320 */ 1321 static int memblock_remove_near_max_check(void) 1322 { 1323 struct memblock_region *rgn; 1324 phys_addr_t total_size; 1325 1326 rgn = &memblock.memory.regions[0]; 1327 1328 struct region r1 = { 1329 .base = PHYS_ADDR_MAX - SZ_2M, 1330 .size = SZ_2M 1331 }; 1332 1333 struct region r2 = { 1334 .base = PHYS_ADDR_MAX - SZ_1M, 1335 .size = SZ_2M 1336 }; 1337 1338 PREFIX_PUSH(); 1339 1340 total_size = r1.size - (PHYS_ADDR_MAX - r2.base); 1341 1342 reset_memblock_regions(); 1343 memblock_add(r1.base, r1.size); 1344 memblock_remove(r2.base, r2.size); 1345 1346 ASSERT_EQ(rgn->base, r1.base); 1347 ASSERT_EQ(rgn->size, total_size); 1348 1349 ASSERT_EQ(memblock.memory.cnt, 1); 1350 ASSERT_EQ(memblock.memory.total_size, total_size); 1351 1352 test_pass_pop(); 1353 1354 return 0; 1355 } 1356 1357 /* 1358 * A test that tries to remove a region r3 that overlaps with two existing 1359 * regions r1 and r2: 1360 * 1361 * +----------------+ 1362 * | r3 | 1363 * +----------------+ 1364 * | +----+..... ........+--------+ 1365 * | | |r1 : : |r2 | | 1366 * +----+----+----+---+-------+--------+-----+ 1367 * 1368 * Expect that only the intersections of r1 with r3 and r2 with r3 are removed 1369 * from the available memory pool. Expect the total size of available memory to 1370 * be updated and the counter to not be updated. 1371 */ 1372 static int memblock_remove_overlap_two_check(void) 1373 { 1374 struct memblock_region *rgn1, *rgn2; 1375 phys_addr_t new_r1_size, new_r2_size, r2_end, r3_end, total_size; 1376 1377 rgn1 = &memblock.memory.regions[0]; 1378 rgn2 = &memblock.memory.regions[1]; 1379 1380 struct region r1 = { 1381 .base = SZ_16M, 1382 .size = SZ_32M 1383 }; 1384 struct region r2 = { 1385 .base = SZ_64M, 1386 .size = SZ_64M 1387 }; 1388 struct region r3 = { 1389 .base = SZ_32M, 1390 .size = SZ_64M 1391 }; 1392 1393 PREFIX_PUSH(); 1394 1395 r2_end = r2.base + r2.size; 1396 r3_end = r3.base + r3.size; 1397 new_r1_size = r3.base - r1.base; 1398 new_r2_size = r2_end - r3_end; 1399 total_size = new_r1_size + new_r2_size; 1400 1401 reset_memblock_regions(); 1402 memblock_add(r1.base, r1.size); 1403 memblock_add(r2.base, r2.size); 1404 memblock_remove(r3.base, r3.size); 1405 1406 ASSERT_EQ(rgn1->base, r1.base); 1407 ASSERT_EQ(rgn1->size, new_r1_size); 1408 1409 ASSERT_EQ(rgn2->base, r3_end); 1410 ASSERT_EQ(rgn2->size, new_r2_size); 1411 1412 ASSERT_EQ(memblock.memory.cnt, 2); 1413 ASSERT_EQ(memblock.memory.total_size, total_size); 1414 1415 test_pass_pop(); 1416 1417 return 0; 1418 } 1419 1420 static int memblock_remove_checks(void) 1421 { 1422 prefix_reset(); 1423 prefix_push(FUNC_REMOVE); 1424 test_print("Running %s tests...\n", FUNC_REMOVE); 1425 1426 memblock_remove_simple_check(); 1427 memblock_remove_absent_check(); 1428 memblock_remove_overlap_top_check(); 1429 memblock_remove_overlap_bottom_check(); 1430 memblock_remove_within_check(); 1431 memblock_remove_only_region_check(); 1432 memblock_remove_near_max_check(); 1433 memblock_remove_overlap_two_check(); 1434 1435 prefix_pop(); 1436 1437 return 0; 1438 } 1439 1440 /* 1441 * A simple test that tries to free a memory block r1 that was marked 1442 * earlier as reserved. By "freeing" a region we mean overwriting it with 1443 * the next entry r2 in memblock.reserved: 1444 * 1445 * | ...... +----+ | 1446 * | : r1 : | r2 | | 1447 * +--------------+----+-----------+----+-+ 1448 * ^ 1449 * | 1450 * rgn.base 1451 * 1452 * Expect to reserve two memory regions and then erase r1 region with the 1453 * value of r2. The region counter and total size are updated. 1454 */ 1455 static int memblock_free_simple_check(void) 1456 { 1457 struct memblock_region *rgn; 1458 1459 rgn = &memblock.reserved.regions[0]; 1460 1461 struct region r1 = { 1462 .base = SZ_4M, 1463 .size = SZ_1M 1464 }; 1465 struct region r2 = { 1466 .base = SZ_8M, 1467 .size = SZ_1M 1468 }; 1469 1470 PREFIX_PUSH(); 1471 1472 reset_memblock_regions(); 1473 memblock_reserve(r1.base, r1.size); 1474 memblock_reserve(r2.base, r2.size); 1475 memblock_free((void *)r1.base, r1.size); 1476 1477 ASSERT_EQ(rgn->base, r2.base); 1478 ASSERT_EQ(rgn->size, r2.size); 1479 1480 ASSERT_EQ(memblock.reserved.cnt, 1); 1481 ASSERT_EQ(memblock.reserved.total_size, r2.size); 1482 1483 test_pass_pop(); 1484 1485 return 0; 1486 } 1487 1488 /* 1489 * A test that tries to free a region r2 that was not marked as reserved 1490 * (i.e. has no corresponding entry in memblock.reserved): 1491 * 1492 * +----------------+ 1493 * | r2 | 1494 * +----------------+ 1495 * | +----+ | 1496 * | | r1 | | 1497 * +--+----+------------------------------+ 1498 * ^ 1499 * | 1500 * rgn.base 1501 * 1502 * The array, regions counter and total size are not modified. 1503 */ 1504 static int memblock_free_absent_check(void) 1505 { 1506 struct memblock_region *rgn; 1507 1508 rgn = &memblock.reserved.regions[0]; 1509 1510 struct region r1 = { 1511 .base = SZ_2M, 1512 .size = SZ_8K 1513 }; 1514 struct region r2 = { 1515 .base = SZ_16M, 1516 .size = SZ_128M 1517 }; 1518 1519 PREFIX_PUSH(); 1520 1521 reset_memblock_regions(); 1522 memblock_reserve(r1.base, r1.size); 1523 memblock_free((void *)r2.base, r2.size); 1524 1525 ASSERT_EQ(rgn->base, r1.base); 1526 ASSERT_EQ(rgn->size, r1.size); 1527 1528 ASSERT_EQ(memblock.reserved.cnt, 1); 1529 ASSERT_EQ(memblock.reserved.total_size, r1.size); 1530 1531 test_pass_pop(); 1532 1533 return 0; 1534 } 1535 1536 /* 1537 * A test that tries to free a region r2 that overlaps with the beginning 1538 * of the already existing entry r1 (that is r1.base < r2.base + r2.size): 1539 * 1540 * +----+ 1541 * | r2 | 1542 * +----+ 1543 * | ...+--------------+ | 1544 * | : | r1 | | 1545 * +----+--+--------------+---------------+ 1546 * ^ ^ 1547 * | | 1548 * | rgn.base 1549 * | 1550 * r1.base 1551 * 1552 * Expect that only the intersection of both regions is freed. The 1553 * regions counter and total size are updated. 1554 */ 1555 static int memblock_free_overlap_top_check(void) 1556 { 1557 struct memblock_region *rgn; 1558 phys_addr_t total_size; 1559 1560 rgn = &memblock.reserved.regions[0]; 1561 1562 struct region r1 = { 1563 .base = SZ_8M, 1564 .size = SZ_32M 1565 }; 1566 struct region r2 = { 1567 .base = SZ_1M, 1568 .size = SZ_8M 1569 }; 1570 1571 PREFIX_PUSH(); 1572 1573 total_size = (r1.size + r1.base) - (r2.base + r2.size); 1574 1575 reset_memblock_regions(); 1576 memblock_reserve(r1.base, r1.size); 1577 memblock_free((void *)r2.base, r2.size); 1578 1579 ASSERT_EQ(rgn->base, r2.base + r2.size); 1580 ASSERT_EQ(rgn->size, total_size); 1581 1582 ASSERT_EQ(memblock.reserved.cnt, 1); 1583 ASSERT_EQ(memblock.reserved.total_size, total_size); 1584 1585 test_pass_pop(); 1586 1587 return 0; 1588 } 1589 1590 /* 1591 * A test that tries to free a region r2 that overlaps with the end of 1592 * the already existing entry r1 (that is r2.base < r1.base + r1.size): 1593 * 1594 * +----------------+ 1595 * | r2 | 1596 * +----------------+ 1597 * | +-----------+..... | 1598 * | | r1 | : | 1599 * +----+-----------+----+----------------+ 1600 * 1601 * Expect that only the intersection of both regions is freed. The 1602 * regions counter and total size are updated. 1603 */ 1604 static int memblock_free_overlap_bottom_check(void) 1605 { 1606 struct memblock_region *rgn; 1607 phys_addr_t total_size; 1608 1609 rgn = &memblock.reserved.regions[0]; 1610 1611 struct region r1 = { 1612 .base = SZ_8M, 1613 .size = SZ_32M 1614 }; 1615 struct region r2 = { 1616 .base = SZ_32M, 1617 .size = SZ_32M 1618 }; 1619 1620 PREFIX_PUSH(); 1621 1622 total_size = r2.base - r1.base; 1623 1624 reset_memblock_regions(); 1625 memblock_reserve(r1.base, r1.size); 1626 memblock_free((void *)r2.base, r2.size); 1627 1628 ASSERT_EQ(rgn->base, r1.base); 1629 ASSERT_EQ(rgn->size, total_size); 1630 1631 ASSERT_EQ(memblock.reserved.cnt, 1); 1632 ASSERT_EQ(memblock.reserved.total_size, total_size); 1633 1634 test_pass_pop(); 1635 1636 return 0; 1637 } 1638 1639 /* 1640 * A test that tries to free a region r2 that is within the range of the 1641 * already existing entry r1 (that is 1642 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)): 1643 * 1644 * +----+ 1645 * | r2 | 1646 * +----+ 1647 * | +------------+....+---------------+ 1648 * | | rgn1 | r1 | rgn2 | 1649 * +----+------------+----+---------------+ 1650 * ^ 1651 * | 1652 * r1.base 1653 * 1654 * Expect that the region is split into two - one that ends at r2.base and 1655 * another that starts at r2.base + r2.size, with appropriate sizes. The 1656 * region counter and total size fields are updated. 1657 */ 1658 static int memblock_free_within_check(void) 1659 { 1660 struct memblock_region *rgn1, *rgn2; 1661 phys_addr_t r1_size, r2_size, total_size; 1662 1663 rgn1 = &memblock.reserved.regions[0]; 1664 rgn2 = &memblock.reserved.regions[1]; 1665 1666 struct region r1 = { 1667 .base = SZ_1M, 1668 .size = SZ_8M 1669 }; 1670 struct region r2 = { 1671 .base = SZ_4M, 1672 .size = SZ_1M 1673 }; 1674 1675 PREFIX_PUSH(); 1676 1677 r1_size = r2.base - r1.base; 1678 r2_size = (r1.base + r1.size) - (r2.base + r2.size); 1679 total_size = r1_size + r2_size; 1680 1681 reset_memblock_regions(); 1682 memblock_reserve(r1.base, r1.size); 1683 memblock_free((void *)r2.base, r2.size); 1684 1685 ASSERT_EQ(rgn1->base, r1.base); 1686 ASSERT_EQ(rgn1->size, r1_size); 1687 1688 ASSERT_EQ(rgn2->base, r2.base + r2.size); 1689 ASSERT_EQ(rgn2->size, r2_size); 1690 1691 ASSERT_EQ(memblock.reserved.cnt, 2); 1692 ASSERT_EQ(memblock.reserved.total_size, total_size); 1693 1694 test_pass_pop(); 1695 1696 return 0; 1697 } 1698 1699 /* 1700 * A simple test that tries to free a memory block r1 that was marked 1701 * earlier as reserved when r1 is the only available region. 1702 * Expect to reserve a memory block r1 and then free r1 so that r1 is 1703 * overwritten with a dummy region. The region counter stays the same, 1704 * and the total size is updated. 1705 */ 1706 static int memblock_free_only_region_check(void) 1707 { 1708 struct memblock_region *rgn; 1709 1710 rgn = &memblock.reserved.regions[0]; 1711 1712 struct region r1 = { 1713 .base = SZ_2K, 1714 .size = SZ_4K 1715 }; 1716 1717 PREFIX_PUSH(); 1718 1719 reset_memblock_regions(); 1720 memblock_reserve(r1.base, r1.size); 1721 memblock_free((void *)r1.base, r1.size); 1722 1723 ASSERT_EQ(rgn->base, 0); 1724 ASSERT_EQ(rgn->size, 0); 1725 1726 ASSERT_EQ(memblock.reserved.cnt, 1); 1727 ASSERT_EQ(memblock.reserved.total_size, 0); 1728 1729 test_pass_pop(); 1730 1731 return 0; 1732 } 1733 1734 /* 1735 * A simple test that tries free a region r2 when r2 extends past PHYS_ADDR_MAX: 1736 * 1737 * +--------+ 1738 * | r2 | 1739 * +--------+ 1740 * | +---+....+ 1741 * | |rgn| | 1742 * +------------------------+---+----+ 1743 * 1744 * Expect that only the portion between PHYS_ADDR_MAX and r2.base is freed. 1745 * Expect the total size of reserved memory to be updated and the counter to 1746 * not be updated. 1747 */ 1748 static int memblock_free_near_max_check(void) 1749 { 1750 struct memblock_region *rgn; 1751 phys_addr_t total_size; 1752 1753 rgn = &memblock.reserved.regions[0]; 1754 1755 struct region r1 = { 1756 .base = PHYS_ADDR_MAX - SZ_2M, 1757 .size = SZ_2M 1758 }; 1759 1760 struct region r2 = { 1761 .base = PHYS_ADDR_MAX - SZ_1M, 1762 .size = SZ_2M 1763 }; 1764 1765 PREFIX_PUSH(); 1766 1767 total_size = r1.size - (PHYS_ADDR_MAX - r2.base); 1768 1769 reset_memblock_regions(); 1770 memblock_reserve(r1.base, r1.size); 1771 memblock_free((void *)r2.base, r2.size); 1772 1773 ASSERT_EQ(rgn->base, r1.base); 1774 ASSERT_EQ(rgn->size, total_size); 1775 1776 ASSERT_EQ(memblock.reserved.cnt, 1); 1777 ASSERT_EQ(memblock.reserved.total_size, total_size); 1778 1779 test_pass_pop(); 1780 1781 return 0; 1782 } 1783 1784 /* 1785 * A test that tries to free a reserved region r3 that overlaps with two 1786 * existing reserved regions r1 and r2: 1787 * 1788 * +----------------+ 1789 * | r3 | 1790 * +----------------+ 1791 * | +----+..... ........+--------+ 1792 * | | |r1 : : |r2 | | 1793 * +----+----+----+---+-------+--------+-----+ 1794 * 1795 * Expect that only the intersections of r1 with r3 and r2 with r3 are freed 1796 * from the collection of reserved memory. Expect the total size of reserved 1797 * memory to be updated and the counter to not be updated. 1798 */ 1799 static int memblock_free_overlap_two_check(void) 1800 { 1801 struct memblock_region *rgn1, *rgn2; 1802 phys_addr_t new_r1_size, new_r2_size, r2_end, r3_end, total_size; 1803 1804 rgn1 = &memblock.reserved.regions[0]; 1805 rgn2 = &memblock.reserved.regions[1]; 1806 1807 struct region r1 = { 1808 .base = SZ_16M, 1809 .size = SZ_32M 1810 }; 1811 struct region r2 = { 1812 .base = SZ_64M, 1813 .size = SZ_64M 1814 }; 1815 struct region r3 = { 1816 .base = SZ_32M, 1817 .size = SZ_64M 1818 }; 1819 1820 PREFIX_PUSH(); 1821 1822 r2_end = r2.base + r2.size; 1823 r3_end = r3.base + r3.size; 1824 new_r1_size = r3.base - r1.base; 1825 new_r2_size = r2_end - r3_end; 1826 total_size = new_r1_size + new_r2_size; 1827 1828 reset_memblock_regions(); 1829 memblock_reserve(r1.base, r1.size); 1830 memblock_reserve(r2.base, r2.size); 1831 memblock_free((void *)r3.base, r3.size); 1832 1833 ASSERT_EQ(rgn1->base, r1.base); 1834 ASSERT_EQ(rgn1->size, new_r1_size); 1835 1836 ASSERT_EQ(rgn2->base, r3_end); 1837 ASSERT_EQ(rgn2->size, new_r2_size); 1838 1839 ASSERT_EQ(memblock.reserved.cnt, 2); 1840 ASSERT_EQ(memblock.reserved.total_size, total_size); 1841 1842 test_pass_pop(); 1843 1844 return 0; 1845 } 1846 1847 static int memblock_free_checks(void) 1848 { 1849 prefix_reset(); 1850 prefix_push(FUNC_FREE); 1851 test_print("Running %s tests...\n", FUNC_FREE); 1852 1853 memblock_free_simple_check(); 1854 memblock_free_absent_check(); 1855 memblock_free_overlap_top_check(); 1856 memblock_free_overlap_bottom_check(); 1857 memblock_free_within_check(); 1858 memblock_free_only_region_check(); 1859 memblock_free_near_max_check(); 1860 memblock_free_overlap_two_check(); 1861 1862 prefix_pop(); 1863 1864 return 0; 1865 } 1866 1867 static int memblock_set_bottom_up_check(void) 1868 { 1869 prefix_push("memblock_set_bottom_up"); 1870 1871 memblock_set_bottom_up(false); 1872 ASSERT_EQ(memblock.bottom_up, false); 1873 memblock_set_bottom_up(true); 1874 ASSERT_EQ(memblock.bottom_up, true); 1875 1876 reset_memblock_attributes(); 1877 test_pass_pop(); 1878 1879 return 0; 1880 } 1881 1882 static int memblock_bottom_up_check(void) 1883 { 1884 prefix_push("memblock_bottom_up"); 1885 1886 memblock_set_bottom_up(false); 1887 ASSERT_EQ(memblock_bottom_up(), memblock.bottom_up); 1888 ASSERT_EQ(memblock_bottom_up(), false); 1889 memblock_set_bottom_up(true); 1890 ASSERT_EQ(memblock_bottom_up(), memblock.bottom_up); 1891 ASSERT_EQ(memblock_bottom_up(), true); 1892 1893 reset_memblock_attributes(); 1894 test_pass_pop(); 1895 1896 return 0; 1897 } 1898 1899 static int memblock_bottom_up_checks(void) 1900 { 1901 test_print("Running memblock_*bottom_up tests...\n"); 1902 1903 prefix_reset(); 1904 memblock_set_bottom_up_check(); 1905 prefix_reset(); 1906 memblock_bottom_up_check(); 1907 1908 return 0; 1909 } 1910 1911 /* 1912 * A test that tries to trim memory when both ends of the memory region are 1913 * aligned. Expect that the memory will not be trimmed. Expect the counter to 1914 * not be updated. 1915 */ 1916 static int memblock_trim_memory_aligned_check(void) 1917 { 1918 struct memblock_region *rgn; 1919 const phys_addr_t alignment = SMP_CACHE_BYTES; 1920 1921 rgn = &memblock.memory.regions[0]; 1922 1923 struct region r = { 1924 .base = alignment, 1925 .size = alignment * 4 1926 }; 1927 1928 PREFIX_PUSH(); 1929 1930 reset_memblock_regions(); 1931 memblock_add(r.base, r.size); 1932 memblock_trim_memory(alignment); 1933 1934 ASSERT_EQ(rgn->base, r.base); 1935 ASSERT_EQ(rgn->size, r.size); 1936 1937 ASSERT_EQ(memblock.memory.cnt, 1); 1938 1939 test_pass_pop(); 1940 1941 return 0; 1942 } 1943 1944 /* 1945 * A test that tries to trim memory when there are two available regions, r1 and 1946 * r2. Region r1 is aligned on both ends and region r2 is unaligned on one end 1947 * and smaller than the alignment: 1948 * 1949 * alignment 1950 * |--------| 1951 * | +-----------------+ +------+ | 1952 * | | r1 | | r2 | | 1953 * +--------+-----------------+--------+------+---+ 1954 * ^ ^ ^ ^ ^ 1955 * |________|________|________| | 1956 * | Unaligned address 1957 * Aligned addresses 1958 * 1959 * Expect that r1 will not be trimmed and r2 will be removed. Expect the 1960 * counter to be updated. 1961 */ 1962 static int memblock_trim_memory_too_small_check(void) 1963 { 1964 struct memblock_region *rgn; 1965 const phys_addr_t alignment = SMP_CACHE_BYTES; 1966 1967 rgn = &memblock.memory.regions[0]; 1968 1969 struct region r1 = { 1970 .base = alignment, 1971 .size = alignment * 2 1972 }; 1973 struct region r2 = { 1974 .base = alignment * 4, 1975 .size = alignment - SZ_2 1976 }; 1977 1978 PREFIX_PUSH(); 1979 1980 reset_memblock_regions(); 1981 memblock_add(r1.base, r1.size); 1982 memblock_add(r2.base, r2.size); 1983 memblock_trim_memory(alignment); 1984 1985 ASSERT_EQ(rgn->base, r1.base); 1986 ASSERT_EQ(rgn->size, r1.size); 1987 1988 ASSERT_EQ(memblock.memory.cnt, 1); 1989 1990 test_pass_pop(); 1991 1992 return 0; 1993 } 1994 1995 /* 1996 * A test that tries to trim memory when there are two available regions, r1 and 1997 * r2. Region r1 is aligned on both ends and region r2 is unaligned at the base 1998 * and aligned at the end: 1999 * 2000 * Unaligned address 2001 * | 2002 * v 2003 * | +-----------------+ +---------------+ | 2004 * | | r1 | | r2 | | 2005 * +--------+-----------------+----------+---------------+---+ 2006 * ^ ^ ^ ^ ^ ^ 2007 * |________|________|________|________|________| 2008 * | 2009 * Aligned addresses 2010 * 2011 * Expect that r1 will not be trimmed and r2 will be trimmed at the base. 2012 * Expect the counter to not be updated. 2013 */ 2014 static int memblock_trim_memory_unaligned_base_check(void) 2015 { 2016 struct memblock_region *rgn1, *rgn2; 2017 const phys_addr_t alignment = SMP_CACHE_BYTES; 2018 phys_addr_t offset = SZ_2; 2019 phys_addr_t new_r2_base, new_r2_size; 2020 2021 rgn1 = &memblock.memory.regions[0]; 2022 rgn2 = &memblock.memory.regions[1]; 2023 2024 struct region r1 = { 2025 .base = alignment, 2026 .size = alignment * 2 2027 }; 2028 struct region r2 = { 2029 .base = alignment * 4 + offset, 2030 .size = alignment * 2 - offset 2031 }; 2032 2033 PREFIX_PUSH(); 2034 2035 new_r2_base = r2.base + (alignment - offset); 2036 new_r2_size = r2.size - (alignment - offset); 2037 2038 reset_memblock_regions(); 2039 memblock_add(r1.base, r1.size); 2040 memblock_add(r2.base, r2.size); 2041 memblock_trim_memory(alignment); 2042 2043 ASSERT_EQ(rgn1->base, r1.base); 2044 ASSERT_EQ(rgn1->size, r1.size); 2045 2046 ASSERT_EQ(rgn2->base, new_r2_base); 2047 ASSERT_EQ(rgn2->size, new_r2_size); 2048 2049 ASSERT_EQ(memblock.memory.cnt, 2); 2050 2051 test_pass_pop(); 2052 2053 return 0; 2054 } 2055 2056 /* 2057 * A test that tries to trim memory when there are two available regions, r1 and 2058 * r2. Region r1 is aligned on both ends and region r2 is aligned at the base 2059 * and unaligned at the end: 2060 * 2061 * Unaligned address 2062 * | 2063 * v 2064 * | +-----------------+ +---------------+ | 2065 * | | r1 | | r2 | | 2066 * +--------+-----------------+--------+---------------+---+ 2067 * ^ ^ ^ ^ ^ ^ 2068 * |________|________|________|________|________| 2069 * | 2070 * Aligned addresses 2071 * 2072 * Expect that r1 will not be trimmed and r2 will be trimmed at the end. 2073 * Expect the counter to not be updated. 2074 */ 2075 static int memblock_trim_memory_unaligned_end_check(void) 2076 { 2077 struct memblock_region *rgn1, *rgn2; 2078 const phys_addr_t alignment = SMP_CACHE_BYTES; 2079 phys_addr_t offset = SZ_2; 2080 phys_addr_t new_r2_size; 2081 2082 rgn1 = &memblock.memory.regions[0]; 2083 rgn2 = &memblock.memory.regions[1]; 2084 2085 struct region r1 = { 2086 .base = alignment, 2087 .size = alignment * 2 2088 }; 2089 struct region r2 = { 2090 .base = alignment * 4, 2091 .size = alignment * 2 - offset 2092 }; 2093 2094 PREFIX_PUSH(); 2095 2096 new_r2_size = r2.size - (alignment - offset); 2097 2098 reset_memblock_regions(); 2099 memblock_add(r1.base, r1.size); 2100 memblock_add(r2.base, r2.size); 2101 memblock_trim_memory(alignment); 2102 2103 ASSERT_EQ(rgn1->base, r1.base); 2104 ASSERT_EQ(rgn1->size, r1.size); 2105 2106 ASSERT_EQ(rgn2->base, r2.base); 2107 ASSERT_EQ(rgn2->size, new_r2_size); 2108 2109 ASSERT_EQ(memblock.memory.cnt, 2); 2110 2111 test_pass_pop(); 2112 2113 return 0; 2114 } 2115 2116 static int memblock_trim_memory_checks(void) 2117 { 2118 prefix_reset(); 2119 prefix_push(FUNC_TRIM); 2120 test_print("Running %s tests...\n", FUNC_TRIM); 2121 2122 memblock_trim_memory_aligned_check(); 2123 memblock_trim_memory_too_small_check(); 2124 memblock_trim_memory_unaligned_base_check(); 2125 memblock_trim_memory_unaligned_end_check(); 2126 2127 prefix_pop(); 2128 2129 return 0; 2130 } 2131 2132 int memblock_basic_checks(void) 2133 { 2134 memblock_initialization_check(); 2135 memblock_add_checks(); 2136 memblock_reserve_checks(); 2137 memblock_remove_checks(); 2138 memblock_free_checks(); 2139 memblock_bottom_up_checks(); 2140 memblock_trim_memory_checks(); 2141 2142 return 0; 2143 } 2144