Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 01 Feb 2013 14:25:33 +0100
From:      Andre Oppermann <andre@freebsd.org>
To:        freebsd-current@freebsd.org
Cc:        alc@freebsd.org, kib@freebsd.org
Subject:   Cleanup and untangling of kernel VM initialization
Message-ID:  <510BC24D.2090406@freebsd.org>

next in thread | raw e-mail | index | archive | help
As an outcome of the recent problems with auto-sizing and auto-tuning of
the various kernel subsystems and related memory structures I've taken a
closer look at the whole KVM inner working and initialization process.

I've found the VM and KVM initialization to be somewhat obscure and stuck
half-way between the old 4.4BSD way and our modern SYSINIT concept.

While trying to understand all the steps I started to move things around,
into their own units and converted them to use SYSINITs.  The result is
a patch that cleans up the majority of initialization process, removes
bitrot and moves it into the modern world order:

  http://people.freebsd.org/~andre/kernel_init_mem-20130201.diff

The changes in particular are:

  Move large parts of vm/vm_init.c to SYSINIT()s and de-magic old-style
  kernel vm initialization.

  Move vm_ksubmap_init(), bufinit() and vm_pager_bufferinit() from machdep.c
  to SYSINIT's.  It was duplicated among all architectures which means that
  is wasn't architecture specific.

  Centralize definition of virtual_avail and virtual_end from the architectures
  pmap.h to vm_extern.h.

  Move various initializations from kern/subr_param.c to where it is actually
  used and SYSINIT() in particular vm_pager (pager_map / nswbuf), vm_kern
  (kernel_map), swap_pager (maxswzone), sys_pipe (pipe_map / maxpipekva),
  vfs_bio (buffer_map / nbuf), kern_exec (exec_map / exec_map_entries),
  kern_malloc (kmem_map), kern_timeout (callwheel, ncallout).

  Move subsystem initializations from init_main.c to SYSINIT()s.

  Add sysctl's to give detailed information on all kernel vm_maps and sub maps

  Remove unused struct kva_md_info.

  Rebase auto-sizing of limits on the available KVM/kmem_map instead of physical
  memory.  Depending on the kernel and architecture configuration these two can
  be very different.

Comments and reviews appreciated.

For committing it'll be broken into meaningful and functional pieces with an
appropriate commit message each.

I've tested on amd64.  Feedback from other architectures welcome.  Especially
for powerpc where I had to modify the minidump routine slighly to avoid dumping
of buffer_map memory.

-- 
Andre



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?510BC24D.2090406>