// SPDX-License-Identifier: GPL-2.0-or-later
#include "alloc_nid_api.h"
/*
* A simple test that tries to allocate a memory region within min_addr and
* max_addr range:
*
* + +
* | + +-----------+ |
* | | | rgn | |
* +----+-------+-----------+------+
* ^ ^
* | |
* min_addr max_addr
*
* Expect to allocate a cleared region that ends at max_addr.
*/
static int alloc_try_nid_top_down_simple_check(void)
{
struct memblock_region *rgn = &memblock.reserved.regions[0];
void *allocated_ptr = NULL;
char *b;
PREFIX_PUSH();
phys_addr_t size = SZ_128;
phys_addr_t min_addr;
phys_addr_t max_addr;
phys_addr_t rgn_end;
setup_memblock();
min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES * 2;
max_addr = min_addr + SZ_512;
allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
min_addr, max_addr, NUMA_NO_NODE);
b = (char *)allocated_ptr;
rgn_end = rgn->base + rgn->size;
ASSERT_NE(allocated_ptr, NULL);
ASSERT_EQ(*b, 0);
ASSERT_EQ(rgn->size, size);
ASSERT_EQ(rgn->base, max_addr - size);
ASSERT_EQ(rgn_end, max_addr);
ASSERT_EQ(memblock.reserved.cnt, 1);
ASSERT_EQ(memblock.reserved.total_size, size);
test_pass_pop();
return 0;
}
/*
* A simple test that tries to allocate a memory region within min_addr and
* max_addr range, where the end address is misaligned:
*
* + + +
* | + +---------+ + |
* | | | rgn | | |
* +------+-------+---------+--+----+
* ^ ^ ^
* | | |
* min_add | max_addr
* |
* Aligned address
* boundary
*
* Expect to allocate a cleared, aligned region that ends before max_addr.
*/
static int alloc_try_nid_top_down_end_misaligned_check(void)
{
struct memblock_region *rgn = &memblock.reserved.regions[0];
void *allocated_ptr = NULL;
char *b;
PREFIX_PUSH();
phys_addr_t size = SZ_128;
phys_addr_t misalign = SZ_2;
phys_addr_t min_addr;
phys_addr_t max_addr;
phys_addr_t rgn_end;
setup_memblock();
min_addr = memblock_start_of_DRAM() + SMP_CACHE_BYTES * 2;
max_addr = min_addr + SZ_512 + misalign;
allocated_ptr = memblock_alloc_try_nid(size, SMP_CACHE_BYTES,
min_addr, max_addr, NUMA_NO_NODE);
b =