1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-25 11:37:56 +00:00
Mirror of the FreeBSD src repository https://git.FreeBSD.org/src.git .
Go to file
Konstantin Belousov 56e61f57b0 Eliminate pvh_global_lock from the amd64 pmap.
The only current purpose of the pvh lock was explained there
On Wed, Jan 09, 2013 at 11:46:13PM -0600, Alan Cox wrote:
> Let me lay out one example for you in detail.  Suppose that we have
> three processors and two of these processors are actively using the same
> pmap.  Now, one of the two processors sharing the pmap performs a
> pmap_remove().  Suppose that one of the removed mappings is to a
> physical page P.  Moreover, suppose that the other processor sharing
> that pmap has this mapping cached with write access in its TLB.  Here's
> where the trouble might begin.  As you might expect, the processor
> performing the pmap_remove() will acquire the fine-grained lock on the
> PV list for page P before destroying the mapping to page P.  Moreover,
> this processor will ensure that the vm_page's dirty field is updated
> before releasing that PV list lock.  However, the TLB shootdown for this
> mapping may not be initiated until after the PV list lock is released.
> The processor performing the pmap_remove() is not problematic, because
> the code being executed by that processor won't presume that the mapping
> is destroyed until the TLB shootdown has completed and pmap_remove() has
> returned.  However, the other processor sharing the pmap could be
> problematic.  Specifically, suppose that the third processor is
> executing the page daemon and concurrently trying to reclaim page P.
> This processor performs a pmap_remove_all() on page P in preparation for
> reclaiming the page.  At this instant, the PV list for page P may
> already be empty but our second processor still has a stale TLB entry
> mapping page P.  So, changes might still occur to the page after the
> page daemon believes that all mappings have been destroyed.  (If the PV
> entry had still existed, then the pmap lock would have ensured that the
> TLB shootdown completed before the pmap_remove_all() finished.)  Note,
> however, the page daemon will know that the page is dirty.  It can't
> possibly mistake a dirty page for a clean one.  However, without the
> current pvh global locking, I don't think anything is stopping the page
> daemon from starting the laundering process before the TLB shootdown has
> completed.
>
> I believe that a similar example could be constructed with a clean page
> P' and a stale read-only TLB entry.  In this case, the page P' could be
> "cached" in the cache/free queues and recycled before the stale TLB
> entry is flushed.

TLBs for addresses with updated PTEs are always flushed before pmap
lock is unlocked.  On the other hand, amd64 pmap code does not always
flushes TLBs before PV list locks are unlocked, if previously PTEs
were cleared and PV entries removed.

To handle the situations where a thread might notice empty PV list but
third thread still having access to the page due to TLB invalidation
not finished yet, introduce delayed invalidation.  Comparing with the
pvh_global_lock, DI does not block entered thread when
pmap_remove_all() or pmap_remove_write() (callers of
pmap_delayed_invl_wait()) are executed in parallel.  But _invl_wait()
callers are blocked until all previously noted DI blocks are leaved,
thus ensuring that neccessary TLB invalidations were performed before
returning from pmap_remove_all() or pmap_remove_write().

See comments for detailed description of the mechanism, and also for
the explanations why several pmap methods, most important
pmap_enter(), do not need DI protection.

