linux/mm/init-mm.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <linux/mm_types.h>
   3#include <linux/rbtree.h>
   4#include <linux/rwsem.h>
   5#include <linux/spinlock.h>
   6#include <linux/list.h>
   7#include <linux/cpumask.h>
   8#include <linux/mman.h>
   9#include <linux/pgtable.h>
  10
  11#include <linux/atomic.h>
  12#include <linux/user_namespace.h>
  13#include <asm/mmu.h>
  14
  15#ifndef INIT_MM_CONTEXT
  16#define INIT_MM_CONTEXT(name)
  17#endif
  18
  19/*
  20 * For dynamically allocated mm_structs, there is a dynamically sized cpumask
  21 * at the end of the structure, the size of which depends on the maximum CPU
  22 * number the system can see. That way we allocate only as much memory for
  23 * mm_cpumask() as needed for the hundreds, or thousands of processes that
  24 * a system typically runs.
  25 *
  26 * Since there is only one init_mm in the entire system, keep it simple
  27 * and size this cpu_bitmask to NR_CPUS.
  28 */
  29struct mm_struct init_mm = {
  30        .mm_rb          = RB_ROOT,
  31        .pgd            = swapper_pg_dir,
  32        .mm_users       = ATOMIC_INIT(2),
  33        .mm_count       = ATOMIC_INIT(1),
  34        .write_protect_seq = SEQCNT_ZERO(init_mm.write_protect_seq),
  35        MMAP_LOCK_INITIALIZER(init_mm)
  36        .page_table_lock =  __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
  37        .arg_lock       =  __SPIN_LOCK_UNLOCKED(init_mm.arg_lock),
  38        .mmlist         = LIST_HEAD_INIT(init_mm.mmlist),
  39        .user_ns        = &init_user_ns,
  40        .cpu_bitmap     = CPU_BITS_NONE,
  41        INIT_MM_CONTEXT(init_mm)
  42};
  43
  44void setup_initial_init_mm(void *start_code, void *end_code,
  45                           void *end_data, void *brk)
  46{
  47        init_mm.start_code = (unsigned long)start_code;
  48        init_mm.end_code = (unsigned long)end_code;
  49        init_mm.end_data = (unsigned long)end_data;
  50        init_mm.brk = (unsigned long)brk;
  51}
  52