1// SPDX-License-Identifier: GPL-2.0-or-later
2#include "alloc_nid_api.h"
3
4static int alloc_nid_test_flags = TEST_F_NONE;
5
6/*
7 * contains the fraction of MEM_SIZE contained in each node in basis point
8 * units (one hundredth of 1% or 1/10000)
9 */
10static const unsigned int node_fractions[] = {
11	2500, /* 1/4  */
12	 625, /* 1/16 */
13	1250, /* 1/8  */
14	1250, /* 1/8  */
15	 625, /* 1/16 */
16	 625, /* 1/16 */
17	2500, /* 1/4  */
18	 625, /* 1/16 */
19};
20
21static inline const char * const get_memblock_alloc_nid_name(int flags)
22{
23	if (flags & TEST_F_EXACT)
24		return "memblock_alloc_exact_nid_raw";
25	if (flags & TEST_F_RAW)
26		return "memblock_alloc_try_nid_raw";
27	return "memblock_alloc_try_nid";
28}
29
30static inline void *run_memblock_alloc_nid(phys_addr_t size,
31					   phys_addr_t align,
32					   phys_addr_t min_addr,
33					   phys_addr_t max_addr, int nid)
34{
35	assert(!(alloc_nid_test_flags & TEST_F_EXACT) ||
36	       (alloc_nid_test_flags & TEST_F_RAW));
37	/*
38	 * TEST_F_EXACT should be checked before TEST_F_RAW since
39	 * memblock_alloc_exact_nid_raw() performs raw allocations.
40	 */
41	if (alloc_nid_test_flags & TEST_F_EXACT)
42		return memblock_alloc_exact_nid_raw(size, align, min_addr,
43						    max_addr, nid);
44	if (alloc_nid_test_flags & TEST_F_RAW)
45		return memblock_alloc_try_nid_raw(size, align, min_addr,
46						  max_addr, nid);
47	return memblock_alloc_try_nid(size, align, min_addr, max_addr, nid);
48}
49
50/*
51 * A simple test that tries to allocate a memory region within min_addr and
52 * max_addr range:
53 *
54 *        +                   +
55 *   |    +       +-----------+      |
56 *   |    |       |    rgn    |      |
57 *   +----+-------+-----------+------+
58 *        ^                   ^
59 *        |                   |
60 *        min_addr           max_addr
61 *
62 * Expect to allocate a region that ends at max_addr.
63 */
64static int alloc_nid_top_down_simple_check(void)
65{
66	struct memblock_region *rgn = &memblock.reserved.regions[0];
67	void *allocated_ptr = NULL;
68	phys_addr_t size = SZ_128;
69	phys_addr_t min_addr;
70	phys_addr_t max_addr;
71	phys_addr_t rgn_end;
72
73	PREFIX_PUSH();
74	setup_memblock();
75
76	min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES * 2;
77	max_addr = min_addr + SZ_512;
78
79	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
80					       min_addr, max_addr,
81					       NUMA_NO_NODE);
82	rgn_end = rgn->base + rgn->size;
83
84	ASSERT_NE(allocated_ptr, NULL);
85	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
86
87	ASSERT_EQ(rgn->size, size);
88	ASSERT_EQ(rgn->base, max_addr - size);
89	ASSERT_EQ(rgn_end, max_addr);
90
91	ASSERT_EQ(memblock.reserved.cnt, 1);
92	ASSERT_EQ(memblock.reserved.total_size, size);
93
94	test_pass_pop();
95
96	return 0;
97}
98
99/*
100 * A simple test that tries to allocate a memory region within min_addr and
101 * max_addr range, where the end address is misaligned:
102 *
103 *         +       +            +
104 *  |      +       +---------+  +    |
105 *  |      |       |   rgn   |  |    |
106 *  +------+-------+---------+--+----+
107 *         ^       ^            ^
108 *         |       |            |
109 *       min_add   |            max_addr
110 *                 |
111 *                 Aligned address
112 *                 boundary
113 *
114 * Expect to allocate an aligned region that ends before max_addr.
115 */
116static int alloc_nid_top_down_end_misaligned_check(void)
117{
118	struct memblock_region *rgn = &memblock.reserved.regions[0];
119	void *allocated_ptr = NULL;
120	phys_addr_t size = SZ_128;
121	phys_addr_t misalign = SZ_2;
122	phys_addr_t min_addr;
123	phys_addr_t max_addr;
124	phys_addr_t rgn_end;
125
126	PREFIX_PUSH();
127	setup_memblock();
128
129	min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES * 2;
130	max_addr = min_addr + SZ_512 + misalign;
131
132	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
133					       min_addr, max_addr,
134					       NUMA_NO_NODE);
135	rgn_end = rgn->base + rgn->size;
136
137	ASSERT_NE(allocated_ptr, NULL);
138	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
139
140	ASSERT_EQ(rgn->size, size);
141	ASSERT_EQ(rgn->base, max_addr - size - misalign);
142	ASSERT_LT(rgn_end, max_addr);
143
144	ASSERT_EQ(memblock.reserved.cnt, 1);
145	ASSERT_EQ(memblock.reserved.total_size, size);
146
147	test_pass_pop();
148
149	return 0;
150}
151
152/*
153 * A simple test that tries to allocate a memory region, which spans over the
154 * min_addr and max_addr range:
155 *
156 *         +               +
157 *  |      +---------------+       |
158 *  |      |      rgn      |       |
159 *  +------+---------------+-------+
160 *         ^               ^
161 *         |               |
162 *         min_addr        max_addr
163 *
164 * Expect to allocate a region that starts at min_addr and ends at
165 * max_addr, given that min_addr is aligned.
166 */
167static int alloc_nid_exact_address_generic_check(void)
168{
169	struct memblock_region *rgn = &memblock.reserved.regions[0];
170	void *allocated_ptr = NULL;
171	phys_addr_t size = SZ_1K;
172	phys_addr_t min_addr;
173	phys_addr_t max_addr;
174	phys_addr_t rgn_end;
175
176	PREFIX_PUSH();
177	setup_memblock();
178
179	min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES;
180	max_addr = min_addr + size;
181
182	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
183					       min_addr, max_addr,
184					       NUMA_NO_NODE);
185	rgn_end = rgn->base + rgn->size;
186
187	ASSERT_NE(allocated_ptr, NULL);
188	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
189
190	ASSERT_EQ(rgn->size, size);
191	ASSERT_EQ(rgn->base, min_addr);
192	ASSERT_EQ(rgn_end, max_addr);
193
194	ASSERT_EQ(memblock.reserved.cnt, 1);
195	ASSERT_EQ(memblock.reserved.total_size, size);
196
197	test_pass_pop();
198
199	return 0;
200}
201
202/*
203 * A test that tries to allocate a memory region, which can't fit into
204 * min_addr and max_addr range:
205 *
206 *           +          +     +
207 *  |        +----------+-----+    |
208 *  |        |   rgn    +     |    |
209 *  +--------+----------+-----+----+
210 *           ^          ^     ^
211 *           |          |     |
212 *           Aligned    |    max_addr
213 *           address    |
214 *           boundary   min_add
215 *
216 * Expect to drop the lower limit and allocate a memory region which
217 * ends at max_addr (if the address is aligned).
218 */
219static int alloc_nid_top_down_narrow_range_check(void)
220{
221	struct memblock_region *rgn = &memblock.reserved.regions[0];
222	void *allocated_ptr = NULL;
223	phys_addr_t size = SZ_256;
224	phys_addr_t min_addr;
225	phys_addr_t max_addr;
226
227	PREFIX_PUSH();
228	setup_memblock();
229
230	min_addr = memblock_start_of_DRAM() + SZ_512;
231	max_addr = min_addr + SMP_CACHE_BYTES;
232
233	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
234					       min_addr, max_addr,
235					       NUMA_NO_NODE);
236
237	ASSERT_NE(allocated_ptr, NULL);
238	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
239
240	ASSERT_EQ(rgn->size, size);
241	ASSERT_EQ(rgn->base, max_addr - size);
242
243	ASSERT_EQ(memblock.reserved.cnt, 1);
244	ASSERT_EQ(memblock.reserved.total_size, size);
245
246	test_pass_pop();
247
248	return 0;
249}
250
251/*
252 * A test that tries to allocate a memory region, which can't fit into
253 * min_addr and max_addr range, with the latter being too close to the beginning
254 * of the available memory:
255 *
256 *   +-------------+
257 *   |     new     |
258 *   +-------------+
259 *         +       +
260 *         |       +              |
261 *         |       |              |
262 *         +-------+--------------+
263 *         ^       ^
264 *         |       |
265 *         |       max_addr
266 *         |
267 *         min_addr
268 *
269 * Expect no allocation to happen.
270 */
271static int alloc_nid_low_max_generic_check(void)
272{
273	void *allocated_ptr = NULL;
274	phys_addr_t size = SZ_1K;
275	phys_addr_t min_addr;
276	phys_addr_t max_addr;
277
278	PREFIX_PUSH();
279	setup_memblock();
280
281	min_addr = memblock_start_of_DRAM();
282	max_addr = min_addr + SMP_CACHE_BYTES;
283
284	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
285					       min_addr, max_addr,
286					       NUMA_NO_NODE);
287
288	ASSERT_EQ(allocated_ptr, NULL);
289
290	test_pass_pop();
291
292	return 0;
293}
294
295/*
296 * A test that tries to allocate a memory region within min_addr min_addr range,
297 * with min_addr being so close that it's next to an allocated region:
298 *
299 *          +                        +
300 *  |       +--------+---------------|
301 *  |       |   r1   |      rgn      |
302 *  +-------+--------+---------------+
303 *          ^                        ^
304 *          |                        |
305 *          min_addr                 max_addr
306 *
307 * Expect a merge of both regions. Only the region size gets updated.
308 */
309static int alloc_nid_min_reserved_generic_check(void)
310{
311	struct memblock_region *rgn = &memblock.reserved.regions[0];
312	void *allocated_ptr = NULL;
313	phys_addr_t r1_size = SZ_128;
314	phys_addr_t r2_size = SZ_64;
315	phys_addr_t total_size = r1_size + r2_size;
316	phys_addr_t min_addr;
317	phys_addr_t max_addr;
318	phys_addr_t reserved_base;
319
320	PREFIX_PUSH();
321	setup_memblock();
322
323	max_addr = memblock_end_of_DRAM();
324	min_addr = max_addr - r2_size;
325	reserved_base = min_addr - r1_size;
326
327	memblock_reserve(reserved_base, r1_size);
328
329	allocated_ptr = run_memblock_alloc_nid(r2_size, SMP_CACHE_BYTES,
330					       min_addr, max_addr,
331					       NUMA_NO_NODE);
332
333	ASSERT_NE(allocated_ptr, NULL);
334	assert_mem_content(allocated_ptr, r2_size, alloc_nid_test_flags);
335
336	ASSERT_EQ(rgn->size, total_size);
337	ASSERT_EQ(rgn->base, reserved_base);
338
339	ASSERT_EQ(memblock.reserved.cnt, 1);
340	ASSERT_EQ(memblock.reserved.total_size, total_size);
341
342	test_pass_pop();
343
344	return 0;
345}
346
347/*
348 * A test that tries to allocate a memory region within min_addr and max_addr,
349 * with max_addr being so close that it's next to an allocated region:
350 *
351 *             +             +
352 *  |          +-------------+--------|
353 *  |          |     rgn     |   r1   |
354 *  +----------+-------------+--------+
355 *             ^             ^
356 *             |             |
357 *             min_addr      max_addr
358 *
359 * Expect a merge of regions. Only the region size gets updated.
360 */
361static int alloc_nid_max_reserved_generic_check(void)
362{
363	struct memblock_region *rgn = &memblock.reserved.regions[0];
364	void *allocated_ptr = NULL;
365	phys_addr_t r1_size = SZ_64;
366	phys_addr_t r2_size = SZ_128;
367	phys_addr_t total_size = r1_size + r2_size;
368	phys_addr_t min_addr;
369	phys_addr_t max_addr;
370
371	PREFIX_PUSH();
372	setup_memblock();
373
374	max_addr = memblock_end_of_DRAM() - r1_size;
375	min_addr = max_addr - r2_size;
376
377	memblock_reserve(max_addr, r1_size);
378
379	allocated_ptr = run_memblock_alloc_nid(r2_size, SMP_CACHE_BYTES,
380					       min_addr, max_addr,
381					       NUMA_NO_NODE);
382
383	ASSERT_NE(allocated_ptr, NULL);
384	assert_mem_content(allocated_ptr, r2_size, alloc_nid_test_flags);
385
386	ASSERT_EQ(rgn->size, total_size);
387	ASSERT_EQ(rgn->base, min_addr);
388
389	ASSERT_EQ(memblock.reserved.cnt, 1);
390	ASSERT_EQ(memblock.reserved.total_size, total_size);
391
392	test_pass_pop();
393
394	return 0;
395}
396
397/*
398 * A test that tries to allocate memory within min_addr and max_add range, when
399 * there are two reserved regions at the borders, with a gap big enough to fit
400 * a new region:
401 *
402 *                +           +
403 *  |    +--------+   +-------+------+  |
404 *  |    |   r2   |   |  rgn  |  r1  |  |
405 *  +----+--------+---+-------+------+--+
406 *                ^           ^
407 *                |           |
408 *                min_addr    max_addr
409 *
410 * Expect to merge the new region with r1. The second region does not get
411 * updated. The total size field gets updated.
412 */
413
414static int alloc_nid_top_down_reserved_with_space_check(void)
415{
416	struct memblock_region *rgn1 = &memblock.reserved.regions[1];
417	struct memblock_region *rgn2 = &memblock.reserved.regions[0];
418	void *allocated_ptr = NULL;
419	struct region r1, r2;
420	phys_addr_t r3_size = SZ_64;
421	phys_addr_t gap_size = SMP_CACHE_BYTES;
422	phys_addr_t total_size;
423	phys_addr_t max_addr;
424	phys_addr_t min_addr;
425
426	PREFIX_PUSH();
427	setup_memblock();
428
429	r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
430	r1.size = SMP_CACHE_BYTES;
431
432	r2.size = SZ_128;
433	r2.base = r1.base - (r3_size + gap_size + r2.size);
434
435	total_size = r1.size + r2.size + r3_size;
436	min_addr = r2.base + r2.size;
437	max_addr = r1.base;
438
439	memblock_reserve(r1.base, r1.size);
440	memblock_reserve(r2.base, r2.size);
441
442	allocated_ptr = run_memblock_alloc_nid(r3_size, SMP_CACHE_BYTES,
443					       min_addr, max_addr,
444					       NUMA_NO_NODE);
445
446	ASSERT_NE(allocated_ptr, NULL);
447	assert_mem_content(allocated_ptr, r3_size, alloc_nid_test_flags);
448
449	ASSERT_EQ(rgn1->size, r1.size + r3_size);
450	ASSERT_EQ(rgn1->base, max_addr - r3_size);
451
452	ASSERT_EQ(rgn2->size, r2.size);
453	ASSERT_EQ(rgn2->base, r2.base);
454
455	ASSERT_EQ(memblock.reserved.cnt, 2);
456	ASSERT_EQ(memblock.reserved.total_size, total_size);
457
458	test_pass_pop();
459
460	return 0;
461}
462
463/*
464 * A test that tries to allocate memory within min_addr and max_add range, when
465 * there are two reserved regions at the borders, with a gap of a size equal to
466 * the size of the new region:
467 *
468 *                 +        +
469 *  |     +--------+--------+--------+     |
470 *  |     |   r2   |   r3   |   r1   |     |
471 *  +-----+--------+--------+--------+-----+
472 *                 ^        ^
473 *                 |        |
474 *                 min_addr max_addr
475 *
476 * Expect to merge all of the regions into one. The region counter and total
477 * size fields get updated.
478 */
479static int alloc_nid_reserved_full_merge_generic_check(void)
480{
481	struct memblock_region *rgn = &memblock.reserved.regions[0];
482	void *allocated_ptr = NULL;
483	struct region r1, r2;
484	phys_addr_t r3_size = SZ_64;
485	phys_addr_t total_size;
486	phys_addr_t max_addr;
487	phys_addr_t min_addr;
488
489	PREFIX_PUSH();
490	setup_memblock();
491
492	r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
493	r1.size = SMP_CACHE_BYTES;
494
495	r2.size = SZ_128;
496	r2.base = r1.base - (r3_size + r2.size);
497
498	total_size = r1.size + r2.size + r3_size;
499	min_addr = r2.base + r2.size;
500	max_addr = r1.base;
501
502	memblock_reserve(r1.base, r1.size);
503	memblock_reserve(r2.base, r2.size);
504
505	allocated_ptr = run_memblock_alloc_nid(r3_size, SMP_CACHE_BYTES,
506					       min_addr, max_addr,
507					       NUMA_NO_NODE);
508
509	ASSERT_NE(allocated_ptr, NULL);
510	assert_mem_content(allocated_ptr, r3_size, alloc_nid_test_flags);
511
512	ASSERT_EQ(rgn->size, total_size);
513	ASSERT_EQ(rgn->base, r2.base);
514
515	ASSERT_EQ(memblock.reserved.cnt, 1);
516	ASSERT_EQ(memblock.reserved.total_size, total_size);
517
518	test_pass_pop();
519
520	return 0;
521}
522
523/*
524 * A test that tries to allocate memory within min_addr and max_add range, when
525 * there are two reserved regions at the borders, with a gap that can't fit
526 * a new region:
527 *
528 *                       +    +
529 *  |  +----------+------+    +------+   |
530 *  |  |    r3    |  r2  |    |  r1  |   |
531 *  +--+----------+------+----+------+---+
532 *                       ^    ^
533 *                       |    |
534 *                       |    max_addr
535 *                       |
536 *                       min_addr
537 *
538 * Expect to merge the new region with r2. The second region does not get
539 * updated. The total size counter gets updated.
540 */
541static int alloc_nid_top_down_reserved_no_space_check(void)
542{
543	struct memblock_region *rgn1 = &memblock.reserved.regions[1];
544	struct memblock_region *rgn2 = &memblock.reserved.regions[0];
545	void *allocated_ptr = NULL;
546	struct region r1, r2;
547	phys_addr_t r3_size = SZ_256;
548	phys_addr_t gap_size = SMP_CACHE_BYTES;
549	phys_addr_t total_size;
550	phys_addr_t max_addr;
551	phys_addr_t min_addr;
552
553	PREFIX_PUSH();
554	setup_memblock();
555
556	r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
557	r1.size = SMP_CACHE_BYTES;
558
559	r2.size = SZ_128;
560	r2.base = r1.base - (r2.size + gap_size);
561
562	total_size = r1.size + r2.size + r3_size;
563	min_addr = r2.base + r2.size;
564	max_addr = r1.base;
565
566	memblock_reserve(r1.base, r1.size);
567	memblock_reserve(r2.base, r2.size);
568
569	allocated_ptr = run_memblock_alloc_nid(r3_size, SMP_CACHE_BYTES,
570					       min_addr, max_addr,
571					       NUMA_NO_NODE);
572
573	ASSERT_NE(allocated_ptr, NULL);
574	assert_mem_content(allocated_ptr, r3_size, alloc_nid_test_flags);
575
576	ASSERT_EQ(rgn1->size, r1.size);
577	ASSERT_EQ(rgn1->base, r1.base);
578
579	ASSERT_EQ(rgn2->size, r2.size + r3_size);
580	ASSERT_EQ(rgn2->base, r2.base - r3_size);
581
582	ASSERT_EQ(memblock.reserved.cnt, 2);
583	ASSERT_EQ(memblock.reserved.total_size, total_size);
584
585	test_pass_pop();
586
587	return 0;
588}
589
590/*
591 * A test that tries to allocate memory within min_addr and max_add range, but
592 * it's too narrow and everything else is reserved:
593 *
594 *            +-----------+
595 *            |    new    |
596 *            +-----------+
597 *                 +      +
598 *  |--------------+      +----------|
599 *  |      r2      |      |    r1    |
600 *  +--------------+------+----------+
601 *                 ^      ^
602 *                 |      |
603 *                 |      max_addr
604 *                 |
605 *                 min_addr
606 *
607 * Expect no allocation to happen.
608 */
609
610static int alloc_nid_reserved_all_generic_check(void)
611{
612	void *allocated_ptr = NULL;
613	struct region r1, r2;
614	phys_addr_t r3_size = SZ_256;
615	phys_addr_t gap_size = SMP_CACHE_BYTES;
616	phys_addr_t max_addr;
617	phys_addr_t min_addr;
618
619	PREFIX_PUSH();
620	setup_memblock();
621
622	r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES;
623	r1.size = SMP_CACHE_BYTES;
624
625	r2.size = MEM_SIZE - (r1.size + gap_size);
626	r2.base = memblock_start_of_DRAM();
627
628	min_addr = r2.base + r2.size;
629	max_addr = r1.base;
630
631	memblock_reserve(r1.base, r1.size);
632	memblock_reserve(r2.base, r2.size);
633
634	allocated_ptr = run_memblock_alloc_nid(r3_size, SMP_CACHE_BYTES,
635					       min_addr, max_addr,
636					       NUMA_NO_NODE);
637
638	ASSERT_EQ(allocated_ptr, NULL);
639
640	test_pass_pop();
641
642	return 0;
643}
644
645/*
646 * A test that tries to allocate a memory region, where max_addr is
647 * bigger than the end address of the available memory. Expect to allocate
648 * a region that ends before the end of the memory.
649 */
650static int alloc_nid_top_down_cap_max_check(void)
651{
652	struct memblock_region *rgn = &memblock.reserved.regions[0];
653	void *allocated_ptr = NULL;
654	phys_addr_t size = SZ_256;
655	phys_addr_t min_addr;
656	phys_addr_t max_addr;
657
658	PREFIX_PUSH();
659	setup_memblock();
660
661	min_addr = memblock_end_of_DRAM() - SZ_1K;
662	max_addr = memblock_end_of_DRAM() + SZ_256;
663
664	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
665					       min_addr, max_addr,
666					       NUMA_NO_NODE);
667
668	ASSERT_NE(allocated_ptr, NULL);
669	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
670
671	ASSERT_EQ(rgn->size, size);
672	ASSERT_EQ(rgn->base, memblock_end_of_DRAM() - size);
673
674	ASSERT_EQ(memblock.reserved.cnt, 1);
675	ASSERT_EQ(memblock.reserved.total_size, size);
676
677	test_pass_pop();
678
679	return 0;
680}
681
682/*
683 * A test that tries to allocate a memory region, where min_addr is
684 * smaller than the start address of the available memory. Expect to allocate
685 * a region that ends before the end of the memory.
686 */
687static int alloc_nid_top_down_cap_min_check(void)
688{
689	struct memblock_region *rgn = &memblock.reserved.regions[0];
690	void *allocated_ptr = NULL;
691	phys_addr_t size = SZ_1K;
692	phys_addr_t min_addr;
693	phys_addr_t max_addr;
694
695	PREFIX_PUSH();
696	setup_memblock();
697
698	min_addr = memblock_start_of_DRAM() - SZ_256;
699	max_addr = memblock_end_of_DRAM();
700
701	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
702					       min_addr, max_addr,
703					       NUMA_NO_NODE);
704
705	ASSERT_NE(allocated_ptr, NULL);
706	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
707
708	ASSERT_EQ(rgn->size, size);
709	ASSERT_EQ(rgn->base, memblock_end_of_DRAM() - size);
710
711	ASSERT_EQ(memblock.reserved.cnt, 1);
712	ASSERT_EQ(memblock.reserved.total_size, size);
713
714	test_pass_pop();
715
716	return 0;
717}
718
719/*
720 * A simple test that tries to allocate a memory region within min_addr and
721 * max_addr range:
722 *
723 *        +                       +
724 *   |    +-----------+           |      |
725 *   |    |    rgn    |           |      |
726 *   +----+-----------+-----------+------+
727 *        ^                       ^
728 *        |                       |
729 *        min_addr                max_addr
730 *
731 * Expect to allocate a region that ends before max_addr.
732 */
733static int alloc_nid_bottom_up_simple_check(void)
734{
735	struct memblock_region *rgn = &memblock.reserved.regions[0];
736	void *allocated_ptr = NULL;
737	phys_addr_t size = SZ_128;
738	phys_addr_t min_addr;
739	phys_addr_t max_addr;
740	phys_addr_t rgn_end;
741
742	PREFIX_PUSH();
743	setup_memblock();
744
745	min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES * 2;
746	max_addr = min_addr + SZ_512;
747
748	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
749					       min_addr, max_addr,
750					       NUMA_NO_NODE);
751	rgn_end = rgn->base + rgn->size;
752
753	ASSERT_NE(allocated_ptr, NULL);
754	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
755
756	ASSERT_EQ(rgn->size, size);
757	ASSERT_EQ(rgn->base, min_addr);
758	ASSERT_LT(rgn_end, max_addr);
759
760	ASSERT_EQ(memblock.reserved.cnt, 1);
761	ASSERT_EQ(memblock.reserved.total_size, size);
762
763	test_pass_pop();
764
765	return 0;
766}
767
768/*
769 * A simple test that tries to allocate a memory region within min_addr and
770 * max_addr range, where the start address is misaligned:
771 *
772 *        +                     +
773 *  |     +   +-----------+     +     |
774 *  |     |   |    rgn    |     |     |
775 *  +-----+---+-----------+-----+-----+
776 *        ^   ^----.            ^
777 *        |        |            |
778 *     min_add     |            max_addr
779 *                 |
780 *                 Aligned address
781 *                 boundary
782 *
783 * Expect to allocate an aligned region that ends before max_addr.
784 */
785static int alloc_nid_bottom_up_start_misaligned_check(void)
786{
787	struct memblock_region *rgn = &memblock.reserved.regions[0];
788	void *allocated_ptr = NULL;
789	phys_addr_t size = SZ_128;
790	phys_addr_t misalign = SZ_2;
791	phys_addr_t min_addr;
792	phys_addr_t max_addr;
793	phys_addr_t rgn_end;
794
795	PREFIX_PUSH();
796	setup_memblock();
797
798	min_addr = memblock_start_of_DRAM() + misalign;
799	max_addr = min_addr + SZ_512;
800
801	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
802					       min_addr, max_addr,
803					       NUMA_NO_NODE);
804	rgn_end = rgn->base + rgn->size;
805
806	ASSERT_NE(allocated_ptr, NULL);
807	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
808
809	ASSERT_EQ(rgn->size, size);
810	ASSERT_EQ(rgn->base, min_addr + (SMP_CACHE_BYTES - misalign));
811	ASSERT_LT(rgn_end, max_addr);
812
813	ASSERT_EQ(memblock.reserved.cnt, 1);
814	ASSERT_EQ(memblock.reserved.total_size, size);
815
816	test_pass_pop();
817
818	return 0;
819}
820
821/*
822 * A test that tries to allocate a memory region, which can't fit into min_addr
823 * and max_addr range:
824 *
825 *                      +    +
826 *  |---------+         +    +      |
827 *  |   rgn   |         |    |      |
828 *  +---------+---------+----+------+
829 *                      ^    ^
830 *                      |    |
831 *                      |    max_addr
832 *                      |
833 *                      min_add
834 *
835 * Expect to drop the lower limit and allocate a memory region which
836 * starts at the beginning of the available memory.
837 */
838static int alloc_nid_bottom_up_narrow_range_check(void)
839{
840	struct memblock_region *rgn = &memblock.reserved.regions[0];
841	void *allocated_ptr = NULL;
842	phys_addr_t size = SZ_256;
843	phys_addr_t min_addr;
844	phys_addr_t max_addr;
845
846	PREFIX_PUSH();
847	setup_memblock();
848
849	min_addr = memblock_start_of_DRAM() + SZ_512;
850	max_addr = min_addr + SMP_CACHE_BYTES;
851
852	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
853					       min_addr, max_addr,
854					       NUMA_NO_NODE);
855
856	ASSERT_NE(allocated_ptr, NULL);
857	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
858
859	ASSERT_EQ(rgn->size, size);
860	ASSERT_EQ(rgn->base, memblock_start_of_DRAM());
861
862	ASSERT_EQ(memblock.reserved.cnt, 1);
863	ASSERT_EQ(memblock.reserved.total_size, size);
864
865	test_pass_pop();
866
867	return 0;
868}
869
870/*
871 * A test that tries to allocate memory within min_addr and max_add range, when
872 * there are two reserved regions at the borders, with a gap big enough to fit
873 * a new region:
874 *
875 *                +           +
876 *  |    +--------+-------+   +------+  |
877 *  |    |   r2   |  rgn  |   |  r1  |  |
878 *  +----+--------+-------+---+------+--+
879 *                ^           ^
880 *                |           |
881 *                min_addr    max_addr
882 *
883 * Expect to merge the new region with r2. The second region does not get
884 * updated. The total size field gets updated.
885 */
886
887static int alloc_nid_bottom_up_reserved_with_space_check(void)
888{
889	struct memblock_region *rgn1 = &memblock.reserved.regions[1];
890	struct memblock_region *rgn2 = &memblock.reserved.regions[0];
891	void *allocated_ptr = NULL;
892	struct region r1, r2;
893	phys_addr_t r3_size = SZ_64;
894	phys_addr_t gap_size = SMP_CACHE_BYTES;
895	phys_addr_t total_size;
896	phys_addr_t max_addr;
897	phys_addr_t min_addr;
898
899	PREFIX_PUSH();
900	setup_memblock();
901
902	r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
903	r1.size = SMP_CACHE_BYTES;
904
905	r2.size = SZ_128;
906	r2.base = r1.base - (r3_size + gap_size + r2.size);
907
908	total_size = r1.size + r2.size + r3_size;
909	min_addr = r2.base + r2.size;
910	max_addr = r1.base;
911
912	memblock_reserve(r1.base, r1.size);
913	memblock_reserve(r2.base, r2.size);
914
915	allocated_ptr = run_memblock_alloc_nid(r3_size, SMP_CACHE_BYTES,
916					       min_addr, max_addr,
917					       NUMA_NO_NODE);
918
919	ASSERT_NE(allocated_ptr, NULL);
920	assert_mem_content(allocated_ptr, r3_size, alloc_nid_test_flags);
921
922	ASSERT_EQ(rgn1->size, r1.size);
923	ASSERT_EQ(rgn1->base, max_addr);
924
925	ASSERT_EQ(rgn2->size, r2.size + r3_size);
926	ASSERT_EQ(rgn2->base, r2.base);
927
928	ASSERT_EQ(memblock.reserved.cnt, 2);
929	ASSERT_EQ(memblock.reserved.total_size, total_size);
930
931	test_pass_pop();
932
933	return 0;
934}
935
936/*
937 * A test that tries to allocate memory within min_addr and max_add range, when
938 * there are two reserved regions at the borders, with a gap of a size equal to
939 * the size of the new region:
940 *
941 *                         +   +
942 *  |----------+    +------+   +----+  |
943 *  |    r3    |    |  r2  |   | r1 |  |
944 *  +----------+----+------+---+----+--+
945 *                         ^   ^
946 *                         |   |
947 *                         |  max_addr
948 *                         |
949 *                         min_addr
950 *
951 * Expect to drop the lower limit and allocate memory at the beginning of the
952 * available memory. The region counter and total size fields get updated.
953 * Other regions are not modified.
954 */
955
956static int alloc_nid_bottom_up_reserved_no_space_check(void)
957{
958	struct memblock_region *rgn1 = &memblock.reserved.regions[2];
959	struct memblock_region *rgn2 = &memblock.reserved.regions[1];
960	struct memblock_region *rgn3 = &memblock.reserved.regions[0];
961	void *allocated_ptr = NULL;
962	struct region r1, r2;
963	phys_addr_t r3_size = SZ_256;
964	phys_addr_t gap_size = SMP_CACHE_BYTES;
965	phys_addr_t total_size;
966	phys_addr_t max_addr;
967	phys_addr_t min_addr;
968
969	PREFIX_PUSH();
970	setup_memblock();
971
972	r1.base = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
973	r1.size = SMP_CACHE_BYTES;
974
975	r2.size = SZ_128;
976	r2.base = r1.base - (r2.size + gap_size);
977
978	total_size = r1.size + r2.size + r3_size;
979	min_addr = r2.base + r2.size;
980	max_addr = r1.base;
981
982	memblock_reserve(r1.base, r1.size);
983	memblock_reserve(r2.base, r2.size);
984
985	allocated_ptr = run_memblock_alloc_nid(r3_size, SMP_CACHE_BYTES,
986					       min_addr, max_addr,
987					       NUMA_NO_NODE);
988
989	ASSERT_NE(allocated_ptr, NULL);
990	assert_mem_content(allocated_ptr, r3_size, alloc_nid_test_flags);
991
992	ASSERT_EQ(rgn3->size, r3_size);
993	ASSERT_EQ(rgn3->base, memblock_start_of_DRAM());
994
995	ASSERT_EQ(rgn2->size, r2.size);
996	ASSERT_EQ(rgn2->base, r2.base);
997
998	ASSERT_EQ(rgn1->size, r1.size);
999	ASSERT_EQ(rgn1->base, r1.base);
1000
1001	ASSERT_EQ(memblock.reserved.cnt, 3);
1002	ASSERT_EQ(memblock.reserved.total_size, total_size);
1003
1004	test_pass_pop();
1005
1006	return 0;
1007}
1008
1009/*
1010 * A test that tries to allocate a memory region, where max_addr is
1011 * bigger than the end address of the available memory. Expect to allocate
1012 * a region that starts at the min_addr.
1013 */
1014static int alloc_nid_bottom_up_cap_max_check(void)
1015{
1016	struct memblock_region *rgn = &memblock.reserved.regions[0];
1017	void *allocated_ptr = NULL;
1018	phys_addr_t size = SZ_256;
1019	phys_addr_t min_addr;
1020	phys_addr_t max_addr;
1021
1022	PREFIX_PUSH();
1023	setup_memblock();
1024
1025	min_addr = memblock_start_of_DRAM() + SZ_1K;
1026	max_addr = memblock_end_of_DRAM() + SZ_256;
1027
1028	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1029					       min_addr, max_addr,
1030					       NUMA_NO_NODE);
1031
1032	ASSERT_NE(allocated_ptr, NULL);
1033	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1034
1035	ASSERT_EQ(rgn->size, size);
1036	ASSERT_EQ(rgn->base, min_addr);
1037
1038	ASSERT_EQ(memblock.reserved.cnt, 1);
1039	ASSERT_EQ(memblock.reserved.total_size, size);
1040
1041	test_pass_pop();
1042
1043	return 0;
1044}
1045
1046/*
1047 * A test that tries to allocate a memory region, where min_addr is
1048 * smaller than the start address of the available memory. Expect to allocate
1049 * a region at the beginning of the available memory.
1050 */
1051static int alloc_nid_bottom_up_cap_min_check(void)
1052{
1053	struct memblock_region *rgn = &memblock.reserved.regions[0];
1054	void *allocated_ptr = NULL;
1055	phys_addr_t size = SZ_1K;
1056	phys_addr_t min_addr;
1057	phys_addr_t max_addr;
1058
1059	PREFIX_PUSH();
1060	setup_memblock();
1061
1062	min_addr = memblock_start_of_DRAM();
1063	max_addr = memblock_end_of_DRAM() - SZ_256;
1064
1065	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1066					       min_addr, max_addr,
1067					       NUMA_NO_NODE);
1068
1069	ASSERT_NE(allocated_ptr, NULL);
1070	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1071
1072	ASSERT_EQ(rgn->size, size);
1073	ASSERT_EQ(rgn->base, memblock_start_of_DRAM());
1074
1075	ASSERT_EQ(memblock.reserved.cnt, 1);
1076	ASSERT_EQ(memblock.reserved.total_size, size);
1077
1078	test_pass_pop();
1079
1080	return 0;
1081}
1082
1083/* Test case wrappers for range tests */
1084static int alloc_nid_simple_check(void)
1085{
1086	test_print("\tRunning %s...\n", __func__);
1087	memblock_set_bottom_up(false);
1088	alloc_nid_top_down_simple_check();
1089	memblock_set_bottom_up(true);
1090	alloc_nid_bottom_up_simple_check();
1091
1092	return 0;
1093}
1094
1095static int alloc_nid_misaligned_check(void)
1096{
1097	test_print("\tRunning %s...\n", __func__);
1098	memblock_set_bottom_up(false);
1099	alloc_nid_top_down_end_misaligned_check();
1100	memblock_set_bottom_up(true);
1101	alloc_nid_bottom_up_start_misaligned_check();
1102
1103	return 0;
1104}
1105
1106static int alloc_nid_narrow_range_check(void)
1107{
1108	test_print("\tRunning %s...\n", __func__);
1109	memblock_set_bottom_up(false);
1110	alloc_nid_top_down_narrow_range_check();
1111	memblock_set_bottom_up(true);
1112	alloc_nid_bottom_up_narrow_range_check();
1113
1114	return 0;
1115}
1116
1117static int alloc_nid_reserved_with_space_check(void)
1118{
1119	test_print("\tRunning %s...\n", __func__);
1120	memblock_set_bottom_up(false);
1121	alloc_nid_top_down_reserved_with_space_check();
1122	memblock_set_bottom_up(true);
1123	alloc_nid_bottom_up_reserved_with_space_check();
1124
1125	return 0;
1126}
1127
1128static int alloc_nid_reserved_no_space_check(void)
1129{
1130	test_print("\tRunning %s...\n", __func__);
1131	memblock_set_bottom_up(false);
1132	alloc_nid_top_down_reserved_no_space_check();
1133	memblock_set_bottom_up(true);
1134	alloc_nid_bottom_up_reserved_no_space_check();
1135
1136	return 0;
1137}
1138
1139static int alloc_nid_cap_max_check(void)
1140{
1141	test_print("\tRunning %s...\n", __func__);
1142	memblock_set_bottom_up(false);
1143	alloc_nid_top_down_cap_max_check();
1144	memblock_set_bottom_up(true);
1145	alloc_nid_bottom_up_cap_max_check();
1146
1147	return 0;
1148}
1149
1150static int alloc_nid_cap_min_check(void)
1151{
1152	test_print("\tRunning %s...\n", __func__);
1153	memblock_set_bottom_up(false);
1154	alloc_nid_top_down_cap_min_check();
1155	memblock_set_bottom_up(true);
1156	alloc_nid_bottom_up_cap_min_check();
1157
1158	return 0;
1159}
1160
1161static int alloc_nid_min_reserved_check(void)
1162{
1163	test_print("\tRunning %s...\n", __func__);
1164	run_top_down(alloc_nid_min_reserved_generic_check);
1165	run_bottom_up(alloc_nid_min_reserved_generic_check);
1166
1167	return 0;
1168}
1169
1170static int alloc_nid_max_reserved_check(void)
1171{
1172	test_print("\tRunning %s...\n", __func__);
1173	run_top_down(alloc_nid_max_reserved_generic_check);
1174	run_bottom_up(alloc_nid_max_reserved_generic_check);
1175
1176	return 0;
1177}
1178
1179static int alloc_nid_exact_address_check(void)
1180{
1181	test_print("\tRunning %s...\n", __func__);
1182	run_top_down(alloc_nid_exact_address_generic_check);
1183	run_bottom_up(alloc_nid_exact_address_generic_check);
1184
1185	return 0;
1186}
1187
1188static int alloc_nid_reserved_full_merge_check(void)
1189{
1190	test_print("\tRunning %s...\n", __func__);
1191	run_top_down(alloc_nid_reserved_full_merge_generic_check);
1192	run_bottom_up(alloc_nid_reserved_full_merge_generic_check);
1193
1194	return 0;
1195}
1196
1197static int alloc_nid_reserved_all_check(void)
1198{
1199	test_print("\tRunning %s...\n", __func__);
1200	run_top_down(alloc_nid_reserved_all_generic_check);
1201	run_bottom_up(alloc_nid_reserved_all_generic_check);
1202
1203	return 0;
1204}
1205
1206static int alloc_nid_low_max_check(void)
1207{
1208	test_print("\tRunning %s...\n", __func__);
1209	run_top_down(alloc_nid_low_max_generic_check);
1210	run_bottom_up(alloc_nid_low_max_generic_check);
1211
1212	return 0;
1213}
1214
1215static int memblock_alloc_nid_range_checks(void)
1216{
1217	test_print("Running %s range tests...\n",
1218		   get_memblock_alloc_nid_name(alloc_nid_test_flags));
1219
1220	alloc_nid_simple_check();
1221	alloc_nid_misaligned_check();
1222	alloc_nid_narrow_range_check();
1223	alloc_nid_reserved_with_space_check();
1224	alloc_nid_reserved_no_space_check();
1225	alloc_nid_cap_max_check();
1226	alloc_nid_cap_min_check();
1227
1228	alloc_nid_min_reserved_check();
1229	alloc_nid_max_reserved_check();
1230	alloc_nid_exact_address_check();
1231	alloc_nid_reserved_full_merge_check();
1232	alloc_nid_reserved_all_check();
1233	alloc_nid_low_max_check();
1234
1235	return 0;
1236}
1237
1238/*
1239 * A test that tries to allocate a memory region in a specific NUMA node that
1240 * has enough memory to allocate a region of the requested size.
1241 * Expect to allocate an aligned region at the end of the requested node.
1242 */
1243static int alloc_nid_top_down_numa_simple_check(void)
1244{
1245	int nid_req = 3;
1246	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1247	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1248	void *allocated_ptr = NULL;
1249	phys_addr_t size;
1250	phys_addr_t min_addr;
1251	phys_addr_t max_addr;
1252
1253	PREFIX_PUSH();
1254	setup_numa_memblock(node_fractions);
1255
1256	ASSERT_LE(SZ_4, req_node->size);
1257	size = req_node->size / SZ_4;
1258	min_addr = memblock_start_of_DRAM();
1259	max_addr = memblock_end_of_DRAM();
1260
1261	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1262					       min_addr, max_addr, nid_req);
1263
1264	ASSERT_NE(allocated_ptr, NULL);
1265	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1266
1267	ASSERT_EQ(new_rgn->size, size);
1268	ASSERT_EQ(new_rgn->base, region_end(req_node) - size);
1269	ASSERT_LE(req_node->base, new_rgn->base);
1270
1271	ASSERT_EQ(memblock.reserved.cnt, 1);
1272	ASSERT_EQ(memblock.reserved.total_size, size);
1273
1274	test_pass_pop();
1275
1276	return 0;
1277}
1278
1279/*
1280 * A test that tries to allocate a memory region in a specific NUMA node that
1281 * does not have enough memory to allocate a region of the requested size:
1282 *
1283 *  |   +-----+          +------------------+     |
1284 *  |   | req |          |     expected     |     |
1285 *  +---+-----+----------+------------------+-----+
1286 *
1287 *  |                             +---------+     |
1288 *  |                             |   rgn   |     |
1289 *  +-----------------------------+---------+-----+
1290 *
1291 * Expect to allocate an aligned region at the end of the last node that has
1292 * enough memory (in this case, nid = 6) after falling back to NUMA_NO_NODE.
1293 */
1294static int alloc_nid_top_down_numa_small_node_check(void)
1295{
1296	int nid_req = 1;
1297	int nid_exp = 6;
1298	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1299	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1300	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
1301	void *allocated_ptr = NULL;
1302	phys_addr_t size;
1303	phys_addr_t min_addr;
1304	phys_addr_t max_addr;
1305
1306	PREFIX_PUSH();
1307	setup_numa_memblock(node_fractions);
1308
1309	size = SZ_2 * req_node->size;
1310	min_addr = memblock_start_of_DRAM();
1311	max_addr = memblock_end_of_DRAM();
1312
1313	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1314					       min_addr, max_addr, nid_req);
1315
1316	ASSERT_NE(allocated_ptr, NULL);
1317	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1318
1319	ASSERT_EQ(new_rgn->size, size);
1320	ASSERT_EQ(new_rgn->base, region_end(exp_node) - size);
1321	ASSERT_LE(exp_node->base, new_rgn->base);
1322
1323	ASSERT_EQ(memblock.reserved.cnt, 1);
1324	ASSERT_EQ(memblock.reserved.total_size, size);
1325
1326	test_pass_pop();
1327
1328	return 0;
1329}
1330
1331/*
1332 * A test that tries to allocate a memory region in a specific NUMA node that
1333 * is fully reserved:
1334 *
1335 *  |              +---------+            +------------------+     |
1336 *  |              |requested|            |     expected     |     |
1337 *  +--------------+---------+------------+------------------+-----+
1338 *
1339 *  |              +---------+                     +---------+     |
1340 *  |              | reserved|                     |   new   |     |
1341 *  +--------------+---------+---------------------+---------+-----+
1342 *
1343 * Expect to allocate an aligned region at the end of the last node that is
1344 * large enough and has enough unreserved memory (in this case, nid = 6) after
1345 * falling back to NUMA_NO_NODE. The region count and total size get updated.
1346 */
1347static int alloc_nid_top_down_numa_node_reserved_check(void)
1348{
1349	int nid_req = 2;
1350	int nid_exp = 6;
1351	struct memblock_region *new_rgn = &memblock.reserved.regions[1];
1352	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1353	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
1354	void *allocated_ptr = NULL;
1355	phys_addr_t size;
1356	phys_addr_t min_addr;
1357	phys_addr_t max_addr;
1358
1359	PREFIX_PUSH();
1360	setup_numa_memblock(node_fractions);
1361
1362	size = req_node->size;
1363	min_addr = memblock_start_of_DRAM();
1364	max_addr = memblock_end_of_DRAM();
1365
1366	memblock_reserve(req_node->base, req_node->size);
1367	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1368					       min_addr, max_addr, nid_req);
1369
1370	ASSERT_NE(allocated_ptr, NULL);
1371	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1372
1373	ASSERT_EQ(new_rgn->size, size);
1374	ASSERT_EQ(new_rgn->base, region_end(exp_node) - size);
1375	ASSERT_LE(exp_node->base, new_rgn->base);
1376
1377	ASSERT_EQ(memblock.reserved.cnt, 2);
1378	ASSERT_EQ(memblock.reserved.total_size, size + req_node->size);
1379
1380	test_pass_pop();
1381
1382	return 0;
1383}
1384
1385/*
1386 * A test that tries to allocate a memory region in a specific NUMA node that
1387 * is partially reserved but has enough memory for the allocated region:
1388 *
1389 *  |           +---------------------------------------+          |
1390 *  |           |               requested               |          |
1391 *  +-----------+---------------------------------------+----------+
1392 *
1393 *  |           +------------------+              +-----+          |
1394 *  |           |     reserved     |              | new |          |
1395 *  +-----------+------------------+--------------+-----+----------+
1396 *
1397 * Expect to allocate an aligned region at the end of the requested node. The
1398 * region count and total size get updated.
1399 */
1400static int alloc_nid_top_down_numa_part_reserved_check(void)
1401{
1402	int nid_req = 4;
1403	struct memblock_region *new_rgn = &memblock.reserved.regions[1];
1404	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1405	void *allocated_ptr = NULL;
1406	struct region r1;
1407	phys_addr_t size;
1408	phys_addr_t min_addr;
1409	phys_addr_t max_addr;
1410
1411	PREFIX_PUSH();
1412	setup_numa_memblock(node_fractions);
1413
1414	ASSERT_LE(SZ_8, req_node->size);
1415	r1.base = req_node->base;
1416	r1.size = req_node->size / SZ_2;
1417	size = r1.size / SZ_4;
1418	min_addr = memblock_start_of_DRAM();
1419	max_addr = memblock_end_of_DRAM();
1420
1421	memblock_reserve(r1.base, r1.size);
1422	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1423					       min_addr, max_addr, nid_req);
1424
1425	ASSERT_NE(allocated_ptr, NULL);
1426	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1427
1428	ASSERT_EQ(new_rgn->size, size);
1429	ASSERT_EQ(new_rgn->base, region_end(req_node) - size);
1430	ASSERT_LE(req_node->base, new_rgn->base);
1431
1432	ASSERT_EQ(memblock.reserved.cnt, 2);
1433	ASSERT_EQ(memblock.reserved.total_size, size + r1.size);
1434
1435	test_pass_pop();
1436
1437	return 0;
1438}
1439
1440/*
1441 * A test that tries to allocate a memory region in a specific NUMA node that
1442 * is partially reserved and does not have enough contiguous memory for the
1443 * allocated region:
1444 *
1445 *  |           +-----------------------+         +----------------------|
1446 *  |           |       requested       |         |       expected       |
1447 *  +-----------+-----------------------+---------+----------------------+
1448 *
1449 *  |                 +----------+                           +-----------|
1450 *  |                 | reserved |                           |    new    |
1451 *  +-----------------+----------+---------------------------+-----------+
1452 *
1453 * Expect to allocate an aligned region at the end of the last node that is
1454 * large enough and has enough unreserved memory (in this case,
1455 * nid = NUMA_NODES - 1) after falling back to NUMA_NO_NODE. The region count
1456 * and total size get updated.
1457 */
1458static int alloc_nid_top_down_numa_part_reserved_fallback_check(void)
1459{
1460	int nid_req = 4;
1461	int nid_exp = NUMA_NODES - 1;
1462	struct memblock_region *new_rgn = &memblock.reserved.regions[1];
1463	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1464	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
1465	void *allocated_ptr = NULL;
1466	struct region r1;
1467	phys_addr_t size;
1468	phys_addr_t min_addr;
1469	phys_addr_t max_addr;
1470
1471	PREFIX_PUSH();
1472	setup_numa_memblock(node_fractions);
1473
1474	ASSERT_LE(SZ_4, req_node->size);
1475	size = req_node->size / SZ_2;
1476	r1.base = req_node->base + (size / SZ_2);
1477	r1.size = size;
1478
1479	min_addr = memblock_start_of_DRAM();
1480	max_addr = memblock_end_of_DRAM();
1481
1482	memblock_reserve(r1.base, r1.size);
1483	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1484					       min_addr, max_addr, nid_req);
1485
1486	ASSERT_NE(allocated_ptr, NULL);
1487	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1488
1489	ASSERT_EQ(new_rgn->size, size);
1490	ASSERT_EQ(new_rgn->base, region_end(exp_node) - size);
1491	ASSERT_LE(exp_node->base, new_rgn->base);
1492
1493	ASSERT_EQ(memblock.reserved.cnt, 2);
1494	ASSERT_EQ(memblock.reserved.total_size, size + r1.size);
1495
1496	test_pass_pop();
1497
1498	return 0;
1499}
1500
1501/*
1502 * A test that tries to allocate a memory region that spans over the min_addr
1503 * and max_addr range and overlaps with two different nodes, where the first
1504 * node is the requested node:
1505 *
1506 *                                min_addr
1507 *                                |           max_addr
1508 *                                |           |
1509 *                                v           v
1510 *  |           +-----------------------+-----------+              |
1511 *  |           |       requested       |   node3   |              |
1512 *  +-----------+-----------------------+-----------+--------------+
1513 *                                +           +
1514 *  |                       +-----------+                          |
1515 *  |                       |    rgn    |                          |
1516 *  +-----------------------+-----------+--------------------------+
1517 *
1518 * Expect to drop the lower limit and allocate a memory region that ends at
1519 * the end of the requested node.
1520 */
1521static int alloc_nid_top_down_numa_split_range_low_check(void)
1522{
1523	int nid_req = 2;
1524	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1525	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1526	void *allocated_ptr = NULL;
1527	phys_addr_t size = SZ_512;
1528	phys_addr_t min_addr;
1529	phys_addr_t max_addr;
1530	phys_addr_t req_node_end;
1531
1532	PREFIX_PUSH();
1533	setup_numa_memblock(node_fractions);
1534
1535	req_node_end = region_end(req_node);
1536	min_addr = req_node_end - SZ_256;
1537	max_addr = min_addr + size;
1538
1539	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1540					       min_addr, max_addr, nid_req);
1541
1542	ASSERT_NE(allocated_ptr, NULL);
1543	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1544
1545	ASSERT_EQ(new_rgn->size, size);
1546	ASSERT_EQ(new_rgn->base, req_node_end - size);
1547	ASSERT_LE(req_node->base, new_rgn->base);
1548
1549	ASSERT_EQ(memblock.reserved.cnt, 1);
1550	ASSERT_EQ(memblock.reserved.total_size, size);
1551
1552	test_pass_pop();
1553
1554	return 0;
1555}
1556
1557/*
1558 * A test that tries to allocate a memory region that spans over the min_addr
1559 * and max_addr range and overlaps with two different nodes, where the second
1560 * node is the requested node:
1561 *
1562 *                               min_addr
1563 *                               |         max_addr
1564 *                               |         |
1565 *                               v         v
1566 *  |      +--------------------------+---------+                |
1567 *  |      |         expected         |requested|                |
1568 *  +------+--------------------------+---------+----------------+
1569 *                               +         +
1570 *  |                       +---------+                          |
1571 *  |                       |   rgn   |                          |
1572 *  +-----------------------+---------+--------------------------+
1573 *
1574 * Expect to drop the lower limit and allocate a memory region that
1575 * ends at the end of the first node that overlaps with the range.
1576 */
1577static int alloc_nid_top_down_numa_split_range_high_check(void)
1578{
1579	int nid_req = 3;
1580	int nid_exp = nid_req - 1;
1581	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1582	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
1583	void *allocated_ptr = NULL;
1584	phys_addr_t size = SZ_512;
1585	phys_addr_t min_addr;
1586	phys_addr_t max_addr;
1587	phys_addr_t exp_node_end;
1588
1589	PREFIX_PUSH();
1590	setup_numa_memblock(node_fractions);
1591
1592	exp_node_end = region_end(exp_node);
1593	min_addr = exp_node_end - SZ_256;
1594	max_addr = min_addr + size;
1595
1596	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1597					       min_addr, max_addr, nid_req);
1598
1599	ASSERT_NE(allocated_ptr, NULL);
1600	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1601
1602	ASSERT_EQ(new_rgn->size, size);
1603	ASSERT_EQ(new_rgn->base, exp_node_end - size);
1604	ASSERT_LE(exp_node->base, new_rgn->base);
1605
1606	ASSERT_EQ(memblock.reserved.cnt, 1);
1607	ASSERT_EQ(memblock.reserved.total_size, size);
1608
1609	test_pass_pop();
1610
1611	return 0;
1612}
1613
1614/*
1615 * A test that tries to allocate a memory region that spans over the min_addr
1616 * and max_addr range and overlaps with two different nodes, where the requested
1617 * node ends before min_addr:
1618 *
1619 *                                         min_addr
1620 *                                         |         max_addr
1621 *                                         |         |
1622 *                                         v         v
1623 *  |    +---------------+        +-------------+---------+          |
1624 *  |    |   requested   |        |    node1    |  node2  |          |
1625 *  +----+---------------+--------+-------------+---------+----------+
1626 *                                         +         +
1627 *  |          +---------+                                           |
1628 *  |          |   rgn   |                                           |
1629 *  +----------+---------+-------------------------------------------+
1630 *
1631 * Expect to drop the lower limit and allocate a memory region that ends at
1632 * the end of the requested node.
1633 */
1634static int alloc_nid_top_down_numa_no_overlap_split_check(void)
1635{
1636	int nid_req = 2;
1637	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1638	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1639	struct memblock_region *node2 = &memblock.memory.regions[6];
1640	void *allocated_ptr = NULL;
1641	phys_addr_t size;
1642	phys_addr_t min_addr;
1643	phys_addr_t max_addr;
1644
1645	PREFIX_PUSH();
1646	setup_numa_memblock(node_fractions);
1647
1648	size = SZ_512;
1649	min_addr = node2->base - SZ_256;
1650	max_addr = min_addr + size;
1651
1652	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1653					       min_addr, max_addr, nid_req);
1654
1655	ASSERT_NE(allocated_ptr, NULL);
1656	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1657
1658	ASSERT_EQ(new_rgn->size, size);
1659	ASSERT_EQ(new_rgn->base, region_end(req_node) - size);
1660	ASSERT_LE(req_node->base, new_rgn->base);
1661
1662	ASSERT_EQ(memblock.reserved.cnt, 1);
1663	ASSERT_EQ(memblock.reserved.total_size, size);
1664
1665	test_pass_pop();
1666
1667	return 0;
1668}
1669
1670/*
1671 * A test that tries to allocate memory within min_addr and max_add range when
1672 * the requested node and the range do not overlap, and requested node ends
1673 * before min_addr. The range overlaps with multiple nodes along node
1674 * boundaries:
1675 *
1676 *                          min_addr
1677 *                          |                                 max_addr
1678 *                          |                                 |
1679 *                          v                                 v
1680 *  |-----------+           +----------+----...----+----------+      |
1681 *  | requested |           | min node |    ...    | max node |      |
1682 *  +-----------+-----------+----------+----...----+----------+------+
1683 *                          +                                 +
1684 *  |                                                   +-----+      |
1685 *  |                                                   | rgn |      |
1686 *  +---------------------------------------------------+-----+------+
1687 *
1688 * Expect to allocate a memory region at the end of the final node in
1689 * the range after falling back to NUMA_NO_NODE.
1690 */
1691static int alloc_nid_top_down_numa_no_overlap_low_check(void)
1692{
1693	int nid_req = 0;
1694	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1695	struct memblock_region *min_node = &memblock.memory.regions[2];
1696	struct memblock_region *max_node = &memblock.memory.regions[5];
1697	void *allocated_ptr = NULL;
1698	phys_addr_t size = SZ_64;
1699	phys_addr_t max_addr;
1700	phys_addr_t min_addr;
1701
1702	PREFIX_PUSH();
1703	setup_numa_memblock(node_fractions);
1704
1705	min_addr = min_node->base;
1706	max_addr = region_end(max_node);
1707
1708	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1709					       min_addr, max_addr, nid_req);
1710
1711	ASSERT_NE(allocated_ptr, NULL);
1712	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1713
1714	ASSERT_EQ(new_rgn->size, size);
1715	ASSERT_EQ(new_rgn->base, max_addr - size);
1716	ASSERT_LE(max_node->base, new_rgn->base);
1717
1718	ASSERT_EQ(memblock.reserved.cnt, 1);
1719	ASSERT_EQ(memblock.reserved.total_size, size);
1720
1721	test_pass_pop();
1722
1723	return 0;
1724}
1725
1726/*
1727 * A test that tries to allocate memory within min_addr and max_add range when
1728 * the requested node and the range do not overlap, and requested node starts
1729 * after max_addr. The range overlaps with multiple nodes along node
1730 * boundaries:
1731 *
1732 *        min_addr
1733 *        |                                 max_addr
1734 *        |                                 |
1735 *        v                                 v
1736 *  |     +----------+----...----+----------+        +-----------+   |
1737 *  |     | min node |    ...    | max node |        | requested |   |
1738 *  +-----+----------+----...----+----------+--------+-----------+---+
1739 *        +                                 +
1740 *  |                                 +-----+                        |
1741 *  |                                 | rgn |                        |
1742 *  +---------------------------------+-----+------------------------+
1743 *
1744 * Expect to allocate a memory region at the end of the final node in
1745 * the range after falling back to NUMA_NO_NODE.
1746 */
1747static int alloc_nid_top_down_numa_no_overlap_high_check(void)
1748{
1749	int nid_req = 7;
1750	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1751	struct memblock_region *min_node = &memblock.memory.regions[2];
1752	struct memblock_region *max_node = &memblock.memory.regions[5];
1753	void *allocated_ptr = NULL;
1754	phys_addr_t size = SZ_64;
1755	phys_addr_t max_addr;
1756	phys_addr_t min_addr;
1757
1758	PREFIX_PUSH();
1759	setup_numa_memblock(node_fractions);
1760
1761	min_addr = min_node->base;
1762	max_addr = region_end(max_node);
1763
1764	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1765					       min_addr, max_addr, nid_req);
1766
1767	ASSERT_NE(allocated_ptr, NULL);
1768	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1769
1770	ASSERT_EQ(new_rgn->size, size);
1771	ASSERT_EQ(new_rgn->base, max_addr - size);
1772	ASSERT_LE(max_node->base, new_rgn->base);
1773
1774	ASSERT_EQ(memblock.reserved.cnt, 1);
1775	ASSERT_EQ(memblock.reserved.total_size, size);
1776
1777	test_pass_pop();
1778
1779	return 0;
1780}
1781
1782/*
1783 * A test that tries to allocate a memory region in a specific NUMA node that
1784 * has enough memory to allocate a region of the requested size.
1785 * Expect to allocate an aligned region at the beginning of the requested node.
1786 */
1787static int alloc_nid_bottom_up_numa_simple_check(void)
1788{
1789	int nid_req = 3;
1790	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1791	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1792	void *allocated_ptr = NULL;
1793	phys_addr_t size;
1794	phys_addr_t min_addr;
1795	phys_addr_t max_addr;
1796
1797	PREFIX_PUSH();
1798	setup_numa_memblock(node_fractions);
1799
1800	ASSERT_LE(SZ_4, req_node->size);
1801	size = req_node->size / SZ_4;
1802	min_addr = memblock_start_of_DRAM();
1803	max_addr = memblock_end_of_DRAM();
1804
1805	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1806					       min_addr, max_addr, nid_req);
1807
1808	ASSERT_NE(allocated_ptr, NULL);
1809	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1810
1811	ASSERT_EQ(new_rgn->size, size);
1812	ASSERT_EQ(new_rgn->base, req_node->base);
1813	ASSERT_LE(region_end(new_rgn), region_end(req_node));
1814
1815	ASSERT_EQ(memblock.reserved.cnt, 1);
1816	ASSERT_EQ(memblock.reserved.total_size, size);
1817
1818	test_pass_pop();
1819
1820	return 0;
1821}
1822
1823/*
1824 * A test that tries to allocate a memory region in a specific NUMA node that
1825 * does not have enough memory to allocate a region of the requested size:
1826 *
1827 *  |----------------------+-----+                |
1828 *  |       expected       | req |                |
1829 *  +----------------------+-----+----------------+
1830 *
1831 *  |---------+                                   |
1832 *  |   rgn   |                                   |
1833 *  +---------+-----------------------------------+
1834 *
1835 * Expect to allocate an aligned region at the beginning of the first node that
1836 * has enough memory (in this case, nid = 0) after falling back to NUMA_NO_NODE.
1837 */
1838static int alloc_nid_bottom_up_numa_small_node_check(void)
1839{
1840	int nid_req = 1;
1841	int nid_exp = 0;
1842	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1843	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1844	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
1845	void *allocated_ptr = NULL;
1846	phys_addr_t size;
1847	phys_addr_t min_addr;
1848	phys_addr_t max_addr;
1849
1850	PREFIX_PUSH();
1851	setup_numa_memblock(node_fractions);
1852
1853	size = SZ_2 * req_node->size;
1854	min_addr = memblock_start_of_DRAM();
1855	max_addr = memblock_end_of_DRAM();
1856
1857	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1858					       min_addr, max_addr, nid_req);
1859
1860	ASSERT_NE(allocated_ptr, NULL);
1861	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1862
1863	ASSERT_EQ(new_rgn->size, size);
1864	ASSERT_EQ(new_rgn->base, exp_node->base);
1865	ASSERT_LE(region_end(new_rgn), region_end(exp_node));
1866
1867	ASSERT_EQ(memblock.reserved.cnt, 1);
1868	ASSERT_EQ(memblock.reserved.total_size, size);
1869
1870	test_pass_pop();
1871
1872	return 0;
1873}
1874
1875/*
1876 * A test that tries to allocate a memory region in a specific NUMA node that
1877 * is fully reserved:
1878 *
1879 *  |----------------------+     +-----------+                    |
1880 *  |       expected       |     | requested |                    |
1881 *  +----------------------+-----+-----------+--------------------+
1882 *
1883 *  |-----------+                +-----------+                    |
1884 *  |    new    |                |  reserved |                    |
1885 *  +-----------+----------------+-----------+--------------------+
1886 *
1887 * Expect to allocate an aligned region at the beginning of the first node that
1888 * is large enough and has enough unreserved memory (in this case, nid = 0)
1889 * after falling back to NUMA_NO_NODE. The region count and total size get
1890 * updated.
1891 */
1892static int alloc_nid_bottom_up_numa_node_reserved_check(void)
1893{
1894	int nid_req = 2;
1895	int nid_exp = 0;
1896	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1897	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1898	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
1899	void *allocated_ptr = NULL;
1900	phys_addr_t size;
1901	phys_addr_t min_addr;
1902	phys_addr_t max_addr;
1903
1904	PREFIX_PUSH();
1905	setup_numa_memblock(node_fractions);
1906
1907	size = req_node->size;
1908	min_addr = memblock_start_of_DRAM();
1909	max_addr = memblock_end_of_DRAM();
1910
1911	memblock_reserve(req_node->base, req_node->size);
1912	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1913					       min_addr, max_addr, nid_req);
1914
1915	ASSERT_NE(allocated_ptr, NULL);
1916	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1917
1918	ASSERT_EQ(new_rgn->size, size);
1919	ASSERT_EQ(new_rgn->base, exp_node->base);
1920	ASSERT_LE(region_end(new_rgn), region_end(exp_node));
1921
1922	ASSERT_EQ(memblock.reserved.cnt, 2);
1923	ASSERT_EQ(memblock.reserved.total_size, size + req_node->size);
1924
1925	test_pass_pop();
1926
1927	return 0;
1928}
1929
1930/*
1931 * A test that tries to allocate a memory region in a specific NUMA node that
1932 * is partially reserved but has enough memory for the allocated region:
1933 *
1934 *  |           +---------------------------------------+         |
1935 *  |           |               requested               |         |
1936 *  +-----------+---------------------------------------+---------+
1937 *
1938 *  |           +------------------+-----+                        |
1939 *  |           |     reserved     | new |                        |
1940 *  +-----------+------------------+-----+------------------------+
1941 *
1942 * Expect to allocate an aligned region in the requested node that merges with
1943 * the existing reserved region. The total size gets updated.
1944 */
1945static int alloc_nid_bottom_up_numa_part_reserved_check(void)
1946{
1947	int nid_req = 4;
1948	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
1949	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
1950	void *allocated_ptr = NULL;
1951	struct region r1;
1952	phys_addr_t size;
1953	phys_addr_t min_addr;
1954	phys_addr_t max_addr;
1955	phys_addr_t total_size;
1956
1957	PREFIX_PUSH();
1958	setup_numa_memblock(node_fractions);
1959
1960	ASSERT_LE(SZ_8, req_node->size);
1961	r1.base = req_node->base;
1962	r1.size = req_node->size / SZ_2;
1963	size = r1.size / SZ_4;
1964	min_addr = memblock_start_of_DRAM();
1965	max_addr = memblock_end_of_DRAM();
1966	total_size = size + r1.size;
1967
1968	memblock_reserve(r1.base, r1.size);
1969	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
1970					       min_addr, max_addr, nid_req);
1971
1972	ASSERT_NE(allocated_ptr, NULL);
1973	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
1974
1975	ASSERT_EQ(new_rgn->size, total_size);
1976	ASSERT_EQ(new_rgn->base, req_node->base);
1977	ASSERT_LE(region_end(new_rgn), region_end(req_node));
1978
1979	ASSERT_EQ(memblock.reserved.cnt, 1);
1980	ASSERT_EQ(memblock.reserved.total_size, total_size);
1981
1982	test_pass_pop();
1983
1984	return 0;
1985}
1986
1987/*
1988 * A test that tries to allocate a memory region in a specific NUMA node that
1989 * is partially reserved and does not have enough contiguous memory for the
1990 * allocated region:
1991 *
1992 *  |----------------------+       +-----------------------+         |
1993 *  |       expected       |       |       requested       |         |
1994 *  +----------------------+-------+-----------------------+---------+
1995 *
1996 *  |-----------+                        +----------+                |
1997 *  |    new    |                        | reserved |                |
1998 *  +-----------+------------------------+----------+----------------+
1999 *
2000 * Expect to allocate an aligned region at the beginning of the first
2001 * node that is large enough and has enough unreserved memory (in this case,
2002 * nid = 0) after falling back to NUMA_NO_NODE. The region count and total size
2003 * get updated.
2004 */
2005static int alloc_nid_bottom_up_numa_part_reserved_fallback_check(void)
2006{
2007	int nid_req = 4;
2008	int nid_exp = 0;
2009	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
2010	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
2011	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
2012	void *allocated_ptr = NULL;
2013	struct region r1;
2014	phys_addr_t size;
2015	phys_addr_t min_addr;
2016	phys_addr_t max_addr;
2017
2018	PREFIX_PUSH();
2019	setup_numa_memblock(node_fractions);
2020
2021	ASSERT_LE(SZ_4, req_node->size);
2022	size = req_node->size / SZ_2;
2023	r1.base = req_node->base + (size / SZ_2);
2024	r1.size = size;
2025
2026	min_addr = memblock_start_of_DRAM();
2027	max_addr = memblock_end_of_DRAM();
2028
2029	memblock_reserve(r1.base, r1.size);
2030	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2031					       min_addr, max_addr, nid_req);
2032
2033	ASSERT_NE(allocated_ptr, NULL);
2034	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
2035
2036	ASSERT_EQ(new_rgn->size, size);
2037	ASSERT_EQ(new_rgn->base, exp_node->base);
2038	ASSERT_LE(region_end(new_rgn), region_end(exp_node));
2039
2040	ASSERT_EQ(memblock.reserved.cnt, 2);
2041	ASSERT_EQ(memblock.reserved.total_size, size + r1.size);
2042
2043	test_pass_pop();
2044
2045	return 0;
2046}
2047
2048/*
2049 * A test that tries to allocate a memory region that spans over the min_addr
2050 * and max_addr range and overlaps with two different nodes, where the first
2051 * node is the requested node:
2052 *
2053 *                                min_addr
2054 *                                |           max_addr
2055 *                                |           |
2056 *                                v           v
2057 *  |           +-----------------------+-----------+              |
2058 *  |           |       requested       |   node3   |              |
2059 *  +-----------+-----------------------+-----------+--------------+
2060 *                                +           +
2061 *  |           +-----------+                                      |
2062 *  |           |    rgn    |                                      |
2063 *  +-----------+-----------+--------------------------------------+
2064 *
2065 * Expect to drop the lower limit and allocate a memory region at the beginning
2066 * of the requested node.
2067 */
2068static int alloc_nid_bottom_up_numa_split_range_low_check(void)
2069{
2070	int nid_req = 2;
2071	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
2072	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
2073	void *allocated_ptr = NULL;
2074	phys_addr_t size = SZ_512;
2075	phys_addr_t min_addr;
2076	phys_addr_t max_addr;
2077	phys_addr_t req_node_end;
2078
2079	PREFIX_PUSH();
2080	setup_numa_memblock(node_fractions);
2081
2082	req_node_end = region_end(req_node);
2083	min_addr = req_node_end - SZ_256;
2084	max_addr = min_addr + size;
2085
2086	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2087					       min_addr, max_addr, nid_req);
2088
2089	ASSERT_NE(allocated_ptr, NULL);
2090	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
2091
2092	ASSERT_EQ(new_rgn->size, size);
2093	ASSERT_EQ(new_rgn->base, req_node->base);
2094	ASSERT_LE(region_end(new_rgn), req_node_end);
2095
2096	ASSERT_EQ(memblock.reserved.cnt, 1);
2097	ASSERT_EQ(memblock.reserved.total_size, size);
2098
2099	test_pass_pop();
2100
2101	return 0;
2102}
2103
2104/*
2105 * A test that tries to allocate a memory region that spans over the min_addr
2106 * and max_addr range and overlaps with two different nodes, where the second
2107 * node is the requested node:
2108 *
2109 *                                                min_addr
2110 *                                                |         max_addr
2111 *                                                |         |
2112 *                                                v         v
2113 *  |------------------+        +----------------------+---------+      |
2114 *  |     expected     |        |       previous       |requested|      |
2115 *  +------------------+--------+----------------------+---------+------+
2116 *                                                +         +
2117 *  |---------+                                                         |
2118 *  |   rgn   |                                                         |
2119 *  +---------+---------------------------------------------------------+
2120 *
2121 * Expect to drop the lower limit and allocate a memory region at the beginning
2122 * of the first node that has enough memory.
2123 */
2124static int alloc_nid_bottom_up_numa_split_range_high_check(void)
2125{
2126	int nid_req = 3;
2127	int nid_exp = 0;
2128	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
2129	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
2130	struct memblock_region *exp_node = &memblock.memory.regions[nid_exp];
2131	void *allocated_ptr = NULL;
2132	phys_addr_t size = SZ_512;
2133	phys_addr_t min_addr;
2134	phys_addr_t max_addr;
2135	phys_addr_t exp_node_end;
2136
2137	PREFIX_PUSH();
2138	setup_numa_memblock(node_fractions);
2139
2140	exp_node_end = region_end(req_node);
2141	min_addr = req_node->base - SZ_256;
2142	max_addr = min_addr + size;
2143
2144	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2145					       min_addr, max_addr, nid_req);
2146
2147	ASSERT_NE(allocated_ptr, NULL);
2148	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
2149
2150	ASSERT_EQ(new_rgn->size, size);
2151	ASSERT_EQ(new_rgn->base, exp_node->base);
2152	ASSERT_LE(region_end(new_rgn), exp_node_end);
2153
2154	ASSERT_EQ(memblock.reserved.cnt, 1);
2155	ASSERT_EQ(memblock.reserved.total_size, size);
2156
2157	test_pass_pop();
2158
2159	return 0;
2160}
2161
2162/*
2163 * A test that tries to allocate a memory region that spans over the min_addr
2164 * and max_addr range and overlaps with two different nodes, where the requested
2165 * node ends before min_addr:
2166 *
2167 *                                          min_addr
2168 *                                         |         max_addr
2169 *                                         |         |
2170 *                                         v         v
2171 *  |    +---------------+        +-------------+---------+         |
2172 *  |    |   requested   |        |    node1    |  node2  |         |
2173 *  +----+---------------+--------+-------------+---------+---------+
2174 *                                         +         +
2175 *  |    +---------+                                                |
2176 *  |    |   rgn   |                                                |
2177 *  +----+---------+------------------------------------------------+
2178 *
2179 * Expect to drop the lower limit and allocate a memory region that starts at
2180 * the beginning of the requested node.
2181 */
2182static int alloc_nid_bottom_up_numa_no_overlap_split_check(void)
2183{
2184	int nid_req = 2;
2185	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
2186	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
2187	struct memblock_region *node2 = &memblock.memory.regions[6];
2188	void *allocated_ptr = NULL;
2189	phys_addr_t size;
2190	phys_addr_t min_addr;
2191	phys_addr_t max_addr;
2192
2193	PREFIX_PUSH();
2194	setup_numa_memblock(node_fractions);
2195
2196	size = SZ_512;
2197	min_addr = node2->base - SZ_256;
2198	max_addr = min_addr + size;
2199
2200	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2201					       min_addr, max_addr, nid_req);
2202
2203	ASSERT_NE(allocated_ptr, NULL);
2204	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
2205
2206	ASSERT_EQ(new_rgn->size, size);
2207	ASSERT_EQ(new_rgn->base, req_node->base);
2208	ASSERT_LE(region_end(new_rgn), region_end(req_node));
2209
2210	ASSERT_EQ(memblock.reserved.cnt, 1);
2211	ASSERT_EQ(memblock.reserved.total_size, size);
2212
2213	test_pass_pop();
2214
2215	return 0;
2216}
2217
2218/*
2219 * A test that tries to allocate memory within min_addr and max_add range when
2220 * the requested node and the range do not overlap, and requested node ends
2221 * before min_addr. The range overlaps with multiple nodes along node
2222 * boundaries:
2223 *
2224 *                          min_addr
2225 *                          |                                 max_addr
2226 *                          |                                 |
2227 *                          v                                 v
2228 *  |-----------+           +----------+----...----+----------+      |
2229 *  | requested |           | min node |    ...    | max node |      |
2230 *  +-----------+-----------+----------+----...----+----------+------+
2231 *                          +                                 +
2232 *  |                       +-----+                                  |
2233 *  |                       | rgn |                                  |
2234 *  +-----------------------+-----+----------------------------------+
2235 *
2236 * Expect to allocate a memory region at the beginning of the first node
2237 * in the range after falling back to NUMA_NO_NODE.
2238 */
2239static int alloc_nid_bottom_up_numa_no_overlap_low_check(void)
2240{
2241	int nid_req = 0;
2242	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
2243	struct memblock_region *min_node = &memblock.memory.regions[2];
2244	struct memblock_region *max_node = &memblock.memory.regions[5];
2245	void *allocated_ptr = NULL;
2246	phys_addr_t size = SZ_64;
2247	phys_addr_t max_addr;
2248	phys_addr_t min_addr;
2249
2250	PREFIX_PUSH();
2251	setup_numa_memblock(node_fractions);
2252
2253	min_addr = min_node->base;
2254	max_addr = region_end(max_node);
2255
2256	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2257					       min_addr, max_addr, nid_req);
2258
2259	ASSERT_NE(allocated_ptr, NULL);
2260	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
2261
2262	ASSERT_EQ(new_rgn->size, size);
2263	ASSERT_EQ(new_rgn->base, min_addr);
2264	ASSERT_LE(region_end(new_rgn), region_end(min_node));
2265
2266	ASSERT_EQ(memblock.reserved.cnt, 1);
2267	ASSERT_EQ(memblock.reserved.total_size, size);
2268
2269	test_pass_pop();
2270
2271	return 0;
2272}
2273
2274/*
2275 * A test that tries to allocate memory within min_addr and max_add range when
2276 * the requested node and the range do not overlap, and requested node starts
2277 * after max_addr. The range overlaps with multiple nodes along node
2278 * boundaries:
2279 *
2280 *        min_addr
2281 *        |                                 max_addr
2282 *        |                                 |
2283 *        v                                 v
2284 *  |     +----------+----...----+----------+         +---------+   |
2285 *  |     | min node |    ...    | max node |         |requested|   |
2286 *  +-----+----------+----...----+----------+---------+---------+---+
2287 *        +                                 +
2288 *  |     +-----+                                                   |
2289 *  |     | rgn |                                                   |
2290 *  +-----+-----+---------------------------------------------------+
2291 *
2292 * Expect to allocate a memory region at the beginning of the first node
2293 * in the range after falling back to NUMA_NO_NODE.
2294 */
2295static int alloc_nid_bottom_up_numa_no_overlap_high_check(void)
2296{
2297	int nid_req = 7;
2298	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
2299	struct memblock_region *min_node = &memblock.memory.regions[2];
2300	struct memblock_region *max_node = &memblock.memory.regions[5];
2301	void *allocated_ptr = NULL;
2302	phys_addr_t size = SZ_64;
2303	phys_addr_t max_addr;
2304	phys_addr_t min_addr;
2305
2306	PREFIX_PUSH();
2307	setup_numa_memblock(node_fractions);
2308
2309	min_addr = min_node->base;
2310	max_addr = region_end(max_node);
2311
2312	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2313					       min_addr, max_addr, nid_req);
2314
2315	ASSERT_NE(allocated_ptr, NULL);
2316	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
2317
2318	ASSERT_EQ(new_rgn->size, size);
2319	ASSERT_EQ(new_rgn->base, min_addr);
2320	ASSERT_LE(region_end(new_rgn), region_end(min_node));
2321
2322	ASSERT_EQ(memblock.reserved.cnt, 1);
2323	ASSERT_EQ(memblock.reserved.total_size, size);
2324
2325	test_pass_pop();
2326
2327	return 0;
2328}
2329
2330/*
2331 * A test that tries to allocate a memory region in a specific NUMA node that
2332 * does not have enough memory to allocate a region of the requested size.
2333 * Additionally, none of the nodes have enough memory to allocate the region:
2334 *
2335 * +-----------------------------------+
2336 * |                new                |
2337 * +-----------------------------------+
2338 *     |-------+-------+-------+-------+-------+-------+-------+-------|
2339 *     | node0 | node1 | node2 | node3 | node4 | node5 | node6 | node7 |
2340 *     +-------+-------+-------+-------+-------+-------+-------+-------+
2341 *
2342 * Expect no allocation to happen.
2343 */
2344static int alloc_nid_numa_large_region_generic_check(void)
2345{
2346	int nid_req = 3;
2347	void *allocated_ptr = NULL;
2348	phys_addr_t size = MEM_SIZE / SZ_2;
2349	phys_addr_t min_addr;
2350	phys_addr_t max_addr;
2351
2352	PREFIX_PUSH();
2353	setup_numa_memblock(node_fractions);
2354
2355	min_addr = memblock_start_of_DRAM();
2356	max_addr = memblock_end_of_DRAM();
2357
2358	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2359					       min_addr, max_addr, nid_req);
2360	ASSERT_EQ(allocated_ptr, NULL);
2361
2362	test_pass_pop();
2363
2364	return 0;
2365}
2366
2367/*
2368 * A test that tries to allocate memory within min_addr and max_addr range when
2369 * there are two reserved regions at the borders. The requested node starts at
2370 * min_addr and ends at max_addr and is the same size as the region to be
2371 * allocated:
2372 *
2373 *                     min_addr
2374 *                     |                       max_addr
2375 *                     |                       |
2376 *                     v                       v
2377 *  |      +-----------+-----------------------+-----------------------|
2378 *  |      |   node5   |       requested       |         node7         |
2379 *  +------+-----------+-----------------------+-----------------------+
2380 *                     +                       +
2381 *  |             +----+-----------------------+----+                  |
2382 *  |             | r2 |          new          | r1 |                  |
2383 *  +-------------+----+-----------------------+----+------------------+
2384 *
2385 * Expect to merge all of the regions into one. The region counter and total
2386 * size fields get updated.
2387 */
2388static int alloc_nid_numa_reserved_full_merge_generic_check(void)
2389{
2390	int nid_req = 6;
2391	int nid_next = nid_req + 1;
2392	struct memblock_region *new_rgn = &memblock.reserved.regions[0];
2393	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
2394	struct memblock_region *next_node = &memblock.memory.regions[nid_next];
2395	void *allocated_ptr = NULL;
2396	struct region r1, r2;
2397	phys_addr_t size = req_node->size;
2398	phys_addr_t total_size;
2399	phys_addr_t max_addr;
2400	phys_addr_t min_addr;
2401
2402	PREFIX_PUSH();
2403	setup_numa_memblock(node_fractions);
2404
2405	r1.base = next_node->base;
2406	r1.size = SZ_128;
2407
2408	r2.size = SZ_128;
2409	r2.base = r1.base - (size + r2.size);
2410
2411	total_size = r1.size + r2.size + size;
2412	min_addr = r2.base + r2.size;
2413	max_addr = r1.base;
2414
2415	memblock_reserve(r1.base, r1.size);
2416	memblock_reserve(r2.base, r2.size);
2417
2418	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2419					       min_addr, max_addr, nid_req);
2420
2421	ASSERT_NE(allocated_ptr, NULL);
2422	assert_mem_content(allocated_ptr, size, alloc_nid_test_flags);
2423
2424	ASSERT_EQ(new_rgn->size, total_size);
2425	ASSERT_EQ(new_rgn->base, r2.base);
2426
2427	ASSERT_LE(new_rgn->base, req_node->base);
2428	ASSERT_LE(region_end(req_node), region_end(new_rgn));
2429
2430	ASSERT_EQ(memblock.reserved.cnt, 1);
2431	ASSERT_EQ(memblock.reserved.total_size, total_size);
2432
2433	test_pass_pop();
2434
2435	return 0;
2436}
2437
2438/*
2439 * A test that tries to allocate memory within min_addr and max_add range,
2440 * where the total range can fit the region, but it is split between two nodes
2441 * and everything else is reserved. Additionally, nid is set to NUMA_NO_NODE
2442 * instead of requesting a specific node:
2443 *
2444 *                         +-----------+
2445 *                         |    new    |
2446 *                         +-----------+
2447 *  |      +---------------------+-----------|
2448 *  |      |      prev node      | next node |
2449 *  +------+---------------------+-----------+
2450 *                         +           +
2451 *  |----------------------+           +-----|
2452 *  |          r1          |           |  r2 |
2453 *  +----------------------+-----------+-----+
2454 *                         ^           ^
2455 *                         |           |
2456 *                         |           max_addr
2457 *                         |
2458 *                         min_addr
2459 *
2460 * Expect no allocation to happen.
2461 */
2462static int alloc_nid_numa_split_all_reserved_generic_check(void)
2463{
2464	void *allocated_ptr = NULL;
2465	struct memblock_region *next_node = &memblock.memory.regions[7];
2466	struct region r1, r2;
2467	phys_addr_t size = SZ_256;
2468	phys_addr_t max_addr;
2469	phys_addr_t min_addr;
2470
2471	PREFIX_PUSH();
2472	setup_numa_memblock(node_fractions);
2473
2474	r2.base = next_node->base + SZ_128;
2475	r2.size = memblock_end_of_DRAM() - r2.base;
2476
2477	r1.size = MEM_SIZE - (r2.size + size);
2478	r1.base = memblock_start_of_DRAM();
2479
2480	min_addr = r1.base + r1.size;
2481	max_addr = r2.base;
2482
2483	memblock_reserve(r1.base, r1.size);
2484	memblock_reserve(r2.base, r2.size);
2485
2486	allocated_ptr = run_memblock_alloc_nid(size, SMP_CACHE_BYTES,
2487					       min_addr, max_addr,
2488					       NUMA_NO_NODE);
2489
2490	ASSERT_EQ(allocated_ptr, NULL);
2491
2492	test_pass_pop();
2493
2494	return 0;
2495}
2496
2497/*
2498 * A simple test that tries to allocate a memory region through the
2499 * memblock_alloc_node() on a NUMA node with id `nid`. Expected to have the
2500 * correct NUMA node set for the new region.
2501 */
2502static int alloc_node_on_correct_nid(void)
2503{
2504	int nid_req = 2;
2505	void *allocated_ptr = NULL;
2506#ifdef CONFIG_NUMA
2507	struct memblock_region *req_node = &memblock.memory.regions[nid_req];
2508#endif
2509	phys_addr_t size = SZ_512;
2510
2511	PREFIX_PUSH();
2512	setup_numa_memblock(node_fractions);
2513
2514	allocated_ptr = memblock_alloc_node(size, SMP_CACHE_BYTES, nid_req);
2515
2516	ASSERT_NE(allocated_ptr, NULL);
2517#ifdef CONFIG_NUMA
2518	ASSERT_EQ(nid_req, req_node->nid);
2519#endif
2520
2521	test_pass_pop();
2522
2523	return 0;
2524}
2525
2526/* Test case wrappers for NUMA tests */
2527static int alloc_nid_numa_simple_check(void)
2528{
2529	test_print("\tRunning %s...\n", __func__);
2530	memblock_set_bottom_up(false);
2531	alloc_nid_top_down_numa_simple_check();
2532	memblock_set_bottom_up(true);
2533	alloc_nid_bottom_up_numa_simple_check();
2534
2535	return 0;
2536}
2537
2538static int alloc_nid_numa_small_node_check(void)
2539{
2540	test_print("\tRunning %s...\n", __func__);
2541	memblock_set_bottom_up(false);
2542	alloc_nid_top_down_numa_small_node_check();
2543	memblock_set_bottom_up(true);
2544	alloc_nid_bottom_up_numa_small_node_check();
2545
2546	return 0;
2547}
2548
2549static int alloc_nid_numa_node_reserved_check(void)
2550{
2551	test_print("\tRunning %s...\n", __func__);
2552	memblock_set_bottom_up(false);
2553	alloc_nid_top_down_numa_node_reserved_check();
2554	memblock_set_bottom_up(true);
2555	alloc_nid_bottom_up_numa_node_reserved_check();
2556
2557	return 0;
2558}
2559
2560static int alloc_nid_numa_part_reserved_check(void)
2561{
2562	test_print("\tRunning %s...\n", __func__);
2563	memblock_set_bottom_up(false);
2564	alloc_nid_top_down_numa_part_reserved_check();
2565	memblock_set_bottom_up(true);
2566	alloc_nid_bottom_up_numa_part_reserved_check();
2567
2568	return 0;
2569}
2570
2571static int alloc_nid_numa_part_reserved_fallback_check(void)
2572{
2573	test_print("\tRunning %s...\n", __func__);
2574	memblock_set_bottom_up(false);
2575	alloc_nid_top_down_numa_part_reserved_fallback_check();
2576	memblock_set_bottom_up(true);
2577	alloc_nid_bottom_up_numa_part_reserved_fallback_check();
2578
2579	return 0;
2580}
2581
2582static int alloc_nid_numa_split_range_low_check(void)
2583{
2584	test_print("\tRunning %s...\n", __func__);
2585	memblock_set_bottom_up(false);
2586	alloc_nid_top_down_numa_split_range_low_check();
2587	memblock_set_bottom_up(true);
2588	alloc_nid_bottom_up_numa_split_range_low_check();
2589
2590	return 0;
2591}
2592
2593static int alloc_nid_numa_split_range_high_check(void)
2594{
2595	test_print("\tRunning %s...\n", __func__);
2596	memblock_set_bottom_up(false);
2597	alloc_nid_top_down_numa_split_range_high_check();
2598	memblock_set_bottom_up(true);
2599	alloc_nid_bottom_up_numa_split_range_high_check();
2600
2601	return 0;
2602}
2603
2604static int alloc_nid_numa_no_overlap_split_check(void)
2605{
2606	test_print("\tRunning %s...\n", __func__);
2607	memblock_set_bottom_up(false);
2608	alloc_nid_top_down_numa_no_overlap_split_check();
2609	memblock_set_bottom_up(true);
2610	alloc_nid_bottom_up_numa_no_overlap_split_check();
2611
2612	return 0;
2613}
2614
2615static int alloc_nid_numa_no_overlap_low_check(void)
2616{
2617	test_print("\tRunning %s...\n", __func__);
2618	memblock_set_bottom_up(false);
2619	alloc_nid_top_down_numa_no_overlap_low_check();
2620	memblock_set_bottom_up(true);
2621	alloc_nid_bottom_up_numa_no_overlap_low_check();
2622
2623	return 0;
2624}
2625
2626static int alloc_nid_numa_no_overlap_high_check(void)
2627{
2628	test_print("\tRunning %s...\n", __func__);
2629	memblock_set_bottom_up(false);
2630	alloc_nid_top_down_numa_no_overlap_high_check();
2631	memblock_set_bottom_up(true);
2632	alloc_nid_bottom_up_numa_no_overlap_high_check();
2633
2634	return 0;
2635}
2636
2637static int alloc_nid_numa_large_region_check(void)
2638{
2639	test_print("\tRunning %s...\n", __func__);
2640	run_top_down(alloc_nid_numa_large_region_generic_check);
2641	run_bottom_up(alloc_nid_numa_large_region_generic_check);
2642
2643	return 0;
2644}
2645
2646static int alloc_nid_numa_reserved_full_merge_check(void)
2647{
2648	test_print("\tRunning %s...\n", __func__);
2649	run_top_down(alloc_nid_numa_reserved_full_merge_generic_check);
2650	run_bottom_up(alloc_nid_numa_reserved_full_merge_generic_check);
2651
2652	return 0;
2653}
2654
2655static int alloc_nid_numa_split_all_reserved_check(void)
2656{
2657	test_print("\tRunning %s...\n", __func__);
2658	run_top_down(alloc_nid_numa_split_all_reserved_generic_check);
2659	run_bottom_up(alloc_nid_numa_split_all_reserved_generic_check);
2660
2661	return 0;
2662}
2663
2664static int alloc_node_numa_on_correct_nid(void)
2665{
2666	test_print("\tRunning %s...\n", __func__);
2667	run_top_down(alloc_node_on_correct_nid);
2668	run_bottom_up(alloc_node_on_correct_nid);
2669
2670	return 0;
2671}
2672
2673int __memblock_alloc_nid_numa_checks(void)
2674{
2675	test_print("Running %s NUMA tests...\n",
2676		   get_memblock_alloc_nid_name(alloc_nid_test_flags));
2677
2678	alloc_nid_numa_simple_check();
2679	alloc_nid_numa_small_node_check();
2680	alloc_nid_numa_node_reserved_check();
2681	alloc_nid_numa_part_reserved_check();
2682	alloc_nid_numa_part_reserved_fallback_check();
2683	alloc_nid_numa_split_range_low_check();
2684	alloc_nid_numa_split_range_high_check();
2685
2686	alloc_nid_numa_no_overlap_split_check();
2687	alloc_nid_numa_no_overlap_low_check();
2688	alloc_nid_numa_no_overlap_high_check();
2689	alloc_nid_numa_large_region_check();
2690	alloc_nid_numa_reserved_full_merge_check();
2691	alloc_nid_numa_split_all_reserved_check();
2692
2693	alloc_node_numa_on_correct_nid();
2694
2695	return 0;
2696}
2697
2698static int memblock_alloc_nid_checks_internal(int flags)
2699{
2700	alloc_nid_test_flags = flags;
2701
2702	prefix_reset();
2703	prefix_push(get_memblock_alloc_nid_name(flags));
2704
2705	reset_memblock_attributes();
2706	dummy_physical_memory_init();
2707
2708	memblock_alloc_nid_range_checks();
2709	memblock_alloc_nid_numa_checks();
2710
2711	dummy_physical_memory_cleanup();
2712
2713	prefix_pop();
2714
2715	return 0;
2716}
2717
2718int memblock_alloc_nid_checks(void)
2719{
2720	memblock_alloc_nid_checks_internal(TEST_F_NONE);
2721	memblock_alloc_nid_checks_internal(TEST_F_RAW);
2722
2723	return 0;
2724}
2725
2726int memblock_alloc_exact_nid_range_checks(void)
2727{
2728	alloc_nid_test_flags = (TEST_F_RAW | TEST_F_EXACT);
2729
2730	memblock_alloc_nid_range_checks();
2731
2732	return 0;
2733}
2734