Home | History | Annotate | Download | only in uvm
History log of /src/sys/uvm/uvm_fault_i.h
RevisionDateAuthorComments
 1.33  23-Feb-2020  ad UVM locking changes, proposed on tech-kern:

- Change the lock on uvm_object, vm_amap and vm_anon to be a RW lock.
- Break v_interlock and vmobjlock apart. v_interlock remains a mutex.
- Do partial PV list locking in the x86 pmap. Others to follow later.
 1.32  16-Dec-2019  ad branches: 1.32.2;
- Extend the per-CPU counters matt@ did to include all of the hot counters
in UVM, excluding uvmexp.free, which needs special treatment and will be
done with a separate commit. Cuts system time for a build by 20-25% on
a 48 CPU machine w/DIAGNOSTIC.

- Avoid 64-bit integer divide on every fault (for rnd_add_uint32).
 1.31  08-May-2018  christos branches: 1.31.2;
don't store the rssmax in the lwp rusage, it is a per proc property. Instead
utilize an unused field in the vmspace struct to store it. Also conditionalize
on platforms that have pmap statistics available.
 1.30  07-May-2018  christos update maxrss (used to always be 0). Patterned after the OpenBSD changes.
 1.29  19-Apr-2018  christos s/static inline/static __inline/g for consistency.
 1.28  19-Feb-2012  rmind branches: 1.28.38;
Remove VM_MAP_INTRSAFE and related code. Not used since the "kmem changes".
 1.27  12-Jun-2011  rmind branches: 1.27.2; 1.27.6;
Welcome to 5.99.53! Merge rmind-uvmplock branch:

- Reorganize locking in UVM and provide extra serialisation for pmap(9).
New lock order: [vmpage-owner-lock] -> pmap-lock.

- Simplify locking in some pmap(9) modules by removing P->V locking.

- Use lock object on vmobjlock (and thus vnode_t::v_interlock) to share
the locks amongst UVM objects where necessary (tmpfs, layerfs, unionfs).

- Rewrite and optimise x86 TLB shootdown code, make it simpler and cleaner.
Add TLBSTATS option for x86 to collect statistics about TLB shootdowns.

- Unify /dev/mem et al in MI code and provide required locking (removes
kernel-lock on some ports). Also, avoid cache-aliasing issues.

Thanks to Andrew Doran and Joerg Sonnenberger, as their initial patches
formed the core changes of this branch.
 1.26  02-Feb-2011  chuck branches: 1.26.2;
udpate license clauses on my code to match the new-style BSD licenses.
based on diff that rmind@ sent me.

no functional change with this commit.
 1.25  06-Feb-2010  uebayasi branches: 1.25.4; 1.25.6; 1.25.8;
__inline -> inline
 1.24  02-Jan-2008  ad branches: 1.24.10;
Merge vmlocking2 to head.
 1.23  22-Feb-2007  thorpej branches: 1.23.4; 1.23.18; 1.23.24; 1.23.26; 1.23.30;
TRUE -> true, FALSE -> false
 1.22  21-Feb-2007  thorpej Replace the Mach-derived boolean_t type with the C99 bool type. A
future commit will replace use of TRUE and FALSE with true and false.
 1.21  16-Feb-2006  perry branches: 1.21.20;
Change "inline" back to "__inline" in .h files -- C99 is still too
new, and some apps compile things in C89 mode. C89 keywords stay.

As per core@.
 1.20  24-Dec-2005  perry branches: 1.20.2; 1.20.4; 1.20.6;
Remove leading __ from __(const|inline|signed|volatile) -- it is obsolete.
 1.19  11-Dec-2005  christos merge ktrace-lwp.
 1.18  27-Jun-2005  thorpej branches: 1.18.2;
Use ANSI function decls.
 1.17  24-Mar-2004  junyoung Nuke __P().
 1.16  02-Nov-2002  perry branches: 1.16.6;
/*CONSTCOND*/
 1.15  15-Sep-2001  chs a whole bunch of changes to improve performance and robustness under load:

