mm/mm_init.c
Source file repositories/reference/linux-study-clean/mm/mm_init.c
File Facts
- System
- Linux kernel
- Corpus path
mm/mm_init.c- Extension
.c- Size
- 77817 bytes
- Lines
- 2750
- Domain
- Core OS
- Bucket
- Memory Management
- Inferred role
- Core OS: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/init.hlinux/kobject.hlinux/export.hlinux/memory.hlinux/notifier.hlinux/sched.hlinux/mman.hlinux/memblock.hlinux/page-isolation.hlinux/padata.hlinux/nmi.hlinux/buffer_head.hlinux/kmemleak.hlinux/kfence.hlinux/page_ext.hlinux/pti.hlinux/pgtable.hlinux/stackdepot.hlinux/swap.hlinux/cma.hlinux/crash_dump.hlinux/execmem.hlinux/vmstat.hlinux/kexec_handover.hlinux/hugetlb.hinternal.hslab.hshuffle.hasm/setup.h
Detected Declarations
struct mminit_pfnnid_cachefunction mminit_verify_zonelistfunction for_each_online_nodefunction mminit_verify_pageflags_layoutfunction set_mminit_loglevelfunction mm_compute_batchfunction mm_compute_batch_notifierfunction mm_compute_batch_initfunction mm_sysfs_initfunction cmdline_parse_corefunction cmdline_parse_kernelcorefunction cmdline_parse_movablecorefunction early_calculate_totalpagesfunction for_each_mem_pfn_rangefunction find_usable_zone_for_movablefunction find_zone_movable_pfns_for_nodesfunction for_each_mem_regionfunction for_each_mem_regionfunction for_each_mem_pfn_rangefunction __init_single_pagefunction __early_pfn_to_nidfunction early_pfn_to_nidfunction set_hashdistfunction fixup_hashdistfunction fixup_hashdistfunction __init_page_from_nidfunction pgdat_set_deferred_rangefunction early_page_initialisedfunction defer_initfunction __init_deferred_pagefunction pgdat_set_deferred_rangefunction defer_initfunction __init_deferred_pagefunction overlap_memmap_initfunction init_unavailable_rangefunction for_each_valid_pfnfunction memblock_free_allfunction memmap_init_zone_rangefunction memmap_initfunction for_each_mem_pfn_rangefunction __init_zone_device_pagefunction freedfunction compound_nr_pagesfunction memmap_init_compoundfunction memmap_init_zone_devicefunction adjust_zone_range_for_zone_movablefunction __absent_pages_in_rangefunction for_each_mem_pfn_range
Annotated Snippet
struct mminit_pfnnid_cache {
unsigned long last_start;
unsigned long last_end;
int last_nid;
};
static struct mminit_pfnnid_cache early_pfnnid_cache __meminitdata;
/*
* Required by SPARSEMEM. Given a PFN, return what node the PFN is on.
*/
static int __meminit __early_pfn_to_nid(unsigned long pfn,
struct mminit_pfnnid_cache *state)
{
unsigned long start_pfn, end_pfn;
int nid;
if (state->last_start <= pfn && pfn < state->last_end)
return state->last_nid;
nid = memblock_search_pfn_nid(pfn, &start_pfn, &end_pfn);
if (nid != NUMA_NO_NODE) {
state->last_start = start_pfn;
state->last_end = end_pfn;
state->last_nid = nid;
}
return nid;
}
int __meminit early_pfn_to_nid(unsigned long pfn)
{
static DEFINE_SPINLOCK(early_pfn_lock);
int nid;
spin_lock(&early_pfn_lock);
nid = __early_pfn_to_nid(pfn, &early_pfnnid_cache);
if (nid < 0)
nid = first_online_node;
spin_unlock(&early_pfn_lock);
return nid;
}
bool hashdist = HASHDIST_DEFAULT;
static int __init set_hashdist(char *str)
{
return kstrtobool(str, &hashdist) == 0;
}
__setup("hashdist=", set_hashdist);
static inline void fixup_hashdist(void)
{
if (num_node_state(N_MEMORY) == 1)
hashdist = false;
}
#else
static inline void fixup_hashdist(void) {}
#endif /* CONFIG_NUMA */
#ifdef CONFIG_ZONE_DEVICE
static __meminit void pageblock_migratetype_init_range(unsigned long pfn,
unsigned long nr_pages, int migratetype)
{
const unsigned long end = pfn + nr_pages;
for (pfn = pageblock_align(pfn); pfn < end; pfn += pageblock_nr_pages) {
init_pageblock_migratetype(pfn_to_page(pfn), migratetype, false);
if (IS_ALIGNED(pfn, PAGES_PER_SECTION))
cond_resched();
}
}
#endif
/*
* Initialize a reserved page unconditionally, finding its zone first.
*/
void __meminit __init_page_from_nid(unsigned long pfn, int nid)
{
pg_data_t *pgdat;
int zid;
pgdat = NODE_DATA(nid);
for (zid = 0; zid < MAX_NR_ZONES; zid++) {
struct zone *zone = &pgdat->node_zones[zid];
if (zone_spans_pfn(zone, pfn))
break;
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/init.h`, `linux/kobject.h`, `linux/export.h`, `linux/memory.h`, `linux/notifier.h`, `linux/sched.h`, `linux/mman.h`.
- Detected declarations: `struct mminit_pfnnid_cache`, `function mminit_verify_zonelist`, `function for_each_online_node`, `function mminit_verify_pageflags_layout`, `function set_mminit_loglevel`, `function mm_compute_batch`, `function mm_compute_batch_notifier`, `function mm_compute_batch_init`, `function mm_sysfs_init`, `function cmdline_parse_core`.
- Atlas domain: Core OS / Memory Management.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
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.