haiku/headers
Ingo Weinhold eb8dc1ebfb * Removed DEBUG_PAGE_CACHE_TRANSITIONS debugging.
* Added VMCache::MovePage() and MoveAllPages() to move pages between caches.
* VMAnonymousCache:
  - _MergeSwapPages(): Avoid doing anything, if neither cache has swapped out
    pages.
  - _MergeSwapPages() does now also remove source cache pages that are
    shadowed by consumer swap pages. This allows us to call _MergeSwapPages()
    before _MergePagesSmallerSource(), save the swap page shadowing check
    there and get rid of the vm_page::merge_swap flag. This is an
    optimization based on the assumption that usually none or only few pages
    are swapped out, so we save a lot of checks.
  - Implemented _MergePagesSmallerConsumer() as an alternative to
    _MergePagesSmallerSource(). The former is used when the source cache has
    more pages than the consumer cache. It iterates over the consumer cache's
    pages, moves them to the source and finally moves all pages back to the
    consumer. The final move is relatively cheap (though unfortunately we
    still have to update all pages' vm_page::cache field), so that overall we
    save iterations of the main loop with the more expensive checks.

The optimizations particularly improve the common fork()+exec*() situations.
fork() uses CoW, which is implemented by putting two new empty caches between
the to be copied area and its cache. exec*() destroys one copy of the area,
its cache and thus causes merging of the other new cache with the old cache.
Since this usually happens in a very short time, the old cache does still
contain many pages and the new cache only few. Previously the many pages were
all checked and moved individually. Now we do that for the few pages instead.

A very extreme example of this situation is the Haiku image build. jam has a
huge heap (> 200 MB) and it fork()s+exec*()s for every action to be executed.
Since during the cache merging the cache is locked, any write access to a
heap page causes jam to block until the cache merging is done. Formerly that
took so long that it killed a lot of parallelism in multi-job builds. That
could be observed particularly well when lots of small actions where executed
(like the Link, XRes, Mimeset, SetType, SetVersion combos when building
executables/libraries/add-ons). Those look dramatically better now.
The overall speed improvement for a -j8 image build on my machine is only
about 15%, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34784 a95241bf-73f2-0310-859d-f6bbb57e9c96
2009-12-27 16:14:13 +00:00
..
build Also allow gcc 3 as the host compiler. 2009-12-20 13:07:43 +00:00
compatibility - Coding style fixes. Thanks Axel for the heads up. 2009-11-17 16:13:00 +00:00
config Fixed __HAIKU_PRI_PREFIX_ADDR definition. 2009-12-06 15:46:03 +00:00
cpp * Introduced new header directory "config", which ATM contains HaikuConfig.h 2009-11-24 19:44:07 +00:00
glibc * merged 32bit-wchar_t branches of buildtools and haiku back into 2009-07-07 10:30:09 +00:00
libs * Simplified and optimized a lot the "ToString()" debugging facilities. 2009-12-06 13:14:45 +00:00
os * Rewrote header. 2009-12-18 15:05:37 +00:00
posix Whitespace cleanup, no functional change. 2009-12-22 16:53:28 +00:00
private * Removed DEBUG_PAGE_CACHE_TRANSITIONS debugging. 2009-12-27 16:14:13 +00:00
tools * Moved everything into the SymbolPatcher namespace. 2009-11-05 17:16:17 +00:00