Reviewed by:	alc, jhb (turnstile KPI usage)
Tested by:	pho (previous version)
Sponsored by:	The FreeBSD Foundation
Differential revision:	https://reviews.freebsd.org/D5747
2016-05-14 23:35:11 +00:00
bin Rename getline with get_line to avoid collision with getline(3) 2016-05-10 11:11:23 +00:00
cddl Fix DTrace test ATF wrapper generation. 2016-05-10 20:25:49 +00:00
contrib MFV r299716: file 5.27 2016-05-14 08:52:37 +00:00
crypto libkrb5: Fix potential double-free 2016-05-11 23:25:59 +00:00
etc iconvctl(3): remove superfluous NULL pointer tests 2016-05-14 00:35:35 +00:00
gnu Merge ^/user/ngie/release-pkg-fix-tests to unbreak how test files are installed 2016-05-04 23:20:53 +00:00
include stdio.h: Fix function-type typedef style and use _types.h __ssize_t 2016-05-12 22:13:12 +00:00
kerberos5 Remove the old depend (mkdep) code and make FAST_DEPEND the one true way. 2016-03-30 23:50:23 +00:00
lib Add thr*.2 and _umtx_op.2 manpages to the build. 2016-05-14 09:43:28 +00:00
libexec Declare line[] in the outermost scope of retrieve() instead of 2016-05-13 01:52:41 +00:00
release Document r296633, OpenSSH updated to 7.2p2. 2016-05-12 19:32:40 +00:00
rescue Split /rescue into its own package. 2016-02-08 14:27:45 +00:00
sbin Avoid NULL de-references. 2016-05-14 23:32:03 +00:00
secure Regen x86 assembly files for r299480. 2016-05-11 20:11:21 +00:00
share Add myself to the list of src committers. I've never been added it 2016-05-12 20:04:09 +00:00
sys Eliminate pvh_global_lock from the amd64 pmap. 2016-05-14 23:35:11 +00:00
targets Simplify building libpam and fix libpam.a not containing the modules since r284345. 2016-04-14 01:17:03 +00:00
tests Vendor import of file 4.27. 2016-05-14 05:25:47 +00:00
tools Only install etc/rc.d/{rfcomm_pppd_server,sdpd} if MK_BLUETOOTH != no 2016-05-06 09:18:09 +00:00
usr.bin Always return either a dynamically allocated string or NULL from 2016-05-13 06:15:05 +00:00
usr.sbin Convert tok from enum tok to int32_t in function calls 2016-05-14 23:29:41 +00:00
.arcconfig Remove project.name which is a product of a bygone era. 2016-04-21 04:33:07 +00:00
.arclint phabricator related changes: 2015-04-20 20:33:22 +00:00
COPYRIGHT Bump copyright year. 2015-12-31 11:21:45 +00:00
LOCKS
MAINTAINERS Add myself to MAINTAINERS. 2016-03-14 16:27:43 +00:00
Makefile Follow-up r298220: Don't pass down META_MODE which will still enable it. 2016-04-18 18:39:43 +00:00
Makefile.inc1 Support libsoft for restage. 2016-05-13 17:44:20 +00:00
Makefile.libcompat Set CPP from XCPP for the libcompat build. 2016-04-15 18:32:05 +00:00
ObsoleteFiles.inc Misc. build: minor spelling fixes. 2016-05-03 22:01:48 +00:00
README README: changes and fixups 2015-04-19 07:16:44 +00:00
UPDATING Change the default installation directory for modules to /boot/modules. 2016-05-10 22:32:23 +00:00

This is the top level of the FreeBSD source directory.  This file
was last revised on:
$FreeBSD$

For copyright information, please see the file COPYRIGHT in this
directory (additional copyright information also exists for some
sources in this tree - please see the specific source directories for
more information).

The Makefile in this directory supports a number of targets for
building components (or all) of the FreeBSD source tree.  See build(7)
and http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html
for more information, including setting make(1) variables.

The `buildkernel` and `installkernel` targets build and install
the kernel and the modules (see below).  Please see the top of
the Makefile in this directory for more information on the
standard build targets and compile-time flags.

Building a kernel is a somewhat more involved process.  See build(7), config(8),
and http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html
for more information.

Note: If you want to build and install the kernel with the
`buildkernel` and `installkernel` targets, you might need to build
world before.  More information is available in the handbook.

The kernel configuration files reside in the sys/<arch>/conf
sub-directory.  GENERIC is the default configuration used in release builds.
NOTES contains entries and documentation for all possible
devices, not just those commonly used.


Source Roadmap:
---------------

bin		System/user commands.

cddl		Various commands and libraries under the Common Development
		and Distribution License.

contrib		Packages contributed by 3rd parties.

crypto		Cryptography stuff (see crypto/README).

etc		Template files for /etc.

games		Amusements.

gnu		Various commands and libraries under the GNU Public License.
		Please see gnu/COPYING* for more information.

include		System include files.

kerberos5	Kerberos5 (Heimdal) package.

lib		System libraries.

libexec		System daemons.

release		Release building Makefile & associated tools.

rescue		Build system for statically linked /rescue utilities.

sbin		System commands.

secure		Cryptographic libraries and commands.

share		Shared resources.

sys		Kernel sources.

tests		Regression tests which can be run by Kyua.  See tests/README
		for additional information.

tools		Utilities for regression testing and miscellaneous tasks.

usr.bin		User commands.

usr.sbin	System administration commands.


For information on synchronizing your source tree with one or more of
the FreeBSD Project's development branches, please see:

  http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/synching.html