arch/s390/mm/pgalloc.c
Source file repositories/reference/linux-study-clean/arch/s390/mm/pgalloc.c
File Facts
- System
- Linux kernel
- Corpus path
arch/s390/mm/pgalloc.c- Extension
.c- Size
- 11580 bytes
- Lines
- 458
- Domain
- Architecture Layer
- Bucket
- arch/s390
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/sysctl.hlinux/slab.hlinux/mm.hasm/mmu_context.hasm/page-states.hasm/pgalloc.hasm/tlbflush.h
Detected Declarations
function Authorfunction crst_table_freefunction __crst_table_upgradefunction crst_table_upgradefunction page_table_freefunction pte_free_nowfunction pte_free_deferfunction base_pgt_freefunction base_crst_freefunction base_lrafunction base_page_walkfunction base_segment_walkfunction base_region3_walkfunction base_region2_walkfunction base_region1_walkfunction base_asce_allocfunction base_pgt_cache_initfunction base_asce_alloc
Annotated Snippet
if (*ste & _SEGMENT_ENTRY_INVALID) {
if (!alloc)
continue;
table = base_pgt_alloc();
if (!table)
return -ENOMEM;
*ste = __pa(table) | _SEGMENT_ENTRY;
}
table = __va(*ste & _SEGMENT_ENTRY_ORIGIN);
rc = base_page_walk(table, addr, next, alloc);
if (rc)
return rc;
if (!alloc)
base_pgt_free(table);
cond_resched();
} while (ste++, addr = next, addr < end);
return 0;
}
static int base_region3_walk(unsigned long *origin, unsigned long addr,
unsigned long end, int alloc)
{
unsigned long *rtte, next, *table;
int rc;
rtte = origin;
rtte += (addr & _REGION3_INDEX) >> _REGION3_SHIFT;
do {
next = base_region3_addr_end(addr, end);
if (*rtte & _REGION_ENTRY_INVALID) {
if (!alloc)
continue;
table = base_crst_alloc(_SEGMENT_ENTRY_EMPTY);
if (!table)
return -ENOMEM;
*rtte = __pa(table) | _REGION3_ENTRY;
}
table = __va(*rtte & _REGION_ENTRY_ORIGIN);
rc = base_segment_walk(table, addr, next, alloc);
if (rc)
return rc;
if (!alloc)
base_crst_free(table);
} while (rtte++, addr = next, addr < end);
return 0;
}
static int base_region2_walk(unsigned long *origin, unsigned long addr,
unsigned long end, int alloc)
{
unsigned long *rste, next, *table;
int rc;
rste = origin;
rste += (addr & _REGION2_INDEX) >> _REGION2_SHIFT;
do {
next = base_region2_addr_end(addr, end);
if (*rste & _REGION_ENTRY_INVALID) {
if (!alloc)
continue;
table = base_crst_alloc(_REGION3_ENTRY_EMPTY);
if (!table)
return -ENOMEM;
*rste = __pa(table) | _REGION2_ENTRY;
}
table = __va(*rste & _REGION_ENTRY_ORIGIN);
rc = base_region3_walk(table, addr, next, alloc);
if (rc)
return rc;
if (!alloc)
base_crst_free(table);
} while (rste++, addr = next, addr < end);
return 0;
}
static int base_region1_walk(unsigned long *origin, unsigned long addr,
unsigned long end, int alloc)
{
unsigned long *rfte, next, *table;
int rc;
rfte = origin;
rfte += (addr & _REGION1_INDEX) >> _REGION1_SHIFT;
do {
next = base_region1_addr_end(addr, end);
if (*rfte & _REGION_ENTRY_INVALID) {
if (!alloc)
continue;
table = base_crst_alloc(_REGION2_ENTRY_EMPTY);
if (!table)
Annotation
- Immediate include surface: `linux/sysctl.h`, `linux/slab.h`, `linux/mm.h`, `asm/mmu_context.h`, `asm/page-states.h`, `asm/pgalloc.h`, `asm/tlbflush.h`.
- Detected declarations: `function Author`, `function crst_table_free`, `function __crst_table_upgrade`, `function crst_table_upgrade`, `function page_table_free`, `function pte_free_now`, `function pte_free_defer`, `function base_pgt_free`, `function base_crst_free`, `function base_lra`.
- Atlas domain: Architecture Layer / arch/s390.
- Implementation status: source 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.