NetBSD/sys
chs 43973be0c5 introduce a new UVM fault type, VM_FAULT_WIREMAX. this is different
from VM_FAULT_WIRE in that when the pages being wired are faulted in,
the simulated fault is at the maximum protection allowed for the mapping
instead of the current protection.  use this in uvm_map_pageable{,_all}()
to fix the problem where writing via ptrace() to shared libraries that
are also mapped with wired mappings in another process causes a
diagnostic panic when the wired mapping is removed.

this is a really obscure problem so it deserves some more explanation.
ptrace() writing to another process ends up down in uvm_map_extract(),
which for MAP_PRIVATE mappings (such as shared libraries) will cause
the amap to be copied or created.  then the amap is made shared
(ie. the AMAP_SHARED flag is set) between the kernel and the ptrace()d
process so that the kernel can modify pages in the amap and have the
ptrace()d process see the changes.  then when the page being modified
is actually faulted on, the object pages (from the shared library vnode)
is copied to a new anon page and inserted into the shared amap.
to make all the processes sharing the amap actually see the new anon
page instead of the vnode page that was there before, we need to
invalidate all the pmap-level mappings of the vnode page in the pmaps
of the processes sharing the amap, but we don't have a good way of
doing this.  the amap doesn't keep track of the vm_maps which map it.
so all we can do at this point is to remove all the mappings of the
page with pmap_page_protect(), but this has the unfortunate side-effect
of removing wired mappings as well.  removing wired mappings with
pmap_page_protect() is a legitimate operation, it can happen when a file
with a wired mapping is truncated.  so the pmap has no way of knowing
whether a request to remove a wired mapping is normal or when it's due to
this weird situation.  so the pmap has to remove the weird mapping.
the process being ptrace()d goes away and life continues.  then,
much later when we go to unwire or remove the wired vm_map mapping,
we discover that the pmap mapping has been removed when it should
still be there, and we panic.

so where did we go wrong?  the problem is that we don't have any way
to update just the pmap mappings that need to be updated in this
scenario.  we could invent a mechanism to do this, but that is much
more complicated than this change and it doesn't seem like the right
way to go in the long run either.

the real underlying problem here is that wired pmap mappings just
aren't a good concept.  one of the original properties of the pmap
design was supposed to be that all the information in the pmap could
be thrown away at any time and the VM system could regenerate it all
through fault processing, but wired pmap mappings don't allow that.
a better design for UVM would not require wired pmap mappings,
and Chuck C. and I are talking about this, but it won't be done
anytime soon, so this change will do for now.

this change has the effect of causing MAP_PRIVATE mappings to be
copied to anonymous memory when they are mlock()d, so that uvm_fault()
doesn't need to copy these pages later when called from ptrace(), thus
avoiding the call to pmap_page_protect() and the panic that results
from this when the mlock()d region is unlocked or freed.  note that
this change doesn't help the case where the wired mapping is MAP_SHARED.

discussed at great length with Chuck Cranor.
fixes PRs 10363, 12554, 12604, 13041, 13487, 14580 and 14853.
2001-12-31 22:34:39 +00:00
..
adosfs
altq
arch save and restore sprg[0-3] when calling openfirmware 2001-12-31 18:35:26 +00:00
coda add a VOP_PUTPAGES method for all the filesystems that don't have pages, 2001-12-06 04:27:40 +00:00
compat Added symlink, rename and readlink 2001-12-27 11:07:23 +00:00
conf Add -ffreestanding to kernel builds. It's not always safe to 2001-12-23 22:45:07 +00:00
crypto When compiling for userland, need <stdlib.h> for abort() prototype 2001-12-31 20:20:28 +00:00
ddb Convenience variables (workXX) don't work, so don't document them. 2001-12-31 00:35:21 +00:00
dev Labels must be followed by statements. 2001-12-31 22:07:58 +00:00
filecorefs
gdbscripts
ipkdb
isofs
kern In clalloc(), clear the quoted char bitmap (part of the ring buffer was 2001-12-27 02:27:50 +00:00
lib Always provide alloca() as __builtin_alloca(). 2001-12-28 07:37:06 +00:00
lkm Fix a typo. 2001-12-14 20:51:01 +00:00
miscfs in genfs_gop_write(), actually set the B_ASYNC flag on buffers that we're 2001-12-31 06:44:58 +00:00
msdosfs Add some minimal validation of the fsinfo. 2001-12-22 19:45:54 +00:00
net Fix a "pointers are not permitted as case values" gcc 3.1 warning. 2001-12-31 21:55:46 +00:00
netatalk
netccitt Replace some misuses of "then" with "than". 2001-12-04 17:56:30 +00:00
netinet use radix table for inbound tunnel lookup (would increase performance 2001-12-21 06:30:43 +00:00
netinet6 make it compile even if NGIF=0 2001-12-22 01:40:03 +00:00
netisdn
netiso MKfoo=no -> NOfoo 2001-12-12 01:48:43 +00:00
netkey
netnatm
netns
netsmb
nfs fix locking in nfs_getpages(). 2001-12-31 07:16:47 +00:00
ntfs use the new compatibility routines to allow mmap() to work 2001-12-18 07:51:16 +00:00
stand Fix two typos reported by Chris Lloyd in kern/15028. 2001-12-22 00:35:45 +00:00
sys From the comment added to the file: 2001-12-20 20:07:24 +00:00
ufs Do not compare an integer to NULL. 2001-12-31 21:37:22 +00:00
uvm introduce a new UVM fault type, VM_FAULT_WIREMAX. this is different 2001-12-31 22:34:39 +00:00
Makefile add 'lkm' to SUBDIR - it got mistakely got removed in last revision 2001-12-02 00:47:21 +00:00