0001
0002 #include "alloc_nid_api.h"
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 static int alloc_try_nid_top_down_simple_check(void)
0019 {
0020 struct memblock_region *rgn = &memblock.reserved.regions[0];
0021 void *allocated_ptr = NULL;
0022 char *b;
0023
0024 PREFIX_PUSH();
0025
0026 phys_addr_t size = SZ_128;
0027 phys_addr_t min_addr;
0028 phys_addr_t max_addr;
0029 phys_addr_t rgn_end;
0030
0031 setup_memblock();
0032
0033 min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES * 2;
0034 max_addr = min_addr + SZ_512;
0035
0036 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0037 min_addr, max_addr, NUMA_NO_NODE);
0038 b = (char *)allocated_ptr;
0039 rgn_end = rgn->base + rgn->size;
0040
0041 ASSERT_NE(allocated_ptr, NULL);
0042 ASSERT_EQ(*b, 0);
0043
0044 ASSERT_EQ(rgn->size, size);
0045 ASSERT_EQ(rgn->base, max_addr - size);
0046 ASSERT_EQ(rgn_end, max_addr);
0047
0048 ASSERT_EQ(memblock.reserved.cnt, 1);
0049 ASSERT_EQ(memblock.reserved.total_size, size);
0050
0051 test_pass_pop();
0052
0053 return 0;
0054 }
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 static int alloc_try_nid_top_down_end_misaligned_check(void)
0074 {
0075 struct memblock_region *rgn = &memblock.reserved.regions[0];
0076 void *allocated_ptr = NULL;
0077 char *b;
0078
0079 PREFIX_PUSH();
0080
0081 phys_addr_t size = SZ_128;
0082 phys_addr_t misalign = SZ_2;
0083 phys_addr_t min_addr;
0084 phys_addr_t max_addr;
0085 phys_addr_t rgn_end;
0086
0087 setup_memblock();
0088
0089 min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES * 2;
0090 max_addr = min_addr + SZ_512 + misalign;
0091
0092 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0093 min_addr, max_addr, NUMA_NO_NODE);
0094 b = (char *)allocated_ptr;
0095 rgn_end = rgn->base + rgn->size;
0096
0097 ASSERT_NE(allocated_ptr, NULL);
0098 ASSERT_EQ(*b, 0);
0099
0100 ASSERT_EQ(rgn->size, size);
0101 ASSERT_EQ(rgn->base, max_addr - size - misalign);
0102 ASSERT_LT(rgn_end, max_addr);
0103
0104 ASSERT_EQ(memblock.reserved.cnt, 1);
0105 ASSERT_EQ(memblock.reserved.total_size, size);
0106
0107 test_pass_pop();
0108
0109 return 0;
0110 }
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127 static int alloc_try_nid_exact_address_generic_check(void)
0128 {
0129 struct memblock_region *rgn = &memblock.reserved.regions[0];
0130 void *allocated_ptr = NULL;
0131 char *b;
0132
0133 PREFIX_PUSH();
0134
0135 phys_addr_t size = SZ_1K;
0136 phys_addr_t min_addr;
0137 phys_addr_t max_addr;
0138 phys_addr_t rgn_end;
0139
0140 setup_memblock();
0141
0142 min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES;
0143 max_addr = min_addr + size;
0144
0145 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0146 min_addr, max_addr, NUMA_NO_NODE);
0147 b = (char *)allocated_ptr;
0148 rgn_end = rgn->base + rgn->size;
0149
0150 ASSERT_NE(allocated_ptr, NULL);
0151 ASSERT_EQ(*b, 0);
0152
0153 ASSERT_EQ(rgn->size, size);
0154 ASSERT_EQ(rgn->base, min_addr);
0155 ASSERT_EQ(rgn_end, max_addr);
0156
0157 ASSERT_EQ(memblock.reserved.cnt, 1);
0158 ASSERT_EQ(memblock.reserved.total_size, size);
0159
0160 test_pass_pop();
0161
0162 return 0;
0163 }
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182 static int alloc_try_nid_top_down_narrow_range_check(void)
0183 {
0184 struct memblock_region *rgn = &memblock.reserved.regions[0];
0185 void *allocated_ptr = NULL;
0186 char *b;
0187
0188 PREFIX_PUSH();
0189
0190 phys_addr_t size = SZ_256;
0191 phys_addr_t min_addr;
0192 phys_addr_t max_addr;
0193
0194 setup_memblock();
0195
0196 min_addr = memblock_start_of_DRAM() + SZ_512;
0197 max_addr = min_addr + SMP_CACHE_BYTES;
0198
0199 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0200 min_addr, max_addr, NUMA_NO_NODE);
0201 b = (char *)allocated_ptr;
0202
0203 ASSERT_NE(allocated_ptr, NULL);
0204 ASSERT_EQ(*b, 0);
0205
0206 ASSERT_EQ(rgn->size, size);
0207 ASSERT_EQ(rgn->base, max_addr - size);
0208
0209 ASSERT_EQ(memblock.reserved.cnt, 1);
0210 ASSERT_EQ(memblock.reserved.total_size, size);
0211
0212 test_pass_pop();
0213
0214 return 0;
0215 }
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237 static int alloc_try_nid_low_max_generic_check(void)
0238 {
0239 void *allocated_ptr = NULL;
0240
0241 PREFIX_PUSH();
0242
0243 phys_addr_t size = SZ_1K;
0244 phys_addr_t min_addr;
0245 phys_addr_t max_addr;
0246
0247 setup_memblock();
0248
0249 min_addr = memblock_start_of_DRAM();
0250 max_addr = min_addr + SMP_CACHE_BYTES;
0251
0252 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0253 min_addr, max_addr, NUMA_NO_NODE);
0254
0255 ASSERT_EQ(allocated_ptr, NULL);
0256
0257 test_pass_pop();
0258
0259 return 0;
0260 }
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276 static int alloc_try_nid_min_reserved_generic_check(void)
0277 {
0278 struct memblock_region *rgn = &memblock.reserved.regions[0];
0279 void *allocated_ptr = NULL;
0280 char *b;
0281
0282 PREFIX_PUSH();
0283
0284 phys_addr_t r1_size = SZ_128;
0285 phys_addr_t r2_size = SZ_64;
0286 phys_addr_t total_size = r1_size + r2_size;
0287 phys_addr_t min_addr;
0288 phys_addr_t max_addr;
0289 phys_addr_t reserved_base;
0290
0291 setup_memblock();
0292
0293 max_addr = memblock_end_of_DRAM();
0294 min_addr = max_addr - r2_size;
0295 reserved_base = min_addr - r1_size;
0296
0297 memblock_reserve(reserved_base, r1_size);
0298
0299 allocated_ptr = memblock_alloc_try_nid(r2_size, SMP_CACHE_BYTES,
0300 min_addr, max_addr, NUMA_NO_NODE);
0301 b = (char *)allocated_ptr;
0302
0303 ASSERT_NE(allocated_ptr, NULL);
0304 ASSERT_EQ(*b, 0);
0305
0306 ASSERT_EQ(rgn->size, total_size);
0307 ASSERT_EQ(rgn->base, reserved_base);
0308
0309 ASSERT_EQ(memblock.reserved.cnt, 1);
0310 ASSERT_EQ(memblock.reserved.total_size, total_size);
0311
0312 test_pass_pop();
0313
0314 return 0;
0315 }
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331 static int alloc_try_nid_max_reserved_generic_check(void)
0332 {
0333 struct memblock_region *rgn = &memblock.reserved.regions[0];
0334 void *allocated_ptr = NULL;
0335 char *b;
0336
0337 PREFIX_PUSH();
0338
0339 phys_addr_t r1_size = SZ_64;
0340 phys_addr_t r2_size = SZ_128;
0341 phys_addr_t total_size = r1_size + r2_size;
0342 phys_addr_t min_addr;
0343 phys_addr_t max_addr;
0344
0345 setup_memblock();
0346
0347 max_addr = memblock_end_of_DRAM() - r1_size;
0348 min_addr = max_addr - r2_size;
0349
0350 memblock_reserve(max_addr, r1_size);
0351
0352 allocated_ptr = memblock_alloc_try_nid(r2_size, SMP_CACHE_BYTES,
0353 min_addr, max_addr, NUMA_NO_NODE);
0354 b = (char *)allocated_ptr;
0355
0356 ASSERT_NE(allocated_ptr, NULL);
0357 ASSERT_EQ(*b, 0);
0358
0359 ASSERT_EQ(rgn->size, total_size);
0360 ASSERT_EQ(rgn->base, min_addr);
0361
0362 ASSERT_EQ(memblock.reserved.cnt, 1);
0363 ASSERT_EQ(memblock.reserved.total_size, total_size);
0364
0365 test_pass_pop();
0366
0367 return 0;
0368 }
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387 static int alloc_try_nid_top_down_reserved_with_space_check(void)
0388 {
0389 struct memblock_region *rgn1 = &memblock.reserved.regions[1];
0390 struct memblock_region *rgn2 = &memblock.reserved.regions[0];
0391 void *allocated_ptr = NULL;
0392 char *b;
0393 struct region r1, r2;
0394
0395 PREFIX_PUSH();
0396
0397 phys_addr_t r3_size = SZ_64;
0398 phys_addr_t gap_size = SMP_CACHE_BYTES;
0399 phys_addr_t total_size;
0400 phys_addr_t max_addr;
0401 phys_addr_t min_addr;
0402
0403 setup_memblock();
0404
0405 r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
0406 r1.size = SMP_CACHE_BYTES;
0407
0408 r2.size = SZ_128;
0409 r2.base = r1.base - (r3_size + gap_size + r2.size);
0410
0411 total_size = r1.size + r2.size + r3_size;
0412 min_addr = r2.base + r2.size;
0413 max_addr = r1.base;
0414
0415 memblock_reserve(r1.base, r1.size);
0416 memblock_reserve(r2.base, r2.size);
0417
0418 allocated_ptr = memblock_alloc_try_nid(r3_size, SMP_CACHE_BYTES,
0419 min_addr, max_addr, NUMA_NO_NODE);
0420 b = (char *)allocated_ptr;
0421
0422 ASSERT_NE(allocated_ptr, NULL);
0423 ASSERT_EQ(*b, 0);
0424
0425 ASSERT_EQ(rgn1->size, r1.size + r3_size);
0426 ASSERT_EQ(rgn1->base, max_addr - r3_size);
0427
0428 ASSERT_EQ(rgn2->size, r2.size);
0429 ASSERT_EQ(rgn2->base, r2.base);
0430
0431 ASSERT_EQ(memblock.reserved.cnt, 2);
0432 ASSERT_EQ(memblock.reserved.total_size, total_size);
0433
0434 test_pass_pop();
0435
0436 return 0;
0437 }
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455 static int alloc_try_nid_reserved_full_merge_generic_check(void)
0456 {
0457 struct memblock_region *rgn = &memblock.reserved.regions[0];
0458 void *allocated_ptr = NULL;
0459 char *b;
0460 struct region r1, r2;
0461
0462 PREFIX_PUSH();
0463
0464 phys_addr_t r3_size = SZ_64;
0465 phys_addr_t total_size;
0466 phys_addr_t max_addr;
0467 phys_addr_t min_addr;
0468
0469 setup_memblock();
0470
0471 r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
0472 r1.size = SMP_CACHE_BYTES;
0473
0474 r2.size = SZ_128;
0475 r2.base = r1.base - (r3_size + r2.size);
0476
0477 total_size = r1.size + r2.size + r3_size;
0478 min_addr = r2.base + r2.size;
0479 max_addr = r1.base;
0480
0481 memblock_reserve(r1.base, r1.size);
0482 memblock_reserve(r2.base, r2.size);
0483
0484 allocated_ptr = memblock_alloc_try_nid(r3_size, SMP_CACHE_BYTES,
0485 min_addr, max_addr, NUMA_NO_NODE);
0486 b = (char *)allocated_ptr;
0487
0488 ASSERT_NE(allocated_ptr, NULL);
0489 ASSERT_EQ(*b, 0);
0490
0491 ASSERT_EQ(rgn->size, total_size);
0492 ASSERT_EQ(rgn->base, r2.base);
0493
0494 ASSERT_EQ(memblock.reserved.cnt, 1);
0495 ASSERT_EQ(memblock.reserved.total_size, total_size);
0496
0497 test_pass_pop();
0498
0499 return 0;
0500 }
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520 static int alloc_try_nid_top_down_reserved_no_space_check(void)
0521 {
0522 struct memblock_region *rgn1 = &memblock.reserved.regions[1];
0523 struct memblock_region *rgn2 = &memblock.reserved.regions[0];
0524 void *allocated_ptr = NULL;
0525 char *b;
0526 struct region r1, r2;
0527
0528 PREFIX_PUSH();
0529
0530 phys_addr_t r3_size = SZ_256;
0531 phys_addr_t gap_size = SMP_CACHE_BYTES;
0532 phys_addr_t total_size;
0533 phys_addr_t max_addr;
0534 phys_addr_t min_addr;
0535
0536 setup_memblock();
0537
0538 r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
0539 r1.size = SMP_CACHE_BYTES;
0540
0541 r2.size = SZ_128;
0542 r2.base = r1.base - (r2.size + gap_size);
0543
0544 total_size = r1.size + r2.size + r3_size;
0545 min_addr = r2.base + r2.size;
0546 max_addr = r1.base;
0547
0548 memblock_reserve(r1.base, r1.size);
0549 memblock_reserve(r2.base, r2.size);
0550
0551 allocated_ptr = memblock_alloc_try_nid(r3_size, SMP_CACHE_BYTES,
0552 min_addr, max_addr, NUMA_NO_NODE);
0553 b = (char *)allocated_ptr;
0554
0555 ASSERT_NE(allocated_ptr, NULL);
0556 ASSERT_EQ(*b, 0);
0557
0558 ASSERT_EQ(rgn1->size, r1.size);
0559 ASSERT_EQ(rgn1->base, r1.base);
0560
0561 ASSERT_EQ(rgn2->size, r2.size + r3_size);
0562 ASSERT_EQ(rgn2->base, r2.base - r3_size);
0563
0564 ASSERT_EQ(memblock.reserved.cnt, 2);
0565 ASSERT_EQ(memblock.reserved.total_size, total_size);
0566
0567 test_pass_pop();
0568
0569 return 0;
0570 }
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592 static int alloc_try_nid_reserved_all_generic_check(void)
0593 {
0594 void *allocated_ptr = NULL;
0595 struct region r1, r2;
0596
0597 PREFIX_PUSH();
0598
0599 phys_addr_t r3_size = SZ_256;
0600 phys_addr_t gap_size = SMP_CACHE_BYTES;
0601 phys_addr_t max_addr;
0602 phys_addr_t min_addr;
0603
0604 setup_memblock();
0605
0606 r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES;
0607 r1.size = SMP_CACHE_BYTES;
0608
0609 r2.size = MEM_SIZE - (r1.size + gap_size);
0610 r2.base = memblock_start_of_DRAM();
0611
0612 min_addr = r2.base + r2.size;
0613 max_addr = r1.base;
0614
0615 memblock_reserve(r1.base, r1.size);
0616 memblock_reserve(r2.base, r2.size);
0617
0618 allocated_ptr = memblock_alloc_try_nid(r3_size, SMP_CACHE_BYTES,
0619 min_addr, max_addr, NUMA_NO_NODE);
0620
0621 ASSERT_EQ(allocated_ptr, NULL);
0622
0623 test_pass_pop();
0624
0625 return 0;
0626 }
0627
0628
0629
0630
0631
0632
0633 static int alloc_try_nid_top_down_cap_max_check(void)
0634 {
0635 struct memblock_region *rgn = &memblock.reserved.regions[0];
0636 void *allocated_ptr = NULL;
0637 char *b;
0638
0639 PREFIX_PUSH();
0640
0641 phys_addr_t size = SZ_256;
0642 phys_addr_t min_addr;
0643 phys_addr_t max_addr;
0644
0645 setup_memblock();
0646
0647 min_addr = memblock_end_of_DRAM() - SZ_1K;
0648 max_addr = memblock_end_of_DRAM() + SZ_256;
0649
0650 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0651 min_addr, max_addr, NUMA_NO_NODE);
0652 b = (char *)allocated_ptr;
0653
0654 ASSERT_NE(allocated_ptr, NULL);
0655 ASSERT_EQ(*b, 0);
0656
0657 ASSERT_EQ(rgn->size, size);
0658 ASSERT_EQ(rgn->base, memblock_end_of_DRAM() - size);
0659
0660 ASSERT_EQ(memblock.reserved.cnt, 1);
0661 ASSERT_EQ(memblock.reserved.total_size, size);
0662
0663 test_pass_pop();
0664
0665 return 0;
0666 }
0667
0668
0669
0670
0671
0672
0673 static int alloc_try_nid_top_down_cap_min_check(void)
0674 {
0675 struct memblock_region *rgn = &memblock.reserved.regions[0];
0676 void *allocated_ptr = NULL;
0677 char *b;
0678
0679 PREFIX_PUSH();
0680
0681 phys_addr_t size = SZ_1K;
0682 phys_addr_t min_addr;
0683 phys_addr_t max_addr;
0684
0685 setup_memblock();
0686
0687 min_addr = memblock_start_of_DRAM() - SZ_256;
0688 max_addr = memblock_end_of_DRAM();
0689
0690 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0691 min_addr, max_addr, NUMA_NO_NODE);
0692 b = (char *)allocated_ptr;
0693
0694 ASSERT_NE(allocated_ptr, NULL);
0695 ASSERT_EQ(*b, 0);
0696
0697 ASSERT_EQ(rgn->size, size);
0698 ASSERT_EQ(rgn->base, memblock_end_of_DRAM() - size);
0699
0700 ASSERT_EQ(memblock.reserved.cnt, 1);
0701 ASSERT_EQ(memblock.reserved.total_size, size);
0702
0703 test_pass_pop();
0704
0705 return 0;
0706 }
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722 static int alloc_try_nid_bottom_up_simple_check(void)
0723 {
0724 struct memblock_region *rgn = &memblock.reserved.regions[0];
0725 void *allocated_ptr = NULL;
0726 char *b;
0727
0728 PREFIX_PUSH();
0729
0730 phys_addr_t size = SZ_128;
0731 phys_addr_t min_addr;
0732 phys_addr_t max_addr;
0733 phys_addr_t rgn_end;
0734
0735 setup_memblock();
0736
0737 min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES * 2;
0738 max_addr = min_addr + SZ_512;
0739
0740 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0741 min_addr, max_addr,
0742 NUMA_NO_NODE);
0743 b = (char *)allocated_ptr;
0744 rgn_end = rgn->base + rgn->size;
0745
0746 ASSERT_NE(allocated_ptr, NULL);
0747 ASSERT_EQ(*b, 0);
0748
0749 ASSERT_EQ(rgn->size, size);
0750 ASSERT_EQ(rgn->base, min_addr);
0751 ASSERT_LT(rgn_end, max_addr);
0752
0753 ASSERT_EQ(memblock.reserved.cnt, 1);
0754 ASSERT_EQ(memblock.reserved.total_size, size);
0755
0756 test_pass_pop();
0757
0758 return 0;
0759 }
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778 static int alloc_try_nid_bottom_up_start_misaligned_check(void)
0779 {
0780 struct memblock_region *rgn = &memblock.reserved.regions[0];
0781 void *allocated_ptr = NULL;
0782 char *b;
0783
0784 PREFIX_PUSH();
0785
0786 phys_addr_t size = SZ_128;
0787 phys_addr_t misalign = SZ_2;
0788 phys_addr_t min_addr;
0789 phys_addr_t max_addr;
0790 phys_addr_t rgn_end;
0791
0792 setup_memblock();
0793
0794 min_addr = memblock_start_of_DRAM() + misalign;
0795 max_addr = min_addr + SZ_512;
0796
0797 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0798 min_addr, max_addr,
0799 NUMA_NO_NODE);
0800 b = (char *)allocated_ptr;
0801 rgn_end = rgn->base + rgn->size;
0802
0803 ASSERT_NE(allocated_ptr, NULL);
0804 ASSERT_EQ(*b, 0);
0805
0806 ASSERT_EQ(rgn->size, size);
0807 ASSERT_EQ(rgn->base, min_addr + (SMP_CACHE_BYTES - misalign));
0808 ASSERT_LT(rgn_end, max_addr);
0809
0810 ASSERT_EQ(memblock.reserved.cnt, 1);
0811 ASSERT_EQ(memblock.reserved.total_size, size);
0812
0813 test_pass_pop();
0814
0815 return 0;
0816 }
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835 static int alloc_try_nid_bottom_up_narrow_range_check(void)
0836 {
0837 struct memblock_region *rgn = &memblock.reserved.regions[0];
0838 void *allocated_ptr = NULL;
0839 char *b;
0840
0841 PREFIX_PUSH();
0842
0843 phys_addr_t size = SZ_256;
0844 phys_addr_t min_addr;
0845 phys_addr_t max_addr;
0846
0847 setup_memblock();
0848
0849 min_addr = memblock_start_of_DRAM() + SZ_512;
0850 max_addr = min_addr + SMP_CACHE_BYTES;
0851
0852 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
0853 min_addr, max_addr,
0854 NUMA_NO_NODE);
0855 b = (char *)allocated_ptr;
0856
0857 ASSERT_NE(allocated_ptr, NULL);
0858 ASSERT_EQ(*b, 0);
0859
0860 ASSERT_EQ(rgn->size, size);
0861 ASSERT_EQ(rgn->base, memblock_start_of_DRAM());
0862
0863 ASSERT_EQ(memblock.reserved.cnt, 1);
0864 ASSERT_EQ(memblock.reserved.total_size, size);
0865
0866 test_pass_pop();
0867
0868 return 0;
0869 }
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888 static int alloc_try_nid_bottom_up_reserved_with_space_check(void)
0889 {
0890 struct memblock_region *rgn1 = &memblock.reserved.regions[1];
0891 struct memblock_region *rgn2 = &memblock.reserved.regions[0];
0892 void *allocated_ptr = NULL;
0893 char *b;
0894 struct region r1, r2;
0895
0896 PREFIX_PUSH();
0897
0898 phys_addr_t r3_size = SZ_64;
0899 phys_addr_t gap_size = SMP_CACHE_BYTES;
0900 phys_addr_t total_size;
0901 phys_addr_t max_addr;
0902 phys_addr_t min_addr;
0903
0904 setup_memblock();
0905
0906 r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
0907 r1.size = SMP_CACHE_BYTES;
0908
0909 r2.size = SZ_128;
0910 r2.base = r1.base - (r3_size + gap_size + r2.size);
0911
0912 total_size = r1.size + r2.size + r3_size;
0913 min_addr = r2.base + r2.size;
0914 max_addr = r1.base;
0915
0916 memblock_reserve(r1.base, r1.size);
0917 memblock_reserve(r2.base, r2.size);
0918
0919 allocated_ptr = memblock_alloc_try_nid(r3_size, SMP_CACHE_BYTES,
0920 min_addr, max_addr,
0921 NUMA_NO_NODE);
0922 b = (char *)allocated_ptr;
0923
0924 ASSERT_NE(allocated_ptr, NULL);
0925 ASSERT_EQ(*b, 0);
0926
0927 ASSERT_EQ(rgn1->size, r1.size);
0928 ASSERT_EQ(rgn1->base, max_addr);
0929
0930 ASSERT_EQ(rgn2->size, r2.size + r3_size);
0931 ASSERT_EQ(rgn2->base, r2.base);
0932
0933 ASSERT_EQ(memblock.reserved.cnt, 2);
0934 ASSERT_EQ(memblock.reserved.total_size, total_size);
0935
0936 test_pass_pop();
0937
0938 return 0;
0939 }
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961 static int alloc_try_nid_bottom_up_reserved_no_space_check(void)
0962 {
0963 struct memblock_region *rgn1 = &memblock.reserved.regions[2];
0964 struct memblock_region *rgn2 = &memblock.reserved.regions[1];
0965 struct memblock_region *rgn3 = &memblock.reserved.regions[0];
0966 void *allocated_ptr = NULL;
0967 char *b;
0968 struct region r1, r2;
0969
0970 PREFIX_PUSH();
0971
0972 phys_addr_t r3_size = SZ_256;
0973 phys_addr_t gap_size = SMP_CACHE_BYTES;
0974 phys_addr_t total_size;
0975 phys_addr_t max_addr;
0976 phys_addr_t min_addr;
0977
0978 setup_memblock();
0979
0980 r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
0981 r1.size = SMP_CACHE_BYTES;
0982
0983 r2.size = SZ_128;
0984 r2.base = r1.base - (r2.size + gap_size);
0985
0986 total_size = r1.size + r2.size + r3_size;
0987 min_addr = r2.base + r2.size;
0988 max_addr = r1.base;
0989
0990 memblock_reserve(r1.base, r1.size);
0991 memblock_reserve(r2.base, r2.size);
0992
0993 allocated_ptr = memblock_alloc_try_nid(r3_size, SMP_CACHE_BYTES,
0994 min_addr, max_addr,
0995 NUMA_NO_NODE);
0996 b = (char *)allocated_ptr;
0997
0998 ASSERT_NE(allocated_ptr, NULL);
0999 ASSERT_EQ(*b, 0);
1000
1001 ASSERT_EQ(rgn3->size, r3_size);
1002 ASSERT_EQ(rgn3->base, memblock_start_of_DRAM());
1003
1004 ASSERT_EQ(rgn2->size, r2.size);
1005 ASSERT_EQ(rgn2->base, r2.base);
1006
1007 ASSERT_EQ(rgn1->size, r1.size);
1008 ASSERT_EQ(rgn1->base, r1.base);
1009
1010 ASSERT_EQ(memblock.reserved.cnt, 3);
1011 ASSERT_EQ(memblock.reserved.total_size, total_size);
1012
1013 test_pass_pop();
1014
1015 return 0;
1016 }
1017
1018
1019
1020
1021
1022
1023 static int alloc_try_nid_bottom_up_cap_max_check(void)
1024 {
1025 struct memblock_region *rgn = &memblock.reserved.regions[0];
1026 void *allocated_ptr = NULL;
1027 char *b;
1028
1029 PREFIX_PUSH();
1030
1031 phys_addr_t size = SZ_256;
1032 phys_addr_t min_addr;
1033 phys_addr_t max_addr;
1034
1035 setup_memblock();
1036
1037 min_addr = memblock_start_of_DRAM() + SZ_1K;
1038 max_addr = memblock_end_of_DRAM() + SZ_256;
1039
1040 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
1041 min_addr, max_addr,
1042 NUMA_NO_NODE);
1043 b = (char *)allocated_ptr;
1044
1045 ASSERT_NE(allocated_ptr, NULL);
1046 ASSERT_EQ(*b, 0);
1047
1048 ASSERT_EQ(rgn->size, size);
1049 ASSERT_EQ(rgn->base, min_addr);
1050
1051 ASSERT_EQ(memblock.reserved.cnt, 1);
1052 ASSERT_EQ(memblock.reserved.total_size, size);
1053
1054 test_pass_pop();
1055
1056 return 0;
1057 }
1058
1059
1060
1061
1062
1063
1064 static int alloc_try_nid_bottom_up_cap_min_check(void)
1065 {
1066 struct memblock_region *rgn = &memblock.reserved.regions[0];
1067 void *allocated_ptr = NULL;
1068 char *b;
1069
1070 PREFIX_PUSH();
1071
1072 phys_addr_t size = SZ_1K;
1073 phys_addr_t min_addr;
1074 phys_addr_t max_addr;
1075
1076 setup_memblock();
1077
1078 min_addr = memblock_start_of_DRAM();
1079 max_addr = memblock_end_of_DRAM() - SZ_256;
1080
1081 allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
1082 min_addr, max_addr,
1083 NUMA_NO_NODE);
1084 b = (char *)allocated_ptr;
1085
1086 ASSERT_NE(allocated_ptr, NULL);
1087 ASSERT_EQ(*b, 0);
1088
1089 ASSERT_EQ(rgn->size, size);
1090 ASSERT_EQ(rgn->base, memblock_start_of_DRAM());
1091
1092 ASSERT_EQ(memblock.reserved.cnt, 1);
1093 ASSERT_EQ(memblock.reserved.total_size, size);
1094
1095 test_pass_pop();
1096
1097 return 0;
1098 }
1099
1100
1101 static int alloc_try_nid_simple_check(void)
1102 {
1103 test_print("\tRunning %s...\n", __func__);
1104 memblock_set_bottom_up(false);
1105 alloc_try_nid_top_down_simple_check();
1106 memblock_set_bottom_up(true);
1107 alloc_try_nid_bottom_up_simple_check();
1108
1109 return 0;
1110 }
1111
1112 static int alloc_try_nid_misaligned_check(void)
1113 {
1114 test_print("\tRunning %s...\n", __func__);
1115 memblock_set_bottom_up(false);
1116 alloc_try_nid_top_down_end_misaligned_check();
1117 memblock_set_bottom_up(true);
1118 alloc_try_nid_bottom_up_start_misaligned_check();
1119
1120 return 0;
1121 }
1122
1123 static int alloc_try_nid_narrow_range_check(void)
1124 {
1125 test_print("\tRunning %s...\n", __func__);
1126 memblock_set_bottom_up(false);
1127 alloc_try_nid_top_down_narrow_range_check();
1128 memblock_set_bottom_up(true);
1129 alloc_try_nid_bottom_up_narrow_range_check();
1130
1131 return 0;
1132 }
1133
1134 static int alloc_try_nid_reserved_with_space_check(void)
1135 {
1136 test_print("\tRunning %s...\n", __func__);
1137 memblock_set_bottom_up(false);
1138 alloc_try_nid_top_down_reserved_with_space_check();
1139 memblock_set_bottom_up(true);
1140 alloc_try_nid_bottom_up_reserved_with_space_check();
1141
1142 return 0;
1143 }
1144
1145 static int alloc_try_nid_reserved_no_space_check(void)
1146 {
1147 test_print("\tRunning %s...\n", __func__);
1148 memblock_set_bottom_up(false);
1149 alloc_try_nid_top_down_reserved_no_space_check();
1150 memblock_set_bottom_up(true);
1151 alloc_try_nid_bottom_up_reserved_no_space_check();
1152
1153 return 0;
1154 }
1155
1156 static int alloc_try_nid_cap_max_check(void)
1157 {
1158 test_print("\tRunning %s...\n", __func__);
1159 memblock_set_bottom_up(false);
1160 alloc_try_nid_top_down_cap_max_check();
1161 memblock_set_bottom_up(true);
1162 alloc_try_nid_bottom_up_cap_max_check();
1163
1164 return 0;
1165 }
1166
1167 static int alloc_try_nid_cap_min_check(void)
1168 {
1169 test_print("\tRunning %s...\n", __func__);
1170 memblock_set_bottom_up(false);
1171 alloc_try_nid_top_down_cap_min_check();
1172 memblock_set_bottom_up(true);
1173 alloc_try_nid_bottom_up_cap_min_check();
1174
1175 return 0;
1176 }
1177
1178 static int alloc_try_nid_min_reserved_check(void)
1179 {
1180 test_print("\tRunning %s...\n", __func__);
1181 memblock_set_bottom_up(false);
1182 alloc_try_nid_min_reserved_generic_check();
1183 memblock_set_bottom_up(true);
1184 alloc_try_nid_min_reserved_generic_check();
1185
1186 return 0;
1187 }
1188
1189 static int alloc_try_nid_max_reserved_check(void)
1190 {
1191 test_print("\tRunning %s...\n", __func__);
1192 memblock_set_bottom_up(false);
1193 alloc_try_nid_max_reserved_generic_check();
1194 memblock_set_bottom_up(true);
1195 alloc_try_nid_max_reserved_generic_check();
1196
1197 return 0;
1198 }
1199
1200 static int alloc_try_nid_exact_address_check(void)
1201 {
1202 test_print("\tRunning %s...\n", __func__);
1203 memblock_set_bottom_up(false);
1204 alloc_try_nid_exact_address_generic_check();
1205 memblock_set_bottom_up(true);
1206 alloc_try_nid_exact_address_generic_check();
1207
1208 return 0;
1209 }
1210
1211 static int alloc_try_nid_reserved_full_merge_check(void)
1212 {
1213 test_print("\tRunning %s...\n", __func__);
1214 memblock_set_bottom_up(false);
1215 alloc_try_nid_reserved_full_merge_generic_check();
1216 memblock_set_bottom_up(true);
1217 alloc_try_nid_reserved_full_merge_generic_check();
1218
1219 return 0;
1220 }
1221
1222 static int alloc_try_nid_reserved_all_check(void)
1223 {
1224 test_print("\tRunning %s...\n", __func__);
1225 memblock_set_bottom_up(false);
1226 alloc_try_nid_reserved_all_generic_check();
1227 memblock_set_bottom_up(true);
1228 alloc_try_nid_reserved_all_generic_check();
1229
1230 return 0;
1231 }
1232
1233 static int alloc_try_nid_low_max_check(void)
1234 {
1235 test_print("\tRunning %s...\n", __func__);
1236 memblock_set_bottom_up(false);
1237 alloc_try_nid_low_max_generic_check();
1238 memblock_set_bottom_up(true);
1239 alloc_try_nid_low_max_generic_check();
1240
1241 return 0;
1242 }
1243
1244 int memblock_alloc_nid_checks(void)
1245 {
1246 const char *func_testing = "memblock_alloc_try_nid";
1247
1248 prefix_reset();
1249 prefix_push(func_testing);
1250 test_print("Running %s tests...\n", func_testing);
1251
1252 reset_memblock_attributes();
1253 dummy_physical_memory_init();
1254
1255 alloc_try_nid_simple_check();
1256 alloc_try_nid_misaligned_check();
1257 alloc_try_nid_narrow_range_check();
1258 alloc_try_nid_reserved_with_space_check();
1259 alloc_try_nid_reserved_no_space_check();
1260 alloc_try_nid_cap_max_check();
1261 alloc_try_nid_cap_min_check();
1262
1263 alloc_try_nid_min_reserved_check();
1264 alloc_try_nid_max_reserved_check();
1265 alloc_try_nid_exact_address_check();
1266 alloc_try_nid_reserved_full_merge_check();
1267 alloc_try_nid_reserved_all_check();
1268 alloc_try_nid_low_max_check();
1269
1270 dummy_physical_memory_cleanup();
1271
1272 prefix_pop();
1273
1274 return 0;
1275 }