- remove special treatment of pager_map mappings in pmaps. this is
required now, since I've removed the globals that expose the address range.
pager_map now uses pmap_kenter_pa() instead of pmap_enter(), so there's
no longer any need to special-case it.
- eliminate struct uvm_vnode by moving its fields into struct vnode.
- rewrite the pageout path. the pager is now responsible for handling the
high-level requests instead of only getting control after a bunch of work
has already been done on its behalf. this will allow us to UBCify LFS,
which needs tighter control over its pages than other filesystems do.
writing a page to disk no longer requires making it read-only, which
allows us to write wired pages without causing all kinds of havoc.
- use a new PG_PAGEOUT flag to indicate that a page should be freed
on behalf of the pagedaemon when it's unlocked. this flag is very similar
to PG_RELEASED, but unlike PG_RELEASED, PG_PAGEOUT can be cleared if the
pageout fails due to eg. an indirect-block buffer being locked.
this allows us to remove the "version" field from struct vm_page,
and together with shrinking "loan_count" from 32 bits to 16,
struct vm_page is now 4 bytes smaller.
- no longer use PG_RELEASED for swap-backed pages. if the page is busy
because it's being paged out, we can't release the swap slot to be
reallocated until that write is complete, but unlike with vnodes we
don't keep a count of in-progress writes so there's no good way to
know when the write is done. instead, when we need to free a busy
swap-backed page, just sleep until we can get it busy ourselves.
- implement a fast-path for extending writes which allows us to avoid
zeroing new pages. this substantially reduces cpu usage.
- encapsulate the data used by the genfs code in a struct genfs_node,
which must be the first element of the filesystem-specific vnode data
for filesystems which use genfs_{get,put}pages().
- eliminate many of the UVM pagerops, since they aren't needed anymore
now that the pager "put" operation is a higher-level operation.
- enhance the genfs code to allow NFS to use the genfs_{get,put}pages
instead of a modified copy.
- clean up struct vnode by removing all the fields that used to be used by
the vfs_cluster.c code (which we don't use anymore with UBC).
- remove kmem_object and mb_object since they were useless.
instead of allocating pages to these objects, we now just allocate
pages with no object. such pages are mapped in the kernel until they
are freed, so we can use the mapping to find the page to free it.
this allows us to remove splvm() protection in several places.

The sum of all these changes improves write throughput on my
decstation 5000/200 to within 1% of the rate of NetBSD 1.5
and reduces the elapsed time for "make release" of a NetBSD 1.5
source tree on my 128MB pc to 10% less than a 1.5 kernel took.
 1.14  26-Jun-2001  thorpej branches: 1.14.2; 1.14.4;
Reduce some complexity in the fault path -- Rather than maintaining
an spl-protected "interrupt safe map" list, simply require that callers
of uvm_fault() never call us in interrupt context (MD code must make
the assertion), and check for interrupt-safe maps in uvmfault_lookup()
before we lock the map.
 1.13  02-Jun-2001  chs replace vm_map{,_entry}_t with struct vm_map{,_entry} *.
 1.12  25-May-2001  chs remove trailing whitespace.
 1.11  26-Jun-2000  mrg branches: 1.11.2;
remove/move more mach vm header files:

<vm/pglist.h> -> <uvm/uvm_pglist.h>
<vm/vm_inherit.h> -> <uvm/uvm_inherit.h>
<vm/vm_kern.h> -> into <uvm/uvm_extern.h>
<vm/vm_object.h> -> nothing
<vm/vm_pager.h> -> into <uvm/uvm_pager.h>

also includes a bunch of <vm/vm_page.h> include removals (due to redudancy
with <vm/vm.h>), and a scattering of other similar headers.
 1.10  11-Jan-2000  chs add support for ``swapctl -d'' (removing swap space).
improve handling of i/o errors in swap space.

reviewed by: Chuck Cranor
 1.9  04-Jun-1999  thorpej branches: 1.9.2;
Keep interrupt-safe maps on an additional queue. In uvm_fault(), if we're
looking up a kernel address, check to see if the address is on this
"interrupt-safe" list. If so, return failure immediately. This prevents
a locking screw if a page fault is taken on an interrupt-safe map in or
out of interrupt context.
 1.8  25-Mar-1999  mrg branches: 1.8.4;
remove now >1 year old pre-release message.
 1.7  24-Jan-1999  chuck cleanup/reorg:
- break anon related functions out of uvm_amap.c and put them in their own
file (uvm_anon.c). includes break up uvm_anon_init into an amap and an
an anon init function
- ensure that only functions within the amap module access amap structure
fields (add macros to amap api as needed)
 1.6  11-Oct-1998  chuck remove unused share map code from UVM:
- simplify uvm_faultinfo in uvm_fault.h (parent map tracking no longer needed)
- adjust locking and lookup functions in uvm_fault_i.h to reflect the above
- replace ufi.rvaddr with ufi.orig_rvaddr in uvm_fault.c since rvaddr is
no longer needed.
- no need to worry about share map translations in uvm_fault(). simplify.
 1.5  09-Mar-1998  mrg KNF.
 1.4  10-Feb-1998  perry add/cleanup multiple inclusion protection.
 1.3  07-Feb-1998  mrg restore rcsids
 1.2  06-Feb-1998  thorpej RCS ID police.
 1.1  05-Feb-1998  mrg branches: 1.1.1;
Initial revision
 1.1.1.1  05-Feb-1998  mrg initial import of the new virtual memory system, UVM, into -current.

UVM was written by chuck cranor <chuck@maria.wustl.edu>, with some
minor portions derived from the old Mach code. i provided some help
getting swap and paging working, and other bug fixes/ideas. chuck
silvers <chuq@chuq.com> also provided some other fixes.

this is the UVM kernel code portion.


this will be KNF'd shortly. :-)
 1.8.4.1  21-Jun-1999  thorpej Sync w/ -current.
 1.9.2.1  20-Nov-2000  bouyer Update thorpej_scsipi to -current as of a month ago
 1.11.2.4  11-Nov-2002  nathanw Catch up to -current
 1.11.2.3  21-Sep-2001  nathanw Catch up to -current.
 1.11.2.2  24-Aug-2001  nathanw Catch up with -current.
 1.11.2.1  21-Jun-2001  nathanw Catch up to -current.
 1.14.4.1  01-Oct-2001  fvdl Catch up with -current.
 1.14.2.1  10-Jan-2002  thorpej Sync kqueue branch with -current.
 1.16.6.4  10-Nov-2005  skrll Sync with HEAD. Here we go again...
 1.16.6.3  21-Sep-2004  skrll Fix the sync with head I botched.
 1.16.6.2  18-Sep-2004  skrll Sync with HEAD.
 1.16.6.1  03-Aug-2004  skrll Sync with HEAD
 1.18.2.2  21-Jan-2008  yamt sync with head
 1.18.2.1  26-Feb-2007  yamt sync with head.
 1.20.6.1  22-Apr-2006  simonb Sync with head.
 1.20.4.1  09-Sep-2006  rpaulo sync with head
 1.20.2.1  18-Feb-2006  yamt sync with head.
 1.21.20.1  27-Feb-2007  yamt - sync with head.
- move sched_changepri back to kern_synch.c as it doesn't know PPQ anymore.
 1.23.30.1  02-Jan-2008  bouyer Sync with HEAD
 1.23.26.1  04-Dec-2007  ad Pull the vmlocking changes into a new branch.
 1.23.24.1  18-Feb-2008  mjf Sync with HEAD.
 1.23.18.1  09-Jan-2008  matt sync with HEAD
 1.23.4.1  13-Mar-2007  ad Pull in the initial set of changes for the vmlocking branch.
 1.24.10.1  11-Mar-2010  yamt sync with head
 1.25.8.1  08-Feb-2011  bouyer Sync with HEAD
 1.25.6.1  06-Jun-2011  jruoho Sync with HEAD.
 1.25.4.3  05-Mar-2011  rmind sync with head
 1.25.4.2  17-Mar-2010  rmind Reorganise UVM locking to protect P->V state and serialise pmap(9)
operations on the same page(s) by always locking their owner. Hence
lock order: "vmpage"-lock -> pmap-lock.

Patch, proposed on tech-kern@, from Andrew Doran.
 1.25.4.1  16-Mar-2010  rmind Change struct uvm_object::vmobjlock to be dynamically allocated with
mutex_obj_alloc(). It allows us to share the locks among UVM objects.
 1.26.2.1  23-Jun-2011  cherry Catchup with rmind-uvmplock merge.
 1.27.6.1  24-Feb-2012  mrg sync to -current.
 1.27.2.1  17-Apr-2012  yamt sync with head
 1.28.38.2  21-May-2018  pgoyette Sync with HEAD
 1.28.38.1  22-Apr-2018  pgoyette Sync with HEAD
 1.31.2.1  08-Apr-2020  martin Merge changes from current as of 20200406
 1.32.2.1  29-Feb-2020  ad Sync with head.

RSS XML Feed