git: kernel - Do not call pmap_enter() in vm_fault_page*()
Matthew Dillon
dillon at crater.dragonflybsd.org
Wed Nov 16 09:40:22 PST 2011
commit 385c96e4b70a5753a404c12377398d39a3a1bf84
Author: Matthew Dillon <dillon at apollo.backplane.com>
Date: Wed Nov 16 09:12:58 2011 -0800
kernel - Do not call pmap_enter() in vm_fault_page*()
* Do not call pmap_enter() from vm_fault_page*(). This function can be
called from foreign pmap contexts and thus the current cpu's bit may
not be set in the target pmap cpumask. Any pmap_enter() operation will
thus not properly synchronize with other users of the pmap (particularly
other foreign users).
* In addition, for callers of the umtx*() function calling pmap_enter()
is inefficient as the correct page might already be faulted in. Now
because we are no longer updating the page in the pmap an older page
may still exist in the pmap (mapped read-only as it was originally COW).
This page may no longer be correct because the umtx*() functions
modify the contend of the page returned by vm_fault_page() without
necessarily mapping it. So to keep the user visibility into the memory
correct we unmap the old page when vm_fault_page() has to do a COW.
This is slightly more burdensome for fork() but far less burdomsome
for the umtx system calls and also allows procfs_memrw to work properly.
* procfs uses vm_fault_page*() to access command line arguments for
any process and umtx*() uses it to access the memory page the umtx
is operating in. Relative to procfs the user process pmap is foreign
(i.e. the current cpu's bit is not set in its pm_active) and cannot
be properly updated via a vm_fault_page*() from procfs anyway, so the
above new behavior for vm_fault_page*() is even more correct for
procfs use cases.
Summary of changes:
sys/vm/vm_fault.c | 38 ++++++++++++++++++++++++++++++++++----
1 files changed, 34 insertions(+), 4 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/385c96e4b70a5753a404c12377398d39a3a1bf84
--
DragonFly BSD source repository
More information about the Commits
mailing list