mm/vmscan.c
Source file repositories/reference/linux-study-clean/mm/vmscan.c
File Facts
- System
- Linux kernel
- Corpus path
mm/vmscan.c- Extension
.c- Size
- 228377 bytes
- Lines
- 8035
- Domain
- Core OS
- Bucket
- Memory Management
- Inferred role
- Core OS: operation-table or driver-model contract
- Status
- pattern 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.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- 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/mm.hlinux/sched/mm.hlinux/module.hlinux/gfp.hlinux/kernel_stat.hlinux/swap.hlinux/pagemap.hlinux/init.hlinux/highmem.hlinux/vmpressure.hlinux/vmstat.hlinux/file.hlinux/writeback.hlinux/blkdev.hlinux/buffer_head.hlinux/mm_inline.hlinux/backing-dev.hlinux/rmap.hlinux/topology.hlinux/cpu.hlinux/cpuset.hlinux/compaction.hlinux/notifier.hlinux/delay.hlinux/kthread.hlinux/freezer.hlinux/memcontrol.hlinux/migrate.hlinux/delayacct.hlinux/sysctl.hlinux/memory-tiers.hlinux/oom.h
Detected Declarations
struct scan_controlstruct ctrl_posenum folio_referencesenum scan_balancefunction cgroup_reclaimfunction root_reclaimfunction balance_dirty_pagesfunction sc_swappinessfunction cgroup_reclaimfunction root_reclaimfunction writeback_throttling_sanefunction sc_swappinessfunction set_task_reclaim_statefunction flush_reclaim_statefunction chargingfunction can_demotefunction can_reclaim_anon_pagesfunction zone_reclaimable_pagesfunction lruvec_lru_sizefunction for_each_managed_zone_pgdatfunction drop_slab_nodefunction drop_slabfunction for_each_online_nodefunction reclaimer_offsetfunction fsyncfunction skip_throttle_noprogressfunction reclaim_throttlefunction progressfunction __acct_reclaim_writebackfunction writeoutfunction shrink_folio_listfunction __remove_mappingfunction remove_mappingfunction folio_putback_lrufunction evictionfunction lru_gen_set_refsfunction folio_check_referencesfunction folio_check_dirty_writebackfunction demote_folio_listfunction may_enter_fsfunction shrink_folio_listfunction mapping_writeback_may_deadlock_on_reclaimfunction filemap_release_foliofunction reclaim_clean_pages_from_listfunction list_for_each_entry_safefunction update_lru_sizesfunction kernelfunction folio_isolate_lru
Annotated Snippet
static const struct file_operations lru_gen_rw_fops = {
.open = lru_gen_seq_open,
.read = seq_read,
.write = lru_gen_seq_write,
.llseek = seq_lseek,
.release = seq_release,
};
static const struct file_operations lru_gen_ro_fops = {
.open = lru_gen_seq_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
/******************************************************************************
* initialization
******************************************************************************/
void lru_gen_init_pgdat(struct pglist_data *pgdat)
{
int i, j;
spin_lock_init(&pgdat->memcg_lru.lock);
for (i = 0; i < MEMCG_NR_GENS; i++) {
for (j = 0; j < MEMCG_NR_BINS; j++)
INIT_HLIST_NULLS_HEAD(&pgdat->memcg_lru.fifo[i][j], i);
}
}
void lru_gen_init_lruvec(struct lruvec *lruvec)
{
int i;
int gen, type, zone;
struct lru_gen_folio *lrugen = &lruvec->lrugen;
struct lru_gen_mm_state *mm_state = get_mm_state(lruvec);
lrugen->max_seq = MIN_NR_GENS + 1;
lrugen->enabled = lru_gen_enabled();
for (i = 0; i <= MIN_NR_GENS + 1; i++)
lrugen->timestamps[i] = jiffies;
for_each_gen_type_zone(gen, type, zone)
INIT_LIST_HEAD(&lrugen->folios[gen][type][zone]);
if (mm_state)
mm_state->seq = MIN_NR_GENS;
}
#ifdef CONFIG_MEMCG
void lru_gen_init_memcg(struct mem_cgroup *memcg)
{
struct lru_gen_mm_list *mm_list = get_mm_list(memcg);
if (!mm_list)
return;
INIT_LIST_HEAD(&mm_list->fifo);
spin_lock_init(&mm_list->lock);
}
void lru_gen_exit_memcg(struct mem_cgroup *memcg)
{
int i;
int nid;
struct lru_gen_mm_list *mm_list = get_mm_list(memcg);
VM_WARN_ON_ONCE(mm_list && !list_empty(&mm_list->fifo));
for_each_node(nid) {
struct lruvec *lruvec = get_lruvec(memcg, nid);
struct lru_gen_mm_state *mm_state = get_mm_state(lruvec);
VM_WARN_ON_ONCE(memchr_inv(lruvec->lrugen.nr_pages, 0,
sizeof(lruvec->lrugen.nr_pages)));
lruvec->lrugen.list.next = LIST_POISON1;
if (!mm_state)
continue;
for (i = 0; i < NR_BLOOM_FILTERS; i++) {
bitmap_free(mm_state->filters[i]);
mm_state->filters[i] = NULL;
}
}
}
Annotation
- Immediate include surface: `linux/mm.h`, `linux/sched/mm.h`, `linux/module.h`, `linux/gfp.h`, `linux/kernel_stat.h`, `linux/swap.h`, `linux/pagemap.h`, `linux/init.h`.
- Detected declarations: `struct scan_control`, `struct ctrl_pos`, `enum folio_references`, `enum scan_balance`, `function cgroup_reclaim`, `function root_reclaim`, `function balance_dirty_pages`, `function sc_swappiness`, `function cgroup_reclaim`, `function root_reclaim`.
- Atlas domain: Core OS / Memory Management.
- Implementation status: pattern implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
- 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.