tools/testing/memblock/tests/alloc_exact_nid_api.c
Source file repositories/reference/linux-study-clean/tools/testing/memblock/tests/alloc_exact_nid_api.c
File Facts
- System
- Linux kernel
- Corpus path
tools/testing/memblock/tests/alloc_exact_nid_api.c- Extension
.c- Size
- 34212 bytes
- Lines
- 1114
- Domain
- Support Tooling And Documentation
- Bucket
- tools
- Inferred role
- Support Tooling And Documentation: implementation source
- Status
- source implementation candidate
Why This File Exists
Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
alloc_exact_nid_api.halloc_nid_api.h
Detected Declarations
function alloc_exact_nid_top_down_numa_simple_checkfunction alloc_exact_nid_top_down_numa_part_reserved_checkfunction alloc_exact_nid_top_down_numa_split_range_low_checkfunction alloc_exact_nid_top_down_numa_no_overlap_split_checkfunction alloc_exact_nid_top_down_numa_no_overlap_low_checkfunction alloc_exact_nid_bottom_up_numa_simple_checkfunction alloc_exact_nid_bottom_up_numa_part_reserved_checkfunction alloc_exact_nid_bottom_up_numa_split_range_low_checkfunction alloc_exact_nid_bottom_up_numa_no_overlap_split_checkfunction alloc_exact_nid_bottom_up_numa_no_overlap_low_checkfunction alloc_exact_nid_numa_small_node_generic_checkfunction alloc_exact_nid_numa_node_reserved_generic_checkfunction alloc_exact_nid_numa_part_reserved_fail_generic_checkfunction alloc_exact_nid_numa_split_range_high_generic_checkfunction alloc_exact_nid_numa_no_overlap_high_generic_checkfunction alloc_exact_nid_numa_large_region_generic_checkfunction alloc_exact_nid_numa_reserved_full_merge_generic_checkfunction alloc_exact_nid_numa_split_all_reserved_generic_checkfunction alloc_exact_nid_numa_simple_checkfunction alloc_exact_nid_numa_part_reserved_checkfunction alloc_exact_nid_numa_split_range_low_checkfunction alloc_exact_nid_numa_no_overlap_split_checkfunction alloc_exact_nid_numa_no_overlap_low_checkfunction alloc_exact_nid_numa_small_node_checkfunction alloc_exact_nid_numa_node_reserved_checkfunction alloc_exact_nid_numa_part_reserved_fail_checkfunction alloc_exact_nid_numa_split_range_high_checkfunction alloc_exact_nid_numa_no_overlap_high_checkfunction alloc_exact_nid_numa_large_region_checkfunction alloc_exact_nid_numa_reserved_full_merge_checkfunction alloc_exact_nid_numa_split_all_reserved_checkfunction __memblock_alloc_exact_nid_numa_checksfunction memblock_alloc_exact_nid_checks
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0-or-later
#include "alloc_exact_nid_api.h"
#include "alloc_nid_api.h"
#define FUNC_NAME "memblock_alloc_exact_nid_raw"
/*
* contains the fraction of MEM_SIZE contained in each node in basis point
* units (one hundredth of 1% or 1/10000)
*/
static const unsigned int node_fractions[] = {
2500, /* 1/4 */
625, /* 1/16 */
1250, /* 1/8 */
1250, /* 1/8 */
625, /* 1/16 */
625, /* 1/16 */
2500, /* 1/4 */
625, /* 1/16 */
};
/*
* A test that tries to allocate a memory region in a specific NUMA node that
* has enough memory to allocate a region of the requested size.
* Expect to allocate an aligned region at the end of the requested node.
*/
static int alloc_exact_nid_top_down_numa_simple_check(void)
{
int nid_req = 3;
struct memblock_region *new_rgn = &memblock.reserved.regions[0];
struct memblock_region *req_node = &memblock.memory.regions[nid_req];
void *allocated_ptr = NULL;
phys_addr_t size;
phys_addr_t min_addr;
phys_addr_t max_addr;
PREFIX_PUSH();
setup_numa_memblock(node_fractions);
ASSERT_LE(SZ_4, req_node->size);
size = req_node->size / SZ_4;
min_addr = memblock_start_of_DRAM();
max_addr = memblock_end_of_DRAM();
allocated_ptr = memblock_alloc_exact_nid_raw(size, SMP_CACHE_BYTES,
min_addr, max_addr,
nid_req);
ASSERT_NE(allocated_ptr, NULL);
ASSERT_MEM_NE(allocated_ptr, 0, size);
ASSERT_EQ(new_rgn->size, size);
ASSERT_EQ(new_rgn->base, region_end(req_node) - size);
ASSERT_LE(req_node->base, new_rgn->base);
ASSERT_EQ(memblock.reserved.cnt, 1);
ASSERT_EQ(memblock.reserved.total_size, size);
test_pass_pop();
return 0;
}
/*
* A test that tries to allocate a memory region in a specific NUMA node that
* is partially reserved but has enough memory for the allocated region:
*
* | +---------------------------------------+ |
* | | requested | |
* +-----------+---------------------------------------+----------+
*
* | +------------------+ +-----+ |
* | | reserved | | new | |
* +-----------+------------------+--------------+-----+----------+
*
* Expect to allocate an aligned region at the end of the requested node. The
* region count and total size get updated.
*/
static int alloc_exact_nid_top_down_numa_part_reserved_check(void)
{
int nid_req = 4;
struct memblock_region *new_rgn = &memblock.reserved.regions[1];
struct memblock_region *req_node = &memblock.memory.regions[nid_req];
void *allocated_ptr = NULL;
struct region r1;
phys_addr_t size;
phys_addr_t min_addr;
phys_addr_t max_addr;
PREFIX_PUSH();
Annotation
- Immediate include surface: `alloc_exact_nid_api.h`, `alloc_nid_api.h`.
- Detected declarations: `function alloc_exact_nid_top_down_numa_simple_check`, `function alloc_exact_nid_top_down_numa_part_reserved_check`, `function alloc_exact_nid_top_down_numa_split_range_low_check`, `function alloc_exact_nid_top_down_numa_no_overlap_split_check`, `function alloc_exact_nid_top_down_numa_no_overlap_low_check`, `function alloc_exact_nid_bottom_up_numa_simple_check`, `function alloc_exact_nid_bottom_up_numa_part_reserved_check`, `function alloc_exact_nid_bottom_up_numa_split_range_low_check`, `function alloc_exact_nid_bottom_up_numa_no_overlap_split_check`, `function alloc_exact_nid_bottom_up_numa_no_overlap_low_check`.
- Atlas domain: Support Tooling And Documentation / tools.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.