History log of /haiku/src/system/kernel/vm/vm_page.cpp
Revision Date Author Comments
# 20800605 29-Oct-2023 Jérôme Duval <jerome.duval@gmail.com>

kernel/vm: put pages in order on the clear page queue

possibly help with #15789:
I was testing virtual_block devices with dd, and noticed it didn't work with higher block sizes.
Indeed the driver was passing a list of single pages, very inefficient. To be remarked is that
the physical pages were reversed in memory, causing get_memory_map to provide a map of single pages.
What happens: dd fills up the buffer from 0 until the block size, causing soft faults for still unmapped
pages. Each fault maps a cleared physical page out of the clear page queue. This means that some page runs
are actually put reversed in the clear page queue, which this commit fixes.

Change-Id: I36395849c7f13086b44a1b284cc0c858d8c29f75
Reviewed-on: https://review.haiku-os.org/c/haiku/+/7081
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
Reviewed-by: Axel Dörfler <axeld@pinc-software.de>


# 3517616b 25-Jul-2021 X512 <danger_mail@list.ru>

kernel/vm_page: add vm_page table dump debugger command

Change-Id: I493228736f90f5e248f1d4fa3e354beb186546cb
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4308
Reviewed-by: Alex von Gluck IV <kallisti5@unixzen.com>


# ab57ee42 04-Dec-2020 X512 <danger_mail@list.ru>

fix build after MethodDeleter interface change

Change-Id: Iadb9e37772fd6588636085944c1455249ac0f926
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3457
Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>


# be1cc9c8 20-Jun-2020 Augustin Cavalier <waddlesplash@gmail.com>

kernel/vm: Make the page_scrubber wait on a condition.

On an idle system with 1GB RAM and the 100ms timeout, it takes multiple
minutes for all the pages in the system to get cleared after boot, but once
they do, the page scrubber will then remain idle for seconds to even
minutes at a time, so this is clearly worth it.

The "free pages condition" was unused before this commit, so I have
repurposed it (and unpublished it.)

Change-Id: I7034677a1e51c97c2baf11b772db3a31c0e1adfa
Reviewed-on: https://review.haiku-os.org/c/haiku/+/1699
Reviewed-by: waddlesplash <waddlesplash@gmail.com>


# 31cee26c 13-Jun-2020 Michael Lotz <mmlr@mlotz.ch>

kernel: Whitespace cleanup only.


# e081b9cd 17-Jul-2019 Murai Takashi <tmurai01@gmail.com>

PVS V611: Use delete [] for memory allocated by new [].

Change-Id: I712350ae7f742aaa8e0ea58186265fac4bbac73e
Reviewed-on: https://review.haiku-os.org/c/1627
Reviewed-by: waddlesplash <waddlesplash@gmail.com>


# 9da590f7 28-Oct-2014 Ingo Weinhold <ingo_weinhold@gmx.de>

Add vm_page_free_etc()

It additionally gets a vm_page_reservation* argument. If not NULL, the
page count of the reservation is incremented for the freed page.


# 42a91653 07-Sep-2014 Michael Lotz <mmlr@mlotz.ch>

kernel: Fix missing else in dump_page_queue debugger command.

The entered page queue address would always be overwritten. Pointed
out by CID 610504.


# 73363f8d 19-Dec-2013 Pawel Dziepak <pdziepak@quarnos.org>

kernel/vm: Fix unsigned/signed comparison warning


# d02aaee1 15-Dec-2013 Pawel Dziepak <pdziepak@quarnos.org>

kernel, libroot: Add more memory info in system_info

system_info now contains all information previously available only
through __get_system_info_etc(B_MEMORY_INFO, ...).


# dac7b7c9 06-Dec-2013 Ingo Weinhold <ingo_weinhold@gmx.de>

Fix various 64 bit related warnings

Mostly printf() format strings and signed-unsigned comparisons.
Fixes the x86_64 build.


# e94bffa0 11-Nov-2013 Jérôme Duval <jerome.duval@gmail.com>

vm: allocate wrappers on the heap with small stack array fallback

see comments on #10169. Thanks Ingo for reviewing!


# 73ad2473 05-Nov-2013 Pawel Dziepak <pdziepak@quarnos.org>

Remove remaining unnecessary 'volatile' qualifiers


# c8dd9f77 29-Oct-2013 Pawel Dziepak <pdziepak@quarnos.org>

kernel: Add thread_unblock() and use it where possible


# 29e65827 09-Oct-2013 Pawel Dziepak <pdziepak@quarnos.org>

kernel: Remove possibility to yield to all threads

Kernel support for yielding to all (including lower priority) threads
has been removed. POSIX sched_yield() remains unchanged.

If a thread really needs to yield to everyone it can reduce its priority
to the lowest possible and then yield (it will then need to manually
return to its prvious priority upon continuing).


# 34d0d4d8 17-Sep-2013 Ingo Weinhold <ingo_weinhold@gmx.de>

dump_page_queue(): fix output

* Determine the cache type per page instead of printing the first page's
cache type for all pages.
* Use vm_cache_type_to_string().


# 7bea0205 11-Jul-2013 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_allocate_page_run(): fix debug output


# 5ad12a80 08-Nov-2012 Jerome Duval <jerome.duval@gmail.com>

vm_page_allocate_page_run: use a mask to enforce the boundary

* use a mask to enforce the boundary as suggested by Ingo. Thanks!


# 8ddec5b5 06-Nov-2012 Jerome Duval <jerome.duval@gmail.com>

vm_page_allocate_page_run: fix previous commit

* remove superfluous codes
* when aligning, sPhysicalPageOffset would be substracted twice
+alpha4

Signed-off-by: Ingo Weinhold <ingo_weinhold at gmx dot de>


# f5a14b17 05-Nov-2012 Jérôme Duval <jerome.duval@gmail.com>

vm_page_allocate_page_run: fix for aligned page allocations

* don't enforce a zero boundary or a zero alignment
* when going to the next range, takes alignment into account.
It could previously just be enforced again through alignment and loop infinite.
* it should help with some FreeBSD based drivers


# 11d35d1b 05-Jul-2012 Alex Smith <alex@alex-smith.me.uk>

Fixed tracing printf formats in VM code.


# 91102c54 11-Feb-2012 Fredrik Holmqvist <fredrik.holmqvist@gmail.com>

Logging calculations was done outside the #def TRACE_VM_PAGE, but never printed.

Now done inside #def as well as this triggered unused variables warnings.


# 4be4fc6b 15-Jun-2012 Alex Smith <alex@alex-smith.me.uk>

More 64-bit compilation/safety fixes.


# 4bbb27e3 12-Feb-2012 Jerome Duval <jerome.duval@gmail.com>

More 'GCC4.6 variable set but not used' fixes.


# 35632c56 16-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Fix harmless oversight marking pages with the wrong state.

While the log of hrev35726 says that unusable page ranges are supposed
to be marked with PAGE_STATE_UNUSED and allocated ones with
PAGE_STATE_WIRED, both actually marked with PAGE_STATE_UNUSED.


# 42000735 16-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Tiny optimization by skipping a no-op iteration.

We initialize the physicalPagesEnd from physical_memory_range[0] so
re-evaluating that range is a no-op.


# 3dbd9c11 16-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Fix the LIMIT_AVAILABLE_MEMORY debug option.

When limiting the available memory by reducing the page count it may not
be enough to just limit sNumPages. Depending on the physical memory map
non existing pages between ranges (sNonExistingPages) would still be
added up and later subtracted from the sNumPages, resulting in a wrong
max page count. Also due to the fixed removal of non existing page
ranges the actually available memory would usually not be the amount
set via LIMIT_AVAILABLE_MEMORY.

Instead we now calculate the available memory when going through the
physical memory ranges and limit/exit as soon as we've reached the
desired amount of available memory (also ignoring further non-existing
pages).


# c12f5126 14-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Ensure the sanity of the stats returned, make the TODO a Note.

* Ensure that we don't underflow the used_pages count and that used
+ cached pages don't overflow max_pages. As there is no locking the
values may change while we read them so that such situations could
arise.
* Make the TODO about the missing locking into a Note explaining the
above, as it is not really worth adding locking here. The stats are
only informational.


# 3733c51d 13-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Fix the computation of used memory and add a TODO.

* The altered used pages calculation of hrev43168 wasn't correct, as
the inactive page queue may (validly) contain mapped pages as well.
Those would then get counted twice (as they are included in
gMappedPagesCount already).
Instead we calculate the used pages from the total page count, minus
everything we account for otherwise. Doing it this way is possible
without introducing any additional counters, as all the counts to
subtract are already present (as opposed to some of the ones that
would be needed for adding the counts up). Fixes #8109.
* Added TODO regarding the problem of not locking any of the counters
which runs the risk of them getting modified while we haven't yet read
all of them.


# 90c6930e 04-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Add VM page allocation tracking similar to what happens in the slab already.
Introduces "page_allocation_infos" and "page_allocations_per_caller" KDL
commands.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43190 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6d41dfd9 04-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Move some of the trace entries around so that we know the page(s) they concern
and add that info to the trace entries.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43187 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 865a0be1 04-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Add optional stack traces to {Allocate|Free}Page[Run] tracing.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43185 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 448d8d6f 04-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Indent cleanup only, no functional change.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43184 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 58ce0a2c 03-Nov-2011 Rene Gollent <anevilyak@gmail.com>

When calculating the number of used pages for a get_system_info() request,
also include inactive pages. Fixes #7714.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43168 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d3fdd8b1 30-Oct-2011 Michael Lotz <mmlr@mlotz.ch>

Remove superflous test done a few lines above already.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43014 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 24df6592 11-Jun-2011 Ingo Weinhold <ingo_weinhold@gmx.de>

Merged signals-merge branch into trunk with the following changes:
* Reorganized the kernel locking related to threads and teams.
* We now discriminate correctly between process and thread signals. Signal
handlers have been moved to teams. Fixes #5679.
* Implemented real-time signal support, including signal queuing, SA_SIGINFO
support, sigqueue(), sigwaitinfo(), sigtimedwait(), waitid(), and the addition
of the real-time signal range. Closes #1935 and #2695.
* Gave SIGBUS a separate signal number. Fixes #6704.
* Implemented <time.h> clock and timer support, and fixed/completed alarm() and
[set]itimer(). Closes #5682.
* Implemented support for thread cancellation. Closes #5686.
* Moved send_signal() from <signal.h> to <OS.h>. Fixes #7554.
* Lots over smaller more or less related changes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42116 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4535495d 10-Jan-2011 Ingo Weinhold <ingo_weinhold@gmx.de>

Merged the signals branch into trunk, with these changes:
* The team and thread kernel structures have been renamed to Team and Thread
respectively and moved into the new BKernel namespace.
* Several (kernel add-on) sources have been converted from C to C++ since
private kernel headers are included that are no longer C compatible.

Changes after merging:
* Fixed gcc 2 build (warnings mainly in the scary firewire bus manager).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40196 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c5e2c3ec 08-Oct-2010 Axel Dörfler <axeld@pinc-software.de>

* Fixed a bug that would cause allocate_page_run() to be called with an out of
bounds index - the system would overwrite memory then and eventually KDL.
This could best be reproduced with overlays after a while.
* Added a TODO comment that explains why free_cached_pages() might fail even
though the page is actually free now.
* Added an explanation of how the sFreePageQueuesLock is to be used, thanks to
Ingo for explaining it to me in the first place :-)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38895 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5cdadcae 22-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

page_writer(): Fixed the pagesSinceLastSuccessfulWrite computation. Only the
skipped pages were added, not the failed ones.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37682 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2ab433ba 22-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* PageWriteWrapper::Done(): Returns whether the page was successfully written,
now.
* PageWriterRun::Go(): Returns the number of pages that could not be written.
* page_writer()/next_modified_page():
- Don't use a marker page anymore. A visited page is requeued at the tail.
This also makes the functions that schedule pages work a bit better (they
queue the pages at the head of the queue).
- Have an eye on pages that are busy or failed to write. If we ran through
the whole modified queue without writing a single page, sleep for a short
time. This mitigates the busyness the page writer falls into when there
are enough modified pages to make it run all the time but none that can be
written successfully.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37681 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2fd209cf 13-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

page_writer(): Added TODO about potential deadlock in case of loop file
systems/devices.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37502 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b9447668 10-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved the vm_page initialization from vm_page.cpp:vm_page_init() to the new
vm_page::Init().
* Made vm_page::wired_count private and added accessor methods.
* Added VMCache::fWiredPagesCount (the number of wired pages the cache
contains) and accessor methods.
* Made more use of vm_page::IsMapped().
* vm_copy_on_write_area(): Added vm_page_reservation* parameter that can be
used to request a special handling for wired pages. If given the wired pages
are replaced by copies and the original pages are moved to the upper cache.
* vm_copy_area():
- We don't need to do any wired ranges handling, if the source area is a
B_SHARED_AREA, since we don't touch the area's mappings in this case.
- We no longer wait for wired ranges of the concerned areas to disappear.
Instead we use the new vm_copy_on_write_area() feature and just let it
copy the wired pages. This fixes #6288, an issue introduced with the use
of user mutexes in libroot: When executing multiple concurrent fork()s all
but the first one would wait on the fork mutex, which (being a user mutex)
would wire a page that the vm_copy_area() of the first fork() would wait
for.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37460 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 59c75457 06-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed warnings with TRACE_VM_PAGE enabled.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37411 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b4654045 23-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Added vm_page_max_address() which returns the greatest address of accessible
physical memory.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37230 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2a2b528e 19-Jun-2010 Wim van der Meer <wpjvandermeer@gmail.com>

Report ignored memory pages seperately, thanks to bonefish for the patch review. Closes ticket #6178

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37175 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a8ad734f 14-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Introduced structures {virtual,physical}_address_restrictions, which specify
restrictions for virtual/physical addresses.
* vm_page_allocate_page_run():
- Fixed conversion of base/limit to array indexes. sPhysicalPageOffset was not
taken into account.
- Takes a physical_address_restrictions instead of base/limit and also
supports alignment and boundary restrictions, now.
* map_backing_store(), VM[User,Kernel]AddressSpace::InsertArea()/
ReserveAddressRange() take a virtual_address_restrictions parameter, now. They
also support an alignment independent from the range size.
* create_area_etc(), vm_create_anonymous_area(): Take
{virtual,physical}_address_restrictions parameters, now.
* Removed no longer needed B_PHYSICAL_BASE_ADDRESS.
* DMAResources:
- Fixed potential overflows of uint32 when initializing from device node
attributes.
- Fixed bounce buffer creation TODOs: By using create_area_etc() with the
new restrictions parameters we can directly support physical high address,
boundary, and alignment.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37131 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8a8043dc 13-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_get_stats(): Forgot to added sIgnoredPages to system_info::max_pages
in r37117 as well, which was really the main point of introducing it.
Improves #6124 (reported memory lower than installed).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37127 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 03732070 12-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* vm_page_init_num_pages(): Sum up the number of pages between the usable
physical memory ranges.
* vm_page_num_pages(), vm_page_get_stats(): Report the actually existing
memory, count memory ignored by the boot loader as used.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37117 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1d26c724 10-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_allocate_page_run(): Added parameter "limit", specifying the upper
physical address limit for the page run to allocate.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37086 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2ea7b17c 09-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* vm_allocate_early(): Replace "bool blockAlign" parameter by a more flexible
"addr_t aligmnent".
* X86PagingMethod32Bit::PhysicalPageSlotPool::InitInitial(),
generic_vm_physical_page_mapper_init(): Use vm_allocate_early()'s alignment
feature instead of aligning by hand.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37070 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1d578e15 02-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed more address types related issues. Mostly printf() or comparison
warnings, but also some oversights from earlier changes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37000 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 435c43f5 02-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Introduced type generic_io_vec, which is similar to iovec, but uses types
that are wide enough for both virtual and physical addresses.
* DMABuffer, IORequest, IOScheduler,... and code using them: Use
generic_io_vec and generic_{addr,size}_t where necessary.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36997 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 147133b7 25-May-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* First run through the kernel's private parts to use phys_{addr,size}_t
where appropriate.
* Typedef'ed page_num_t to phys_addr_t and used it in more places in
vm_page.{h,cpp}.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36937 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8ccc58ff 10-May-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Missing line breaks in dprintf().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36785 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 83bc49d0 06-May-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_requeue(): Disabled DEBUG_PAGE_ACCESS_CHECK(). Since r36155
idle_scan_active_pages() cannot satisfy this assertion anymore. Added TODO
for a better fix which can wait until after the release.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36649 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3735d4e2 05-May-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

mark_page_range_in_use(): When the given range lies partially outside the
array at least work with the part intersecting with the array. Log those
quasi error cases.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36633 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d3166e46 29-Apr-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Replaced no longer necessary send_signal_etc() work-arounds for
resume_thread().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36531 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b1e06d23 26-Apr-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* The "page_stats" command does now also print the longest contiguous runs of
free respective free and cached pages.
* Removed the unused vm_page_allocate_page_run_no_base().
* vm_page_allocate_page_run() (and allocate_page_run()):
- Use vm_page_reserve_pages() instead of vm_page_try_reserve_pages(), i.e.
wait until the reservation succeeds.
- Now we iterates two times through the pages to find a suitable page run. In
the first iteration it only looks for free/clear pages, in the second
iteration it also considers cached pages. This increases the chance of the
function to succeed, when a lot of caching is going on.
This reduces the amount of memory required to use the IOCache when booting
off the anyboot Live CD to around 160 MB in qemu. It also seems to work with
128 MB, but the syslog indicates that some memory allocations fail, which
is not exactly inspiring confidence.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36489 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 713bede8 11-Apr-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

full_scan_inactive_pages(): Don't call DEBUG_PAGE_ACCESS_START() before
checking whether the page is busy.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36155 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d80af65f 18-Mar-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

The "page" and the "cache" kernel debugger commands set a few temporary
variables, now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35903 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d40a9355 02-Mar-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Boot loader (x86 mmu.cpp):
* Made the page table allocation more flexible. Got rid of sMaxVirtualAddress
and added new virtual_end address to the architecture specific kernel args.
* Increased the virtual space we reserve for the kernel to 16 MB. That
should suffice for quite a while. The previous 2 MB were too tight when
building the kernel with debug info.
* mmu_init(): The way we were translating the BIOS' extended memory map to
our physical ranges arrays was broken. Small gaps between usable memory
ranges would be ignored and instead marked allocated. This worked fine for
the boot loader and during the early kernel initialization, but after the
VM has been fully set up it frees all physical ranges that have not been
claimed otherwise. So those ranges could be entered into the free pages
list and would be used later. This could possibly cause all kinds of weird
problems, probably including ACPI issues. Now we add only the actually
usable ranges to our list.

Kernel:
* vm_page_init(): The pages of the ranges between the usable physical memory
ranges are now marked PAGE_STATE_UNUSED, the allocated ranges
PAGE_STATE_WIRED.
* unmap_and_free_physical_pages(): Don't free pages marked as unused.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35726 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 24244d3c 20-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

idle_scan_active_pages(): vm_page_requeue() requires the caller to mark the
page accessed for the access debugging feature.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35542 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4a1f6683 20-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Also print the page for the page related asserts.
* Used vm_page::IsMapped() to simplify things.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35541 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3e5343f2 20-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

free_cached_page(): Removed incorrect asserts. The same ones appear a few
lines later anyway, after the cache has been locked and it has been verified
that the page is still a candidate. Fixes #5432.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35539 a95241bf-73f2-0310-859d-f6bbb57e9c96


# bd7645a1 20-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Made vm_page::state private and added accessor methods.
* Added kernel tracing for page state transitions.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35538 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 477fd1be 19-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Added assert in free_page().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35533 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 69490760 16-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added some more asserts for cached pages.
* full_scan_inactive_pages(): Fixed syntactical glitch (missing "else").
Affected only the active paging mode and was relatively harmless. The worst
case would be that an inactive page would be moved to the cached queue
although its usage_count hadn't dropped to 0 yet, thus freeing it before
pages that deserved it more.
* move_page_to_active_or_inactive_queue():
- Was ignoring the page's modified flag, thus potentially moving a modified
page to the cached queue. That could happen only in rare cases though,
like when the page was still mmap()ped while being written and modified and
unmapped before being done.
- No longer move the page to the inactive queue, even if its usage count is 0.
In idle mode the page daemon doesn't look at inactive pages, so the page's
stats wouldn't be updated anymore.
- Renamed to move_page_to_appropriate_queue().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35499 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 22fb471f 15-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* page_writer(): Missing continue in the temporary skipping case.
* vm_page_write_modified_page_range(): Need to DEBUG_PAGE_ACCESS_END() a bit
later.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35487 a95241bf-73f2-0310-859d-f6bbb57e9c96


# fa47a7c4 15-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

page_writer():
* Use the same criterion when to write back temporary pages as the page daemon.
* Move wired and temporary pages that shall not be written back to the active or
inactive queue so they don't get stuck in the modified queue and potentially
cause the page writer to run permanently without actually making progress
(#5382).

page writing implementation:
* If writing back a temporary page failed, move it back to the inactive or
active queue, so it doesn't get stuck in the modified queue. If active paging
continues, it might find its way back to the modified queue in the next
iteration, but that improves the situation a bit at least. Particularly with
the port heap pages not really being swappable ATM.
* Never dequeue pages from the modified queue. We mark them busy, so the page
writer will skip them anyway. This allows others to play with the page to some
extend (at least allowing to move it between the queues). This fixes #5404.
* Removed PageWriteWrapper::ClearModifiedFlag(). We clear the modified flag in
PageWriteWrapper::SetTo(), now, so that the page writer doesn't need to do
that explicitly either.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35485 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b0f5b170 15-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Removed PageWriteWrapper::CheckRemoveFromShrunkenCache() and moved removing
the page to Done().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35474 a95241bf-73f2-0310-859d-f6bbb57e9c96


# dc6a6a9b 03-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Reenabled interrupts before notifying the page writer.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35399 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d8141a0e 03-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Removed the commented out scanning of the inactive queue when no paging is
going on. I only wanted to have it in the repository in case we decide at a
later point that it is a good idea after all.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35395 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 40bb9481 03-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Removed useless return parameter from vm_remove_all_page_mappings().
* Added vm_clear_page_mapping_accessed_flags() and
vm_remove_all_page_mappings_if_unaccessed(), which combine the functionality
of vm_test_map_activation(), vm_clear_map_flags(), and
vm_remove_all_page_mappings(), thus saving lots of calls to translation map
methods. The backend is the new method
VMTranslationMap::ClearAccessedAndModified().
* Started to make use of the cached page queue and changed the meaning of the
other non-free queues slightly:
- Active queue: Contains mapped pages that have been used recently.
- Inactive queue: Contains mapped pages that have not been used recently. Also
contains unmapped temporary pages.
- Modified queue: Contains unmapped modified pages.
- Cached queue: Contains unmapped unmodified pages (LRU sorted).
Unless we're actually low on memory and actively do paging, modified and
cached queues only contain non-temporary pages. Cached pages are considered
quasi free. They still belong to a cache, but since they are unmodified and
unmapped, they can be freed immediately. And this is what
vm_page_[try_]reserve_pages() do now when there are no more actually free
pages at hand. Essentially this means that pages storing cached file data,
unless mmap()ped, no longer are considered used and don't contribute to page
pressure. Paging will not happen as long there are enough free + cached pages
available.
* Reimplemented the page daemon. It no longer scans all pages, but instead works
the page queues. As long as the free pages situation is harmless, it only
iterates through the active queue and deactivates pages that have not been
used recently. When paging occurs it additionally scans the inactive queue and
frees pages that have not been used recently.
* Changed the page reservation/allocation interface:
vm_page_[try_]reserve_pages(), vm_page_unreserve_pages(), and
vm_page_allocate_page() now take a vm_page_reservation structure pointer.
The reservation functions initialize the structure -- currently consisting
only of a count member for the number of still reserved pages.
vm_page_allocate_page() decrements the count and vm_page_unreserve_pages()
unreserves the remaining pages (if any). Advantages are that reservation/
unreservation mismatches cannot occur anymore, that vm_page_allocate_page()
can verify that the caller has indeed a reserved page left, and that there's
no unnecessary pressure on the free page pool anymore. The only disadvantage
is that the vm_page_reservation object needs to be passed around a bit.
* Reworked the page reservation implementation:
- Got rid of sSystemReservedPages and sPageDeficit. Instead
sUnreservedFreePages now actually contains the number of free pages that
have not yet been reserved (it cannot become negative anymore) and the new
sUnsatisfiedPageReservations contains the number of pages that are still
needed for reservation.
- Threads waiting for reservations do now add themselves to a waiter queue,
which is ordered by descending priority (VM priority and thread priority).
High priority waiters are served first when pages become available.
Fixes #5328.
* cache_prefetch_vnode(): Would reserve one less page than allocated later, if
the size wasn't page aligned.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35393 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e65c4002 29-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Replaced the vm_page_allocate_page*() "pageState" parameter by a more
general "flags" parameter. It encodes the target state of the page -- so
that the page isn't unnecessarily put in the wrong page queue first -- a
flag whether the page should be cleared, and one to indicate whether the
page should be marked busy.
* Added page state PAGE_STATE_CACHED. Not used yet.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35333 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 72382fa6 29-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Removed the page state PAGE_STATE_BUSY and instead introduced a vm_page::busy
flag. The obvious advantage is that one can still see what state a page is in
and even move it between states while being marked busy.
* Removed the vm_page::is_dummy flag. Instead we mark marker pages busy, which
in all cases has the same effect. Introduced a vm_page_is_dummy() that can
still check whether a given page is a dummy page.
* vm_page_unreserve_pages(): Before adding to the system reserve make sure
sUnreservedFreePages is non-negative. Otherwise we'd make nonexisting pages
available for allocation. steal_pages() still has the same problem and it
can't be solved that easily.
* map_page(): No longer changes the page state/mark the page unbusy. That's the
caller's responsibility.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35331 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d18eaf4c 27-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Improved the clarity of some loops in the page reservation functions. No
functional change (other than avoiding no-ops like subtracting 0).
* vm_page_try_reserve_pages(): Moved the kernel tracing calls from the top of
the function to the points where the reservation already succeeded.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35322 a95241bf-73f2-0310-859d-f6bbb57e9c96


# deee8524 26-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Introduced {malloc,memalign,free}_etc() which take an additional "flags"
argument. They replace the previous special-purpose allocation functions
(malloc_nogrow(), vip_io_request_malloc()).
* Moved the I/O VIP heap to heap.cpp accordingly.
* Added quite a bit of passing around of allocation flags in the VM,
particularly in the VM*AddressSpace classes.
* Fixed IOBuffer::GetNextVirtualVec(): It was ignoring the VIP flag and always
allocated on the normal heap.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35316 a95241bf-73f2-0310-859d-f6bbb57e9c96


# cff6e9e4 26-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* The system now holds back a small reserve of committable memory and pages. The
memory and page reservation functions have a new "priority" parameter that
indicates how deep the function may tap into that reserve. The currently
existing priority levels are "user", "system", and "VIP". The idea is that
user programs should never be able to cause a state that gets the kernel into
trouble due to heavy battling for memory. The "VIP" level (not really used
yet) is intended for allocations that are required to free memory eventually
(in the page writer). More levels are thinkable in the future, like "user real
time" or "user system server".
* Added "priority" parameters to several VMCache methods.
* Replaced the map_backing_store() "unmapAddressRange" parameter by a "flags"
parameter.
* Added area creation flag CREATE_AREA_PRIORITY_VIP and slab allocator flag
CACHE_PRIORITY_VIP indicating the importance of the request.
* Changed most code to pass the right priorities/flags.

These changes already significantly improve the behavior in low memory
situations. I've tested a bit with 64 MB (virtual) RAM and, while not
particularly fast and responsive, the system remains at least usable under high
memory pressure.
As a side effect the slab allocator can now be used as general memory allocator.
Not done by default yet, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35295 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 86c794e5 21-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

slab allocator:
* Implemented a more elaborated raw memory allocation backend (MemoryManager).
We allocate 8 MB areas whose pages we allocate and map when needed. An area is
divided into equally-sized chunks which form the basic units of allocation. We
have areas with three possible chunk sizes (small, medium, large), which is
basically what the ObjectCache implementations were using anyway.
* Added "uint32 flags" parameter to several of the slab allocator's object
cache and object depot functions. E.g. object_depot_store() potentially wants
to allocate memory for a magazine. But also in pure freeing functions it
might eventually become useful to have those flags, since they could end up
deleting an area, which might not be allowable in all situations. We should
introduce specific flags to indicate that.
* Reworked the block allocator. Since the MemoryManager allocates block-aligned
areas, maintains a hash table for lookup, and maps chunks to object caches,
we can quickly find out which object cache a to be freed allocation belongs
to and thus don't need the boundary tags anymore.
* Reworked the slab boot strap process. We allocate from the initial area only
when really necessary, i.e. when the object cache for the respective
allocation size has not been created yet. A single page is thus sufficient.

other:
* vm_allocate_early(): Added boolean "blockAlign" parameter. If true, the
semantics is the same as for B_ANY_KERNEL_BLOCK_ADDRESS.
* Use an object cache for page mappings. This significantly reduces the
contention on the heap bin locks.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35232 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6379e53e 19-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page no longer points directly to its containing cache, but rather to a
VMCacheRef object which points to the cache. This allows to optimize
VMCache::MoveAllPages(), since it no longer needs to iterate over all pages
to adjust their cache pointer. It can simple swap the cache refs of the two
caches instead.

Reduces the total -j8 Haiku image build time only marginally. The kernel time
drops almost 10%, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35155 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f082f7f0 15-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added vm_page::accessed flag. Works analogously to vm_page::modified.
* Reorganized the code for [un]mapping pages:
- Added new VMTranslationMap::Unmap{Area,Page[s]}() which essentially do what
vm_unmap_page[s]() did before, just in the architecture specific code, which
allows for specific optimizations. UnmapArea() is for the special case that
the complete area is unmapped. Particularly in case the address space is
deleted, some work can be saved. Several TODOs could be slain.
- Since they are only used within vm.cpp vm_map_page() and vm_unmap_page[s]()
are now static and have lost their prefix (and the "preserveModified"
parameter).
* Added VMTranslationMap::Protect{Page,Area}(). They are just inline wrappers
for Protect().
* X86VMTranslationMap::Protect(): Make sure not to accidentally clear the
accessed/dirty flags.
* X86VMTranslationMap::Unmap()/Protect(): Make page table skipping actually
work. It was only skipping to the next page.
* Adjusted the PPC code to at least compile.

No measurable effect for the -j8 Haiku image build time, though the kernel time
drops minimally.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35089 a95241bf-73f2-0310-859d-f6bbb57e9c96


# bcc2c157 13-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Refactored vm_translation_map:
* Pulled the physical page mapping functions out of vm_translation_map into
a new interface VMPhysicalPageMapper.
* Renamed vm_translation_map to VMTranslationMap and made it a proper C++
class. The functions in the operations vector have become methods.
* Added class GenericVMPhysicalPageMapper implementing VMPhysicalPageMapper
as far as possible (without actually writing new code).
* Adjusted the x86 and the PPC specifics accordingly (untested for the
latter). For the other architectures the build is, I'm afraid, seriously
broken.

The next steps will modify and extend the VMTranslationMap interface, so that
it will be possible to fix the bugs in vm_unmap_page[s]() and employ
architecture specific optimizations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35066 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 829f3028 11-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Introduced vm_page::modified flag, which is used by vm_unmap_page[s]() to
preserve the dirty flag of the mapping without having to potentially move the
page to the modified queue. This lifts the (ignored) requirement that the
pages to be unmapped must not be busy.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35023 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9c6720c0 11-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed two instances of debug code I missed to adjust in r35004. Fixes #5242.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35020 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 451ca8b4 11-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

PAGE_TYPE_GUARD was unused and for the other two types a simple one bit flag
suffices. Therefore replaced vm_page::type by vm_page::is_dummy.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35013 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d7455de2 11-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

allocate_page_run(): Use temporary lists to store the pages we're allocating.
This makes appending the pages to the active queue more efficient and we
don't need the vm_page::is_cleared bit anymore.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35011 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7372a88a 10-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Replaced the page queue mutexes by spinlocks. The critical sections are very
short and quite hot, so mutexes just cause more overhead due to frequent
rescheduling than waiting for the spinlocks does. The free and clear queues
are additionally protected by a R/W lock, which is mostly read-locked, save
for rare cases like allocating page runs.

The total -j8 Haiku image build speedup is marginal. The kernel time drops
about 8%, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35004 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5e0aacb9 09-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_schedule_write_page_range(): The debug code was a bit too possessive.
We can only access the page, if it is not busy. Fixes #5228.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34980 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4aedc067 09-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

"page" debugger command:
* Various smaller fixes.
* Used add_debugger_command_etc() and added more verbose usage message.
* Added option "-m" which iterates through all address spaces and finds out
which virtual pages are mapped to the page.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34979 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5bcbe8b2 09-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

"find_page" didn't search the inactive queue.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34972 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2a30aab6 08-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Don't announce page access before being sure that the page isn't busy. Fixes
the erroneously trigger panic() in #5216.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34958 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3cd20943 06-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added new debug feature (DEBUG_PAGE_ACCESS) to detect invalid concurrent
access to a vm_page. It is basically an atomically accessed thread ID field
in the vm_page structure, which is explicitly set by macros marking the
critical sections. As a first positive effect I had to review quite a bit of
code and found several issues.
* Added several TODOs and comments. Some harmless ones, but also a few
troublesome ones in vm.cpp regarding page unmapping.
* file_cache: PrecacheIO::Prepare()/read_into_cache: Removed superfluous
vm_page_allocate_page() return value checks. It cannot fail anymore.
* Removed the heavily contended "pages" lock. We use different policies now:
- sModifiedTemporaryPages is accessed atomically.
- sPageDeficitLock and sFreePageCondition are protected by a new mutex.
- The page queues have individual locks (mutexes).
- Renamed set_page_state_nolock() to set_page_state(). Unless the caller says
otherwise, it does now lock the affected pages queues itself. Also changed
the return value to void -- we panic() anyway.
* set_page_state(): Add free/clear pages to the beginning of their respective
queues as this is more cache-friendly.
* Pages with the states PAGE_STATE_WIRED or PAGE_STATE_UNUSED are no longer
in any queue. They were in the "active" queue, but there's no good reason
to have them there. In case we decide to let the page daemon work the queues
(like FreeBSD) they would just be in the way.
* Pulled the common part of vm_page_allocate_page_run[_no_base]() into a helper
function. Also fixed a bug I introduced previously: The functions must not
vm_page_unreserve_pages() on success, since they remove the pages from the
free/clear queue without decrementing sUnreservedFreePages.
* vm_page_set_state(): Changed return type to void. The function cannot really
fail and no-one was checking it anyway.
* vm_page_free(), vm_page_set_state(): Added assertion: The page must not be
free/clear before. This is implied by the policy that no-one is allowed to
access free/clear pages without holding the respective queue's lock, which is
not the case at this point. This found the bug fixed in r34912.
* vm_page_requeue(): Added general assertions. panic() when requeuing of
free/clear pages is requested. Same reason as above.
* vm_clone_area(), B_FULL_LOCK case: Don't map busy pages. The implementation is
still not correct, though.

My usual -j8 Haiku build test runs another 10% faster, now. The total kernel
time drops about 18%. As hoped the new locks have only a fraction of the old
"pages" lock contention. Other locks lead the "most wanted list" now.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34933 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 88675a7e 04-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

steal_pages(): Recheck sUnreservedFreePages after incrementing sPageDeficit.
Since the former is no longer guarded by any lock, there's a race condition
with vm_page_unreserve_pages() which would cause us to wait longer than
necessary.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34898 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 37caa955 04-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Replaced the sReservedPages counter tracking the page reservations by
sUnreservedFreePages which tracks the difference between free/clear and
reserved pages. Access to it uses atomic operations which allows the three
page (un)reservation to avoid locking in most cases, thus reducing contention
of the "pages" lock.

In the -j8 Haiku image build that decreases the contention of the "pages"
lock to about one third of the previous value. As a positive side effect the
VMCache lock contention drops about the same factor. The total build speedup
is about 20%, the total kernel time drops about 20%.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34888 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1e175b59 03-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Removed duplicate condition.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34886 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5800e8a4 03-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved the page management functionality into its own file.
* Renamed page_queue to VMPageQueue and made it a proper C++ class. Use
DoublyLinkedList instead of own list code.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34874 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1021fd28 01-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* agp_gart(): Use vm_page_[un]reserve_pages().
* Removed unused vm_page_allocate_pages().
* Removed now unused (always true) "reserved" parameter from
vm_page_allocate_page().
* Removed unused (always false) "stealActive" parameter from steal_page().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34836 a95241bf-73f2-0310-859d-f6bbb57e9c96


# eb8dc1eb 27-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* 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


# 522c2f19 07-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added a simple mechanism to wait for events to VMCache. WaitForPageEvents()
waits for certain events on a given page, NotifyPageEvents() wakes up
waiting threads respectively.
* Used the new feature instead of condition variables for waiting on busy
pages. We save publishing and unpublishing of a condition variable whenever
a page is marked busy. There's only something to do, if there's at least
one thread waiting in the list of the respective cache. The general
assumption is that this is only rarely the case and even if it happens,
there should be only very few threads.
* Added an apparently missing notification in cache_io(). At least I didn't
see the reason for it not being there.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34537 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f34a1dd5 02-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

Created VMArea.{h,cpp} and moved VMArea and the global area hash table (new
class VMAreaHash) there.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34450 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e50cf876 02-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved the VM headers into subdirectory vm/.
* Renamed vm_cache.h/vm_address_space.h to VMCache.h/VMAddressSpace.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34449 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 90d870c1 02-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved VMAddressSpace definition to vm_address_space.h.
* "Classified" VMAddressSpace, i.e. turned the vm_address_space_*() functions
into methods, made all attributes (but "areas") private, and added
accessors.
* Also turned the vm.cpp functions vm_area_lookup() and
remove_area_from_address_space() into VMAddressSpace methods. The rest of
the area management functionality will follow soon.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34447 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a477e3cf 01-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

Finished renaming of vm_cache to VMCache.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34424 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b0db552c 01-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

Renamed vm_address_space to VMAddressSpace.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34422 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7d6c7206 28-Oct-2009 Axel Dörfler <axeld@pinc-software.de>

* There is no need for the sPageLock to be a spinlock - a mutex should do. This
should improve the kernel latencies, as things like
vm_page_allocate_page_run() is very expensive.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33807 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7ebd7cfc 11-Oct-2009 Michael Lotz <mmlr@mlotz.ch>

Add a vm_page_allocate_page_run_no_base. It bases its search on the pages found
in the free and/or clear queue. This performs better in the case where only few
pages are free/clear but performs worse in the case where there are a lot of
usable pages. It's not used anywhere but it might come in handy one time.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33527 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7a4d6045 11-Oct-2009 Michael Lotz <mmlr@mlotz.ch>

Implement combining scattered physical pages using seperate iovecs in
PageWriteTransfer. This makes the transfer accept virtually contiguous pages,
where the offset is contiguous on either end of the current transfer, but where
the pages aren't physically contiguous. It will then add seperate iovecs for
these pages (32 at max right now). This reduces the number of IO requests
generated and allows for optimizations down the IO path (like in the physical to
virtual mapping case for example).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33526 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1af7d115 10-Oct-2009 Michael Lotz <mmlr@mlotz.ch>

* Rework page writing to combine page writes where possible. For now the pages
are required to be physically contiguos, which should be reworked to put them
into seperate iovecs. Still this manages to combine a great deal of page
writes into larger bursts already. Reduces the amount of IO requests being
scheduled (and greatly benefits media where page wise writes are slow when
they are accessed through a non-IOScheduler path, i.e. USB mass storage until
that is properly implemented).
* Abstracted per page page writing tasks into a PageWriteWrapper class.
* Abstracted per transfer page writing tasks into PageWriteTransfer class which
formerly was the PageWriterCallback.
* Use both classes from the PageWriterRun and from
vm_page_write_modified_page_range to remove code duplication.
* Adjusted synchronous VMAnonymousCache::Write() to cope correctly with larger
iovecs and more than one iovec. It assumed that there was exactly one page per
vector previously.
* Introduced MaxPagesPerWrite() and MaxPagesPerAsyncWrite() to VMCache to allow
a cache to specify restricitions. VMAnonymousCache does restrict the max pages
to 1 for WriteAsync right now as I didn't feel like reworking that one to cope
with non single page writes just yet.
* Pulled out PageWriteTransfer methods for better readability.
* Some typo fixes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33507 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 257f000b 06-Sep-2009 Michael Lotz <mmlr@mlotz.ch>

* When reserving pages and there aren't yet enough free pages, only steal as
many pages as are actually missing, not the full count.
* Take into account that free_page_queue_count() can be less than sReservedPages
(when some of the reserved pages have been allocated already) in
vm_page_num_unused_pages(). Before it could return negative and therefore
wrapped numbers.
* Simplify the page scrubber loop by continuing early. Also avoids a needless
interrupt spin lock acquisition when there's nothing to do.
* Some minor coding style cleanup.
* Fix a typo.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32980 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a866fa94 02-May-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

panic() when a page that is still mapped is freed.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30606 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2d8073a9 30-Apr-2009 Axel Dörfler <axeld@pinc-software.de>

* Added a TODO about a problematic use of vm_page_allocate_page() in combination
with vm_cache_acquire_locked_page_cache().
* Added new function vm_page_num_unused_pages() which returns the pages that are
actually completely free and unused.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30514 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 65d2b8a8 20-Apr-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Introduces VMCache::CanWritePage() returning whether the given cache can
theoretically write the given page.
* page writer: Fixed the incorrect check whether a temporary page can be
written by using the new CanWritePage().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30281 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3539fc6e 17-Apr-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

page writer:
* When writing a page failed it is not a good idea to re-enqueue it at the tail
of the modified queue, since that is definitely behind the page writer's
marker and the page would be picked up again before reaching the end of the
queue. If that happened with more than 256 pages, the page writer would keep
picking up only those non-writable pages and make no more progress.
* When selecting pages also skip temporary pages, if there's no more swap space
available, since trying to write those pages would most likely fail anyway
(triggering the first problem).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30230 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8c91d29b 07-Apr-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* PageWriterRun::Go(), vm_page_write_modified_page_range(): When writing the
page failed since the cache has been shrunk, we need not only remove the
page from the cache, we also need to remove all of its area mappings and
free it. Not removing the area mappings might have been the cause of #3110,
not freeing it would cause it to be leaked for good.
* vm_page_write_modified_page_range(): When writing failed for another reason
and the page wasn't in the modified queue before, we would lose the info
in which queue it was before and setting the page state to modified would
assume the active queue. This could potentially screw up our page queue
structures.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29992 a95241bf-73f2-0310-859d-f6bbb57e9c96


# aa4ba93e 08-Mar-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Renamed src/system/kernel/device_manager/io_requests.{h,cpp} to
IORequest.{h,cpp}.
* Introduced public <io_requests.h> header. Currently it only declares the
single function BFS uses.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29446 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c33667d4 01-Feb-2009 Michael Lotz <mmlr@mlotz.ch>

Fixing warnings under GCC4 in preparation to enable -Werror there as well:
* Replaced the use of offsetof() for structs that aren't PODs. Add a
offset_of_member() macro to util/khash.h because that's what it's used for
in our cases.
* Change the signature of add_debugger_command()/remove_debugger_command() on
GCC > 2 to avoid the depricated conversion from string constants to char *.
* Adding some "suggested" parenthesis. I know that not everyone likes that, but
it pointed out at least one bug that is fixed here as well.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29113 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 59dbd26f 20-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved more debug macros to kernel_debug_config.h.
* Turned the checks for all those macros to "#if"s instead of "#ifdef"s.
* Introduced macro KDEBUG_LEVEL which serves as a master setting.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28248 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 47c40a10 19-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Prefixed memset_physical() and memcpy_to_physical() with "vm_",
added vm_memcpy_from_physical() and vm_memcpy_physical_page(), and
added respective functions to the vm_translation_map operations. The
architecture specific implementation can now decide how to implement
them most efficiently. Added generic implementations that can be used,
though.
* Changed vm_{get,put}_physical_page(). The former no longer accepts
flags (the only flag PHYSICAL_PAGE_DONT_WAIT wasn't needed anymore).
Instead it returns an implementation-specific handle that has to be
passed to the latter. Added vm_{get,put}_physical_page_current_cpu()
and *_debug() variants, that work only for the current CPU,
respectively when in the kernel debugger. Also adjusted the
vm_translation_map operations accordingly.
* Made consequent use of the physical memory operations in the source
tree.
* Also adjusted the m68k and ppc implementations with respect to the
vm_translation_map operation changes, but they are probably broken,
nevertheless.
* For x86 the generic physical page mapper isn't used anymore. It is
suboptimal in any case. For systems with small memory it is too much
overhead, since one can just map the complete physical memory (that's
not done yet, though). For systems with large memory it counteracts
the VM strategy to reuse the least recently used pages. Since those
pages will most likely not be mapped by the page mapper anymore, it
will keep remapping chunks. This was also the reason why building
Haiku in Haiku was significantly faster with only 256 MB RAM (since
that much could be kept mapped all the time).
Now we're using a different strategy: We have small pools of virtual
page slots per CPU that are used for the physical page operations
(memset_physical(), memcpy_*_physical()) with CPU-pinned thread.
Furthermore we have four slots per translation map, which are used to
map page tables.

These changes speed up the Haiku image build in Haiku significantly. On
my Core2 Duo 2.2 GHz 2 GB machine about 40% to 20 min 40 s (KDEBUG
disabled, block cache debug disabled). Still more than factor 3 slower
than FreeBSD and Linux, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28244 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 51f837ae 16-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Dynamically adjust the page writer's I/O priority depending on how many
pages have to be written and how tight the memory situation is.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28198 a95241bf-73f2-0310-859d-f6bbb57e9c96


# feec0dd9 12-Oct-2008 François Revol <revol@free.fr>

Fix ifdef, should be DEBUG_PAGE_QUEUE there.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28009 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1b6eff28 11-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Replaced the vm_get_physical_page() "flags"
PHYSICAL_PAGE_{NO,CAN}_WAIT into an actual flag
PHYSICAL_PAGE_DONT_WAIT.
* Pass the flags through to the chunk mapper callback.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27979 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d654f56a 11-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added kernel tracing for the page daemon and the page writer.
* Added some commented out debug output in vm.cpp.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27971 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8b6f1d5e 08-Oct-2008 Rene Gollent <anevilyak@gmail.com>

Fixed warnings with tracing enabled and made some very noisy dprintfs trace-only
as they were flooding the syslog.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27935 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e43cb37b 05-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Moved several VM related debug settings to kernel_debug_config.h.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27876 a95241bf-73f2-0310-859d-f6bbb57e9c96


# ca7cb625 17-Sep-2008 Axel Dörfler <axeld@pinc-software.de>

* Implemented a (private for now) get_system_info_etc() call, that can retrieve
various system information.
* Implemented retrieving some VM stats via this call.
* The VM now maintains a page fault counter, and sets system_info::page_faults
accordingly.
* Added a (pretty simple) "vmstat" command line app.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27597 a95241bf-73f2-0310-859d-f6bbb57e9c96


# fd49e6b3 30-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Print some more interesting timing info for the page writer.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27245 a95241bf-73f2-0310-859d-f6bbb57e9c96


# ae21ddaf 28-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

steal_pages() was leaking a cache reference since r26572, i.e caches
locked there would be leaked eventually.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27228 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 96b6a162 27-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Increased the number of pages the page writer tries to write per run.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27217 a95241bf-73f2-0310-859d-f6bbb57e9c96


# aacb158c 23-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* The LIMIT_AVAILABLE_MEMORY macro can be defined to limit the amount of
RAM Haiku uses (for debugging purposes).
* "page_stats" prints some more infos now.
* page_writer():
- Moved the low_resource_state() invocation out of the inner loop.
Reduces lock contention on the sLowResourceLock recursive lock.
- Additional debug output: Every 1024 written pages the page writer
prints a message.
* steal_pages(): Addressed the TODO: When there should be pages to
steal, but we can't get them ATM, we now timeout on the free pages
condition variable instead of snoozing unconditionally, so that we
wake up earlier when someone frees pages in the meantime.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27181 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2e8e6c9c 21-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Introduced vm_page_try_reserve_pages(), which fails when not enough
pages are free ATM.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27116 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2a79a768 18-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* VMCache::Write(): Added "uint32 flags" argument which is supposed to
be passed on to the IORequest. Most relevantly physical pages can now
be written directly by passing B_PHYSICAL_IO_REQUEST.
* Added VMCache::WriteAsync() which is supposed to write pages
asynchronously. The base class version version falls back to the
synchronous Write(). Only VMVnodeCache implements WriteAsync() ATM,
VMAnonymousCache (swap support) still has to be adjusted accordingly.
* write_page() doesn't need to map the page anymore as it can write the
physical page directly.
* Modified the page writer to write pages asynchronously. This shouldn't
have any noticeable effect yet. It will though as soon as the I/O
scheduler reorders I/O operations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27056 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e387dd15 08-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

"page_stats" does now also print the number of mapped pages.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26875 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8d12bd13 05-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved the incrementing/decrementing of vm_page::wired_count into
dedicated functions.
* Introduced gMappedPagesCount variable which counts the total number of
physical pages that are mapped.
* Added vm_page_get_stats() which fills in the memory related part of
the system_info structure. Used and cached pages are computed
differently, now. The "available" (== not committed) memory is no
longer used for the computation as it doesn't say anything about the
actually used/free pages (with swap support enabled it is even
less meaningful, since we first commit swap space when possible).
We do also consider the memory used by the block cache as cached
pages, now. All in all these changes should fix the memory statistics
reported by get_system_info(), IOW bug #2574.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26837 a95241bf-73f2-0310-859d-f6bbb57e9c96


# dbc6635d 31-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

The page queues no longer count added dummy pages. This fixes a problem
in steal_pages() which uses the number of pages in the inactive queue as
return criterion. It would thus return, if only marker pages were in the
queue and no page could be stolen. This led to a busy loop in
vm_page_allocate_page(). The whole system would become unusable when the
thread in question was the heap grower, since it would starve everyone
else due to its high priority.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26710 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d3374bdc 28-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Reverted most of r26641.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26658 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 134a2fd1 26-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Patch by Zhao Shuai with some modifications by myself:
* Renamed sModifiedTemporaryPages to sModifiedNoSwapPages to better
express what this variable is about.
* Changed tracking of sModifiedNoSwapPages. It really counts
non-swappable pages only, now (if swap support is enabled).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26641 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c586076d 24-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Patch by Zhao Shuai with changes by myself:
* Init swap support in main().
* Added "bool swappable" parameter to
VMCacheFactory::CreateAnonymousCache(). A cache supporting swapping
is created when true. Adjusted invocations accordingly.
* The page writer does now write non-locked swappable pages (when
memory is low).
* Fixed header guard of VMAnonymousNoSwapCache.h.
* Swap support is compiled conditionally, controlled by the
ENABLE_SWAP_SUPPORT in src/system/kernel/vm/VMAnonymousCache.h. It is
disabled ATM. Since no swap files are added, it wouldn't have much
effect anyway.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26625 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e6bd90c5 23-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* bfs_fsync() was the only place which could cause the
fs_vnode_ops::write_pages() to be called with fsReenter = true. Since
this is no longer the case, the argument has become superfluous. For
read_pages() it always was. Removed the argument from the functions
and all functions that propagated it.
* Some whitespace at the end of lines was removed.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26579 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5c99d639 22-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Merged branch haiku/branches/developer/bonefish/vm into trunk. This
introduces the following relevant changes:
* VMCache:
- Renamed vm_cache to VMCache, merged it with vm_store and made it a
C++ class with virtual methods (replacing the store operations).
Turned the different store implementations into subclasses.
- Introduced MergeStore() callback, changed semantics of Commit().
- Changed locking and referencing semantics. A reference can only be
acquired/released with the cache locked. An unreferenced cache is
deleted and a mergeable cache merged when it is unlocked. This
removes the "busy" state of a cache and simplifies the page fault
code.
* Added VMAnonymousCache, which will implement swap support (work by
Zhao Shuai). It is not integrated and used yet, though.
* Enabled the mutex/recursive lock holder asserts.
* Fixed DoublyLinkedList::Swap().
* Generalized the low memory handler to a low resource handler. And made
semaphores and reserved memory handled resources. Made
vm_try_resource_memory() optionally wait (with timeout), and used that
feature to reserve memory for areas.
...


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26572 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6db6b628 16-Jul-2008 Axel Dörfler <axeld@pinc-software.de>

* Added B_PHYSICAL_BASE_ADDRESS address specification for anonymous areas.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26456 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e5f7642c 04-Jul-2008 Michael Lotz <mmlr@mlotz.ch>

Remove a few unused variables.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26249 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 45b309e3 04-Jul-2008 Michael Lotz <mmlr@mlotz.ch>

Spotted this while reading through page code. The usage_count would be set for
wrong pages when allocating a page run unless the run started at page 0 as the
start offset was missing.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26245 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e1b630c5 28-Jun-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Replaced the global cache pages hash table by an IteratableSplayTree
per cache.
* Changed the strategy vm_cache_acquire_page_cache_ref() uses to ensure
that the cache isn't deleted while trying to get a reference. Instead
of the global cache pages hash table lock, it holds the global cache
list lock now. We acquire + release this lock in delete_cache() after
removing all pages and just before deleting the object.
* Some small optimizations using the property that the cache's pages are
ordered, now (vm_cache_resize(), vm_page_write_modified_page_range(),
vm_page_schedule_write_page_range()).
* Replaced some code counting a cache's pages by simply using
vm_cache::page_count.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26160 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7b67df9c 23-Jun-2008 Salvatore Benedetto <salvatore.benedetto@gmail.com>

* Fix cache reference leak


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26110 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 710b7732 01-Jun-2008 Axel Dörfler <axeld@pinc-software.de>

* vm_cache::virtual_size is not always a multiple of B_PAGE_SIZE for files.
In these cases, the last partial page would have never been written back.
* This fixes bug #2282, and eventually others.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25747 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0f448d21 22-May-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added vm_page_write_modified_page_range(), which is similar to
vm_page_write_modified_pages(), save that it only writes pages in the
given range.
* Added vm_page_schedule_write_page_range() which schedules all modified
pages in the given cache's range for writing by the page writer.
* Added _kern_sync_memory() syscall and the msync() POSIX function.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25620 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0c615a01 01-May-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Removed old mutex implementation and renamed cutex to mutex.
* Trivial adjustments of code using mutexes. Mostly removing the
mutex_init() return value check.
* Added mutex_lock_threads_locked(), which is called with the threads
spinlock being held. The spinlock is released while waiting, of
course. This function is useful in cases where the existence of the
mutex object is ensured by holding the threads spinlock.
* Changed the two instances in the VFS code where an IO context of
another team needs to be locked to use mutex_lock_threads_locked().
Before it required a semaphore-based mutex implementation.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25283 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 184de764 30-Apr-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Replaced the vm_cache mutex by a cutex. This should save quite a few
semaphores.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25277 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c16d05cf 29-Apr-2008 Axel Dörfler <axeld@pinc-software.de>

* steal_page() called remove_page_from_queue() without holding the sPageLock.
This fixes bug #1900 for real.
* Rearranged find_page_candidate() a bit, removed duplicate code, added a panic
in case the marker state is invalid.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25255 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0b51ee4e 29-Apr-2008 Axel Dörfler <axeld@pinc-software.de>

* The page writer was calling remove_page_marker() without holding the
sPageLock. This could easily mess up the page queue.
* Now, remove_page_marker() gets the lock itself. This fixes bug #1900.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25250 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6bf15ffc 27-Apr-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Changed macros that enable tracing for individual components from
defined/undefined to numeric values (0 for undefined). This allows for
trace levels.
* Set SYSCALL_TRACING_IGNORE_KTRACE_OUTPUT default to 1, since this is
what one usually wants.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25213 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6cef245e 22-Apr-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Detemplatized ConditionVariable{Entry}. Merged them with their
respective Private* base class.
* Changed sigwait() and sigsuspend() to use thread_block() instead of a
condition variable.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25100 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6b536693 01-Apr-2008 Axel Dörfler <axeld@pinc-software.de>

* Renamed vm_get_available_memory() to vm_available_memory() to fit better
into our usual naming scheme.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24745 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 82d444a2 27-Mar-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Changed the page allocation tracking history to kernel tracing instead.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24614 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 332e24fb 26-Mar-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed a quasi-livelock in steal_pages() as proposed in ticket #1929.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24605 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 41f8d416 25-Mar-2008 Axel Dörfler <axeld@pinc-software.de>

Applied patch by Rene Gollent:
* Add a cached_pages field to the system_info structure, and change the
meaning of the used_pages field to not include cached pages.
* Provide the needed info using the new calls vm_get_available_memory(),
and vm_page_num_available_pages().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24571 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8b76a59a 17-Mar-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed race condition in the page writer: The state of the page we have
picked might have changed while we were locking its cache. Might fix
#1931.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24430 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9835c090 07-Feb-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Added a boolean "force" parameter to thread_yield(). When true, the
function has the old behavior. When false, it just calls the scheduler
without any priority adjustment or other stuff.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23906 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 53f79797 17-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

* Fixed a deadlock (and resolved TODO): we need to make all pages unbusy again
before releasing our cache reference. Otherwise removing a vnode (triggered
by releasing the cache in our thread) could need pages we still own.
* Put the caches and pages into a union to save stack space; they are not
needed at the same time.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23580 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a825cef6 12-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

Added TODO comment about a possible deadlock Marcus just found :-)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23450 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3e5b9076 09-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

* Fixed (or rather, worked around) a deadlock in the VM: when a file was
resized but still had dirty pages to be written back,
vm_cache_resize() (which is called with the inode lock being held)
deadlocked with the page writer.
* Now, I reintroduced busy_writing: it'll be set by everything that
writes back pages (vm_page_write_modified(), and the page writer),
and will be checked for in vm_cache_resize() - other functions are not
affected for now, AFAICT.
* vm_cache_resize() will clear that flag, and the writer will check it
again after it wrote back the page (which will fail when it's outside
the file bounds), and if it's cleared, it will get rid of the page
(if the file has been resized again in the mean time, writing it will
succeed then, and we'll keep the page around).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23334 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 34dafb63 09-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

Minor refactoring.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23319 a95241bf-73f2-0310-859d-f6bbb57e9c96


# bcb71f00 09-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

* My last change to vm_page.cpp made an existing bug much more likely to
appear: when freeing a modified page, it wouldn't have a cache
anymore, but set_page_state_nolock() depended on it.
* To work around this, I added a vm_page_free() function, which the
caches that free modified pages have to call (but others may, too).
It will correctly maintain the sModifiedTemporaryPages counter in case
the cache has already been removed.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23318 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3d2595d1 09-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

The modified temporary page counter could go out of sync pretty easily.
This could cause the page writer to run endlessly.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23309 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9abdc424 08-Dec-2007 Axel Dörfler <axeld@pinc-software.de>

If there are more than 4 MB dirty cache pages, the page writer won't stop anymore
writing back pages when there is enough free memory.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23086 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3d268eda 10-Nov-2007 Axel Dörfler <axeld@pinc-software.de>

* Extracted file_map API out of the file cache - it's now an optional service
that can be used by file systems.
* Changed the way the file cache works: instead of reading/writing to the
underlying device directly, it can now be used for any data source, ie.
also network file systems.
* As a result, the former pages_io() moved to the VFS layer, and can now be
called by a file system via {read|write}_file_io_vec_pages() (naming
suggestions are always welcomed :-)). It now gets an FD, and uses that to
communicate with the device (via its fs_{read|write}_pages() hooks).
* The file_cache_{read|write}() functions must now be called without holding
an I/O relevant file system lock. That allows the file cache to prepare the
pages without colliding with the page writer, IOW the "mayBlock" flag can
go into the attic again (yay!).
* This also results in a much better performance when the system does I/O and
is low on memory, as the page writer can now finally write back some pages,
and that even without maxing out the CPU :)
* The API changes put slightly more burden on the fs_{read|write}_pages()
hooks, but in combination with the file_map it's still pretty straight
forward. It just will have to dispatch the call to the underlying device
directly, usually it will just call its fs_{read|write}_pages() hooks
via the above mentioned calls.
* Ported BFS and FAT to the new API, the latter has not been tested, though.
* Also ported the API changes to the fs_shell. I also completely removed its
file cache level page handling - the downside is that device access is no
longer cached (ie. depends on the host OS now), the upside is that the code
is greatly simplified.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22886 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 67f0ddf6 07-Nov-2007 Axel Dörfler <axeld@pinc-software.de>

Added the sModifiedTemporaryPages counter to the output of the "page_stats" KDL
command.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22856 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f7e414f2 07-Nov-2007 Axel Dörfler <axeld@pinc-software.de>

* Made page_writer() use a marker page as well, so that it won't try to get
the same pages over and over.
* Increased the priority of the page writer a bit, so that it is higher than
the one of the page daemon.
* Added a sModifiedTemporaryPages counter to let the page_writer decide how
many pages are there to write back (temporary pages would go to the swap file
and are only written back when memory is low).
* In case there are more than 1024 modified (non-temporary) pages around, the
page writer will constantly write out pages, not only when being pushed.
* The page writer now temporarily always leave out temporary pages (as long as
we don't have a swap file).
* Shuffled functions around a bit.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22852 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a81e874f 05-Nov-2007 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added opt-in debugging feature: Recent allocation-related operations
on pages are recorded in a history and can be printed via the
"page_allocations" command.
* Fixed a problem in the page scrubber. It temporarily removed pages
from the free list, which could have been reserved by someone else.
When actually allocating the reserved pages, that someone could find
free and clear lists empty and would therefore rightfully panic
("Had reserved page, but there is none!").


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22841 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5ff3d4f2 05-Nov-2007 Axel Dörfler <axeld@pinc-software.de>

* If steal_pages() stole more than originally asked for, it might have lost those pages in the
non-reserve case.
* vm_page_allocate_page() could also lose a stolen page in case more free pages were available
after steal_pages() was called.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22834 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f8941839 11-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Reworked stealing pages: the page thief thread is gone now,
vm_page_reserve_pages() and vm_page_allocate_page() will now steal pages from
the inactive queue as needed.
* We currently never steal active pages anymore, but this might need to be
revised later (therefore, the page scanner never waits anymore, but uses
mutex_trylock() to lock a cache).
* The page scanner and writer now both run at normal priority - let's see how
that will work out.
* Introduced an inactive queue.
* Instead of shuffling pages around in the queue (and therefore destroying LRU)
the page stealing mechanism now uses a marker page to be able to release the
page lock without losing its position in the queue.
* The page writer now always grabs the whole release count of the semaphore, so
that there won't be a huge backlog to catch up with.
* vm_page_num_free_pages() now also includes the inactive queue as well as the
reserved pages (they are no longer regarded as free pages).
* Added a insert_page_after() function that inserts a page after another one,
needed by the marker code.
* clear_page() now gets a vm_page instead of a physical address which simplified
some code.
* Removed superfluous initialization of the queues (if those aren't zeroed on
start, we would have serious problems, anyway).
* Removed old and unimplemented dump_free_page_table() ("free_pages") KDL
command.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22506 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 477c9d1d 09-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* vm_set_area_protection() would remap the whole area instead of just the page
it intended to. That resulted in more writable pages where you wouldn't want
them (ie. allowing the area to change pages in lower caches).
* We were losing modified pages: vm_unmap_pages() sometimes has to preserve
the modified flag (eg. when called from page fault).
* Both of these were responsible that stealing active pages would crash
applications - even if less likely, this could also have happened when
stealing inactive pages. Therefore, I've activated stealing active pages
again.
* The page writer now pushes the pages of busy vnodes to the end of the queue,
so that it won't pick them up again too soon (the vnode destruction would
be in the process of writing those pages back, anyway).
* The page thief now triggers the page writer to run once it has to steal
active pages. This might be a bit too aggressive, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22495 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 873f2ffc 08-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Fixed the page_thief(): it never noticed it could not get a page.
* The page_thief() will no longer steal any pages in B_LOW_MEMORY_NOTE state,
only in the more serious cases.
* I've disabled stealing active pages for now again; there seem to be some
problems with it (either with how we do it, or with other stuff).
* vm_page_schedule_write_page() now always releases the page writer semaphore,
resulting in many more written pages - this isn't optimal as long as there is
no I/O scheduler, but before it was much too rare when there are many dirty
pages.
* Customized the thread priorities a bit to make the page scanner/thief/writer
experience a bit nicer with our current scheduler.
* vm_page_reserve_pages() would return too early, it did not test if really
enough pages are free.
* Under certain circumstances, the wakeup from vm_page_reserve_pages() did not
work - we now always notify in vm_page_unreserve_pages() to work around that
problem.
* Checked if the page reservations are done when needed and are always balanced
for the whole kernel.
* vm_page_allocate_page() now panics if it can't deliver a reserved page.
* vm_page_allocate_page_run() can no longer steal reserved pages.
* With all of those changes, I could finally copy a file in emulation, ie. the
Luposian bug should finally be fixed, even though the system might still not
be perfectly stable under low memory. Will do some more testing.
* write_page() no longer prints something on failure.
* Dumping a whole page queue will now also write the cache type of each page.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22486 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 20b232e9 07-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

Actually forgot this nail: the file cache will now reserve the pages it will
allocate with the vm_cache locked - this is necessary to be able to steal pages
from itself (large files...).
The system doesn't actually lock up anymore, but it still renders itself unusable;
obviously the page thief does not work correctly, yet. The rest of the experience
is created by our current scheduler (the page thief runs and runs, but it doesn't
free any pages anymore).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22466 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c950f17a 06-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Added a acquire_unreferenced_ref() to vm_store
* his has to be used by the page writer to make sure the vnode is still valid.
* This should have been the final nail on the Luposian bug - I haven't tested
it yet, but we'll certainly see :-)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22462 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 12113514 06-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

The page thief can now also steal active pages under pressure.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22456 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0e183340 06-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Mapping a page might actually need memory - since we usually have locks that
interfere with the page thief, we always need to have reserved a page for
this upfront. I introduced a function to the vm_translation_map layer that
estimates how much pages a mapping might need at maximum. All functions that
map a page now call this and reserve the needed pages upfront.
It might not be a nice solution, but it works.
* The page thief could run into a panic when trying to call vm_cache_release_ref()
on a non-existing (NULL) cache.
* Also, it will now ignore wired active pages.
* There is still a race condition between the page writer and the vnode
destruction - writing a page back needs a valid vnode, but that might just
have been deleted.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22455 a95241bf-73f2-0310-859d-f6bbb57e9c96


# edf66834 04-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Added some docs.
* Removed dead code.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22439 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9d8c2090 04-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* vm_remove_all_page_mappings() now returns an accumulation of the flags of
the unmapped page.
* This is needed by everyone who calls this to make sure modifications to a
page aren't ignored. Namely, the page scanner and the page thief were
affected.
* Cleaned up locking the page's cache a bit in page_thief(); there is now
a helper class that takes care of everything.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22438 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3e9513aa 03-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* fs_{write|read}_pages() now has an additional argument "mayBlock".
* the page writer don't allow to block, while all other writers do. This fixes
bug #1509. The reason the page writer needs this is because it marks several
pages from different caches as busy.
* Fixed a warning about ASSERT being defined already in BFS, since
util/DoublyLinkedList.h now includes debug.h.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22434 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e5b464d0 02-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

Added a TODO what we need to do with stolen active pages - for now, we don't
do anything with them, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22413 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b15c9ade 30-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Decoupled the page_thief() from the low memory handler chain. This is
necessary because low memory handlers might need to wait for other services
while we need to make sure the page thief can always steal pages.
* Made the page thief more aggressive when memory is critical: added a third
run where it will also steal a small amount of active pages to keep things
going.
* The page thief did not maintain the cache's reference correctly in all
situations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22382 a95241bf-73f2-0310-859d-f6bbb57e9c96


# cfed176e 28-Sep-2007 Ingo Weinhold <ingo_weinhold@gmx.de>

* I just saw the page writer passing a free page to write_page().
Apparently not everyone checks the page state for PAGE_STATE_BUSY.
vm_page_write_modified_pages() does now at least.
* Fixed typos in comments.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22349 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a6778735 28-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

bonefish+axeld:
* We now have a page writer that takes some pages from the modified queue
and writes it back every few seconds. It can be triggered by the page
scanner to do that more often, though. That mechanism can be greatly
improved once we have our I/O scheduler working.
* Removed vm_page_write_modified_page() again - it was all "eaten up" by
the page writer.
* Reworked vm_page_write_modified_pages() a bit: it now uses
vm_test_map_modification() and vm_clear_map_flags() instead of the
iterating over all areas which wouldn't even work correctly.
The code is much simpler now, too.
* You usually put something to the tail of a queue, and remove the contents
from the head, not vice versa - changed queue implementation to reflect this.
* Additionally, there is now a enqueue_page_to_head() if you actually want the
opposite.
* vm_page_requeue() allows you to move a page in a queue to the head or tail.
* Replaced vm_clear_map_activation() with vm_clear_map_flags() which allows
you to clear other flags than PAGE_ACCESSED.
* The page scanner dumps now some arguments with each run.
* Removed the old disabled pageout_daemon() from NewOS.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22348 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f98d60ae 26-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Removed the automatic release of the "modified_pages_available" semaphore
in enqueue_page() - it doesn't really belong there.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22328 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8692ec02 26-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Renamed vm_page_write_modified() to vm_page_write_modifed_pages() and
introduced a new vm_page_write_modified_page().
* Resolved a TODO: vm_page_write_modified_pages() did not mark a to be
written page busy but unlocked its cache which could let someone else
steal that page in the mean time.
* Moved the logic when to move a page to the active or inactive queue to
a new function move_page_to_active_or_inactive_queue().
* Moved page_state_to_string() to vm_page(); it's now also used by the
"page" and "page_queue" KDL commands.
* Made the output of the "page_queue list" command more useful.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22323 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8e0f884c 26-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Since the page scanner and thief can work more effectively when no vm_caches
are locked, there is now a vm_page_reserve_pages() call to ensure upfront that
there is a page for me when I need it, and may have locked some caches.
* The vm_soft_fault() routine now makes use of that feature.
* vm_page_allocate_page() now resets the vm_page::usage_count, so that the file
cache does not need to do this in read_chunk_into_cache() and
write_chunk_to_cache().
* In cache_io() however, it need to update the usage_count - and it does that
now. Since non-mapped caches don't have mappings, the page scanner will punish
the cache pages stronger than other pages which is accidently just what we
want.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22319 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6d4aea47 25-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

bonefish+axeld:
* Removed the vm_cache/vm_store ref_count duality that besides being a bit ugly
also created the page dameon cache retrieval problem: now, only areas (and
cache consumers) retrieve a reference to the store (and therefore, the vnode).
The page daemon doesn't need to care about this at all anymore, and the pseudo
references of the vm_cache could be removed again.
* Rearranged deletion of vnodes such that its ID can be reused directly after
fs_remove_vnode() has been called.
* vm_page_allocate_page() no longer panics when it runs out of pages, but just
waits for new pages to become available using the new sFreeCondition condition
variable - to make sure this happens in an acceptable time frame, it'll
trigger a run of the low memory handlers.
* Implemented a page_thief() that steals inactive pages from caches and puts
them into the free queue. It runs as a low memory handler.
* The file cache now sets the usage count on the pages it inserts into the
cache (needs some rework though, cache_io() doesn't do it yet).
* Instead of panicking, the kernel will currently dead lock in low memory
situations, since BFS does a bit too much in bfs_release_vnode().
* Some minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22315 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8c657126 25-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Removed unused vm_page::busy_{reading|writing} fields.
* Fixed vm_page_allocate_page_run(): it did not take the pageState into account,
and would therefore return uninitialized memory (ie. B_CONTIGUOUS areas would
contain garbage).
Now, it stores if a page is cleared in a new vm_page::is_cleared field.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22306 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d8badf67 03-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Renamed page queues according to our style guide.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22155 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 279c6b76 09-Aug-2007 Ingo Weinhold <ingo_weinhold@gmx.de>

* Use condition variables when waiting for busy pages or busy caches.
* Removed a few instances where the page state was set busy directly after
allocating it. This is a no-op, since a page is always busy after
allocation.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21875 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9da590f73e02881d2dc4100464ca0403b92cd11d 28-Oct-2014 Ingo Weinhold <ingo_weinhold@gmx.de>

Add vm_page_free_etc()

It additionally gets a vm_page_reservation* argument. If not NULL, the
page count of the reservation is incremented for the freed page.


# 42a91653ba39d980105504985113b7cb2dc117e2 07-Sep-2014 Michael Lotz <mmlr@mlotz.ch>

kernel: Fix missing else in dump_page_queue debugger command.

The entered page queue address would always be overwritten. Pointed
out by CID 610504.


# 73363f8ddec8f3262485fbf84a48dd8412dff4ed 19-Dec-2013 Pawel Dziepak <pdziepak@quarnos.org>

kernel/vm: Fix unsigned/signed comparison warning


# d02aaee17e007631fcfa91a012ec7b6386927012 15-Dec-2013 Pawel Dziepak <pdziepak@quarnos.org>

kernel, libroot: Add more memory info in system_info

system_info now contains all information previously available only
through __get_system_info_etc(B_MEMORY_INFO, ...).


# dac7b7c9805cb3c1291a98ceacb4dea94b0cfd65 06-Dec-2013 Ingo Weinhold <ingo_weinhold@gmx.de>

Fix various 64 bit related warnings

Mostly printf() format strings and signed-unsigned comparisons.
Fixes the x86_64 build.


# e94bffa072e285d4f77f39d6db510899fb6beda9 11-Nov-2013 Jérôme Duval <jerome.duval@gmail.com>

vm: allocate wrappers on the heap with small stack array fallback

see comments on #10169. Thanks Ingo for reviewing!


# 73ad2473e7874b3702cf5b0fdf4c81b747812ed9 05-Nov-2013 Pawel Dziepak <pdziepak@quarnos.org>

Remove remaining unnecessary 'volatile' qualifiers


# c8dd9f7780c426e592a3ccb231e6bfab51f15eb9 29-Oct-2013 Pawel Dziepak <pdziepak@quarnos.org>

kernel: Add thread_unblock() and use it where possible


# 29e65827fd93f67acbebcdbbe1f233b004a48e18 09-Oct-2013 Pawel Dziepak <pdziepak@quarnos.org>

kernel: Remove possibility to yield to all threads

Kernel support for yielding to all (including lower priority) threads
has been removed. POSIX sched_yield() remains unchanged.

If a thread really needs to yield to everyone it can reduce its priority
to the lowest possible and then yield (it will then need to manually
return to its prvious priority upon continuing).


# 34d0d4d85eeac542d5e9fb4a4f4d871e6727685f 17-Sep-2013 Ingo Weinhold <ingo_weinhold@gmx.de>

dump_page_queue(): fix output

* Determine the cache type per page instead of printing the first page's
cache type for all pages.
* Use vm_cache_type_to_string().


# 7bea0205edb5e824c9599360b8694fbb5d43bcc4 11-Jul-2013 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_allocate_page_run(): fix debug output


# 5ad12a800d5076cdbb62f86ebc1fb665d04c08dd 08-Nov-2012 Jerome Duval <jerome.duval@gmail.com>

vm_page_allocate_page_run: use a mask to enforce the boundary

* use a mask to enforce the boundary as suggested by Ingo. Thanks!


# 8ddec5b565ddd1ed108a39425f42df348b215c75 06-Nov-2012 Jerome Duval <jerome.duval@gmail.com>

vm_page_allocate_page_run: fix previous commit

* remove superfluous codes
* when aligning, sPhysicalPageOffset would be substracted twice
+alpha4

Signed-off-by: Ingo Weinhold <ingo_weinhold at gmx dot de>


# f5a14b17df1d1d13251f4d86a7ed024b516960ed 05-Nov-2012 Jérôme Duval <jerome.duval@gmail.com>

vm_page_allocate_page_run: fix for aligned page allocations

* don't enforce a zero boundary or a zero alignment
* when going to the next range, takes alignment into account.
It could previously just be enforced again through alignment and loop infinite.
* it should help with some FreeBSD based drivers


# 11d35d1b9b453cf95392b2ae8fa0941266e85d78 05-Jul-2012 Alex Smith <alex@alex-smith.me.uk>

Fixed tracing printf formats in VM code.


# 91102c544efd6df8a835eca0b3cdf6db728b2a33 11-Feb-2012 Fredrik Holmqvist <fredrik.holmqvist@gmail.com>

Logging calculations was done outside the #def TRACE_VM_PAGE, but never printed.

Now done inside #def as well as this triggered unused variables warnings.


# 4be4fc6b1faddbd037146214a0011d320842b4f3 15-Jun-2012 Alex Smith <alex@alex-smith.me.uk>

More 64-bit compilation/safety fixes.


# 4bbb27e3ccf0b1e38ee4a63ca9ec765e167a72bd 12-Feb-2012 Jerome Duval <jerome.duval@gmail.com>

More 'GCC4.6 variable set but not used' fixes.


# 35632c56afcf47b2afd692b6cc43a0ee138a0a02 16-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Fix harmless oversight marking pages with the wrong state.

While the log of hrev35726 says that unusable page ranges are supposed
to be marked with PAGE_STATE_UNUSED and allocated ones with
PAGE_STATE_WIRED, both actually marked with PAGE_STATE_UNUSED.


# 420007354254c22a5365beb5773a4713dd38713d 16-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Tiny optimization by skipping a no-op iteration.

We initialize the physicalPagesEnd from physical_memory_range[0] so
re-evaluating that range is a no-op.


# 3dbd9c1148a996711d415e6750ec71d4abdb13f2 16-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Fix the LIMIT_AVAILABLE_MEMORY debug option.

When limiting the available memory by reducing the page count it may not
be enough to just limit sNumPages. Depending on the physical memory map
non existing pages between ranges (sNonExistingPages) would still be
added up and later subtracted from the sNumPages, resulting in a wrong
max page count. Also due to the fixed removal of non existing page
ranges the actually available memory would usually not be the amount
set via LIMIT_AVAILABLE_MEMORY.

Instead we now calculate the available memory when going through the
physical memory ranges and limit/exit as soon as we've reached the
desired amount of available memory (also ignoring further non-existing
pages).


# c12f51264ba5a43bd1ba6408d96ee8b5da9e822f 14-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Ensure the sanity of the stats returned, make the TODO a Note.

* Ensure that we don't underflow the used_pages count and that used
+ cached pages don't overflow max_pages. As there is no locking the
values may change while we read them so that such situations could
arise.
* Make the TODO about the missing locking into a Note explaining the
above, as it is not really worth adding locking here. The stats are
only informational.


# 3733c51d38f667bc699635f3323bb5daeda1603d 13-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Fix the computation of used memory and add a TODO.

* The altered used pages calculation of hrev43168 wasn't correct, as
the inactive page queue may (validly) contain mapped pages as well.
Those would then get counted twice (as they are included in
gMappedPagesCount already).
Instead we calculate the used pages from the total page count, minus
everything we account for otherwise. Doing it this way is possible
without introducing any additional counters, as all the counts to
subtract are already present (as opposed to some of the ones that
would be needed for adding the counts up). Fixes #8109.
* Added TODO regarding the problem of not locking any of the counters
which runs the risk of them getting modified while we haven't yet read
all of them.


# 90c6930ebba06f6c9b220e712a53c063a542062a 04-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Add VM page allocation tracking similar to what happens in the slab already.
Introduces "page_allocation_infos" and "page_allocations_per_caller" KDL
commands.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43190 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6d41dfd95c978b9d34b0327edeafd9a55878f8e7 04-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Move some of the trace entries around so that we know the page(s) they concern
and add that info to the trace entries.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43187 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 865a0be1c022cdd7d155ecb3a44ca2769bce4f60 04-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Add optional stack traces to {Allocate|Free}Page[Run] tracing.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43185 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 448d8d6fcb91bfb659b83fc1f6501ba7485c86c2 04-Nov-2011 Michael Lotz <mmlr@mlotz.ch>

Indent cleanup only, no functional change.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43184 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 58ce0a2c124667daeb28a90ddb95e66d01bf82d5 03-Nov-2011 Rene Gollent <anevilyak@gmail.com>

When calculating the number of used pages for a get_system_info() request,
also include inactive pages. Fixes #7714.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43168 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d3fdd8b1800c07919c89f51781040895b397bfff 30-Oct-2011 Michael Lotz <mmlr@mlotz.ch>

Remove superflous test done a few lines above already.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@43014 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 24df65921befcd0ad0c5c7866118f922da61cb96 11-Jun-2011 Ingo Weinhold <ingo_weinhold@gmx.de>

Merged signals-merge branch into trunk with the following changes:
* Reorganized the kernel locking related to threads and teams.
* We now discriminate correctly between process and thread signals. Signal
handlers have been moved to teams. Fixes #5679.
* Implemented real-time signal support, including signal queuing, SA_SIGINFO
support, sigqueue(), sigwaitinfo(), sigtimedwait(), waitid(), and the addition
of the real-time signal range. Closes #1935 and #2695.
* Gave SIGBUS a separate signal number. Fixes #6704.
* Implemented <time.h> clock and timer support, and fixed/completed alarm() and
[set]itimer(). Closes #5682.
* Implemented support for thread cancellation. Closes #5686.
* Moved send_signal() from <signal.h> to <OS.h>. Fixes #7554.
* Lots over smaller more or less related changes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42116 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4535495d80c86e19e2610e7444a4fcefe3e0f8e6 10-Jan-2011 Ingo Weinhold <ingo_weinhold@gmx.de>

Merged the signals branch into trunk, with these changes:
* The team and thread kernel structures have been renamed to Team and Thread
respectively and moved into the new BKernel namespace.
* Several (kernel add-on) sources have been converted from C to C++ since
private kernel headers are included that are no longer C compatible.

Changes after merging:
* Fixed gcc 2 build (warnings mainly in the scary firewire bus manager).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40196 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c5e2c3ec4d94c6df1356a96f0bb9b848a6293fd6 08-Oct-2010 Axel Dörfler <axeld@pinc-software.de>

* Fixed a bug that would cause allocate_page_run() to be called with an out of
bounds index - the system would overwrite memory then and eventually KDL.
This could best be reproduced with overlays after a while.
* Added a TODO comment that explains why free_cached_pages() might fail even
though the page is actually free now.
* Added an explanation of how the sFreePageQueuesLock is to be used, thanks to
Ingo for explaining it to me in the first place :-)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38895 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5cdadcae91a29bb05088b8c0c5d1dc6e5497e853 22-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

page_writer(): Fixed the pagesSinceLastSuccessfulWrite computation. Only the
skipped pages were added, not the failed ones.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37682 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2ab433ba903ec0c8fdf99d7cbf3c2bd4e37848b4 22-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* PageWriteWrapper::Done(): Returns whether the page was successfully written,
now.
* PageWriterRun::Go(): Returns the number of pages that could not be written.
* page_writer()/next_modified_page():
- Don't use a marker page anymore. A visited page is requeued at the tail.
This also makes the functions that schedule pages work a bit better (they
queue the pages at the head of the queue).
- Have an eye on pages that are busy or failed to write. If we ran through
the whole modified queue without writing a single page, sleep for a short
time. This mitigates the busyness the page writer falls into when there
are enough modified pages to make it run all the time but none that can be
written successfully.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37681 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2fd209cf00675b2c80af91bf969a930474496430 13-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

page_writer(): Added TODO about potential deadlock in case of loop file
systems/devices.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37502 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b9447668707741085389f650383b018d33d7d0bf 10-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved the vm_page initialization from vm_page.cpp:vm_page_init() to the new
vm_page::Init().
* Made vm_page::wired_count private and added accessor methods.
* Added VMCache::fWiredPagesCount (the number of wired pages the cache
contains) and accessor methods.
* Made more use of vm_page::IsMapped().
* vm_copy_on_write_area(): Added vm_page_reservation* parameter that can be
used to request a special handling for wired pages. If given the wired pages
are replaced by copies and the original pages are moved to the upper cache.
* vm_copy_area():
- We don't need to do any wired ranges handling, if the source area is a
B_SHARED_AREA, since we don't touch the area's mappings in this case.
- We no longer wait for wired ranges of the concerned areas to disappear.
Instead we use the new vm_copy_on_write_area() feature and just let it
copy the wired pages. This fixes #6288, an issue introduced with the use
of user mutexes in libroot: When executing multiple concurrent fork()s all
but the first one would wait on the fork mutex, which (being a user mutex)
would wire a page that the vm_copy_area() of the first fork() would wait
for.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37460 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 59c754571e8afcc2ef9258e87154b3fd4817e941 06-Jul-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed warnings with TRACE_VM_PAGE enabled.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37411 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b46540452ad12ce44385386b3f0aadf89824e8fc 23-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Added vm_page_max_address() which returns the greatest address of accessible
physical memory.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37230 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2a2b528e735ed1cba2c8e8604f13265fa563017c 19-Jun-2010 Wim van der Meer <wpjvandermeer@gmail.com>

Report ignored memory pages seperately, thanks to bonefish for the patch review. Closes ticket #6178

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37175 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a8ad734f1c698917badb15e1641e0f38b3e9a013 14-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Introduced structures {virtual,physical}_address_restrictions, which specify
restrictions for virtual/physical addresses.
* vm_page_allocate_page_run():
- Fixed conversion of base/limit to array indexes. sPhysicalPageOffset was not
taken into account.
- Takes a physical_address_restrictions instead of base/limit and also
supports alignment and boundary restrictions, now.
* map_backing_store(), VM[User,Kernel]AddressSpace::InsertArea()/
ReserveAddressRange() take a virtual_address_restrictions parameter, now. They
also support an alignment independent from the range size.
* create_area_etc(), vm_create_anonymous_area(): Take
{virtual,physical}_address_restrictions parameters, now.
* Removed no longer needed B_PHYSICAL_BASE_ADDRESS.
* DMAResources:
- Fixed potential overflows of uint32 when initializing from device node
attributes.
- Fixed bounce buffer creation TODOs: By using create_area_etc() with the
new restrictions parameters we can directly support physical high address,
boundary, and alignment.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37131 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8a8043dce6ae9bcfa6eb9cc2e32af5008b3db6ad 13-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_get_stats(): Forgot to added sIgnoredPages to system_info::max_pages
in r37117 as well, which was really the main point of introducing it.
Improves #6124 (reported memory lower than installed).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37127 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 03732070d72fe79e147705324a645570c219df89 12-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* vm_page_init_num_pages(): Sum up the number of pages between the usable
physical memory ranges.
* vm_page_num_pages(), vm_page_get_stats(): Report the actually existing
memory, count memory ignored by the boot loader as used.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37117 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1d26c7248fcd916adadc03b5fd59cfc4f2adfaa5 10-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_allocate_page_run(): Added parameter "limit", specifying the upper
physical address limit for the page run to allocate.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37086 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2ea7b17cf341036024bd84c4f791f332b2e15e48 09-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* vm_allocate_early(): Replace "bool blockAlign" parameter by a more flexible
"addr_t aligmnent".
* X86PagingMethod32Bit::PhysicalPageSlotPool::InitInitial(),
generic_vm_physical_page_mapper_init(): Use vm_allocate_early()'s alignment
feature instead of aligning by hand.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37070 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1d578e15fe5b5c3ff62866ae81aef529d00d7762 02-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed more address types related issues. Mostly printf() or comparison
warnings, but also some oversights from earlier changes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37000 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 435c43f5912b109e7d5cf682865d2061e62fad8c 02-Jun-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Introduced type generic_io_vec, which is similar to iovec, but uses types
that are wide enough for both virtual and physical addresses.
* DMABuffer, IORequest, IOScheduler,... and code using them: Use
generic_io_vec and generic_{addr,size}_t where necessary.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36997 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 147133b76cbb1603bdbff295505f5b830cb4e688 25-May-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* First run through the kernel's private parts to use phys_{addr,size}_t
where appropriate.
* Typedef'ed page_num_t to phys_addr_t and used it in more places in
vm_page.{h,cpp}.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36937 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8ccc58ffa9fe04ced51471c0a1fabbd4616cd2d3 10-May-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Missing line breaks in dprintf().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36785 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 83bc49d051ab7b13365f9865ae57d337313101a2 06-May-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_requeue(): Disabled DEBUG_PAGE_ACCESS_CHECK(). Since r36155
idle_scan_active_pages() cannot satisfy this assertion anymore. Added TODO
for a better fix which can wait until after the release.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36649 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3735d4e299adca4b864ab31f702276ed9c0c6dea 05-May-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

mark_page_range_in_use(): When the given range lies partially outside the
array at least work with the part intersecting with the array. Log those
quasi error cases.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36633 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d3166e469cd337a6910f1cb1515b74f73d36466f 29-Apr-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Replaced no longer necessary send_signal_etc() work-arounds for
resume_thread().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36531 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b1e06d23ce666c6efe13918cdb9530c854f47724 26-Apr-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* The "page_stats" command does now also print the longest contiguous runs of
free respective free and cached pages.
* Removed the unused vm_page_allocate_page_run_no_base().
* vm_page_allocate_page_run() (and allocate_page_run()):
- Use vm_page_reserve_pages() instead of vm_page_try_reserve_pages(), i.e.
wait until the reservation succeeds.
- Now we iterates two times through the pages to find a suitable page run. In
the first iteration it only looks for free/clear pages, in the second
iteration it also considers cached pages. This increases the chance of the
function to succeed, when a lot of caching is going on.
This reduces the amount of memory required to use the IOCache when booting
off the anyboot Live CD to around 160 MB in qemu. It also seems to work with
128 MB, but the syslog indicates that some memory allocations fail, which
is not exactly inspiring confidence.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36489 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 713bede839c70f875bbb0ed1b8357da7f47727e5 11-Apr-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

full_scan_inactive_pages(): Don't call DEBUG_PAGE_ACCESS_START() before
checking whether the page is busy.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36155 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d80af65fd8482496750e9120bf2c902e6f70e6df 18-Mar-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

The "page" and the "cache" kernel debugger commands set a few temporary
variables, now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35903 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d40a9355605dff41924273711f9dc9df6da496d2 02-Mar-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Boot loader (x86 mmu.cpp):
* Made the page table allocation more flexible. Got rid of sMaxVirtualAddress
and added new virtual_end address to the architecture specific kernel args.
* Increased the virtual space we reserve for the kernel to 16 MB. That
should suffice for quite a while. The previous 2 MB were too tight when
building the kernel with debug info.
* mmu_init(): The way we were translating the BIOS' extended memory map to
our physical ranges arrays was broken. Small gaps between usable memory
ranges would be ignored and instead marked allocated. This worked fine for
the boot loader and during the early kernel initialization, but after the
VM has been fully set up it frees all physical ranges that have not been
claimed otherwise. So those ranges could be entered into the free pages
list and would be used later. This could possibly cause all kinds of weird
problems, probably including ACPI issues. Now we add only the actually
usable ranges to our list.

Kernel:
* vm_page_init(): The pages of the ranges between the usable physical memory
ranges are now marked PAGE_STATE_UNUSED, the allocated ranges
PAGE_STATE_WIRED.
* unmap_and_free_physical_pages(): Don't free pages marked as unused.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35726 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 24244d3cebfbbd7994d947012f90501a4d1e7a9f 20-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

idle_scan_active_pages(): vm_page_requeue() requires the caller to mark the
page accessed for the access debugging feature.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35542 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4a1f66838359f73a97fcda6e8228e723ceb5976d 20-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Also print the page for the page related asserts.
* Used vm_page::IsMapped() to simplify things.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35541 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3e5343f226e21d808e04617e230462ffbeec1503 20-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

free_cached_page(): Removed incorrect asserts. The same ones appear a few
lines later anyway, after the cache has been locked and it has been verified
that the page is still a candidate. Fixes #5432.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35539 a95241bf-73f2-0310-859d-f6bbb57e9c96


# bd7645a12ab594d5eb1c6d6a70c3a82a429410dd 20-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Made vm_page::state private and added accessor methods.
* Added kernel tracing for page state transitions.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35538 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 477fd1be55df309fcefd0a39605e7f83c5210aef 19-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Added assert in free_page().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35533 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 694907604935fa290a62897c015ab1eba4579b15 16-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added some more asserts for cached pages.
* full_scan_inactive_pages(): Fixed syntactical glitch (missing "else").
Affected only the active paging mode and was relatively harmless. The worst
case would be that an inactive page would be moved to the cached queue
although its usage_count hadn't dropped to 0 yet, thus freeing it before
pages that deserved it more.
* move_page_to_active_or_inactive_queue():
- Was ignoring the page's modified flag, thus potentially moving a modified
page to the cached queue. That could happen only in rare cases though,
like when the page was still mmap()ped while being written and modified and
unmapped before being done.
- No longer move the page to the inactive queue, even if its usage count is 0.
In idle mode the page daemon doesn't look at inactive pages, so the page's
stats wouldn't be updated anymore.
- Renamed to move_page_to_appropriate_queue().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35499 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 22fb471ff06f0a7f671d95529d837d344c1418b3 15-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* page_writer(): Missing continue in the temporary skipping case.
* vm_page_write_modified_page_range(): Need to DEBUG_PAGE_ACCESS_END() a bit
later.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35487 a95241bf-73f2-0310-859d-f6bbb57e9c96


# fa47a7c43416859e3d4454a4317d33cf3ed8e3df 15-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

page_writer():
* Use the same criterion when to write back temporary pages as the page daemon.
* Move wired and temporary pages that shall not be written back to the active or
inactive queue so they don't get stuck in the modified queue and potentially
cause the page writer to run permanently without actually making progress
(#5382).

page writing implementation:
* If writing back a temporary page failed, move it back to the inactive or
active queue, so it doesn't get stuck in the modified queue. If active paging
continues, it might find its way back to the modified queue in the next
iteration, but that improves the situation a bit at least. Particularly with
the port heap pages not really being swappable ATM.
* Never dequeue pages from the modified queue. We mark them busy, so the page
writer will skip them anyway. This allows others to play with the page to some
extend (at least allowing to move it between the queues). This fixes #5404.
* Removed PageWriteWrapper::ClearModifiedFlag(). We clear the modified flag in
PageWriteWrapper::SetTo(), now, so that the page writer doesn't need to do
that explicitly either.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35485 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b0f5b17072757dcfbc17ff09cdaa04df152a2127 15-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Removed PageWriteWrapper::CheckRemoveFromShrunkenCache() and moved removing
the page to Done().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35474 a95241bf-73f2-0310-859d-f6bbb57e9c96


# dc6a6a9b421e178c3c74da5c9847c55e6feab1e9 03-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Reenabled interrupts before notifying the page writer.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35399 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d8141a0e2a1a8e417ba78623f345caa22f1a94e6 03-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Removed the commented out scanning of the inactive queue when no paging is
going on. I only wanted to have it in the repository in case we decide at a
later point that it is a good idea after all.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35395 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 40bb94819e6c39d72ab29edc1a0dcd80b15b8b42 03-Feb-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Removed useless return parameter from vm_remove_all_page_mappings().
* Added vm_clear_page_mapping_accessed_flags() and
vm_remove_all_page_mappings_if_unaccessed(), which combine the functionality
of vm_test_map_activation(), vm_clear_map_flags(), and
vm_remove_all_page_mappings(), thus saving lots of calls to translation map
methods. The backend is the new method
VMTranslationMap::ClearAccessedAndModified().
* Started to make use of the cached page queue and changed the meaning of the
other non-free queues slightly:
- Active queue: Contains mapped pages that have been used recently.
- Inactive queue: Contains mapped pages that have not been used recently. Also
contains unmapped temporary pages.
- Modified queue: Contains unmapped modified pages.
- Cached queue: Contains unmapped unmodified pages (LRU sorted).
Unless we're actually low on memory and actively do paging, modified and
cached queues only contain non-temporary pages. Cached pages are considered
quasi free. They still belong to a cache, but since they are unmodified and
unmapped, they can be freed immediately. And this is what
vm_page_[try_]reserve_pages() do now when there are no more actually free
pages at hand. Essentially this means that pages storing cached file data,
unless mmap()ped, no longer are considered used and don't contribute to page
pressure. Paging will not happen as long there are enough free + cached pages
available.
* Reimplemented the page daemon. It no longer scans all pages, but instead works
the page queues. As long as the free pages situation is harmless, it only
iterates through the active queue and deactivates pages that have not been
used recently. When paging occurs it additionally scans the inactive queue and
frees pages that have not been used recently.
* Changed the page reservation/allocation interface:
vm_page_[try_]reserve_pages(), vm_page_unreserve_pages(), and
vm_page_allocate_page() now take a vm_page_reservation structure pointer.
The reservation functions initialize the structure -- currently consisting
only of a count member for the number of still reserved pages.
vm_page_allocate_page() decrements the count and vm_page_unreserve_pages()
unreserves the remaining pages (if any). Advantages are that reservation/
unreservation mismatches cannot occur anymore, that vm_page_allocate_page()
can verify that the caller has indeed a reserved page left, and that there's
no unnecessary pressure on the free page pool anymore. The only disadvantage
is that the vm_page_reservation object needs to be passed around a bit.
* Reworked the page reservation implementation:
- Got rid of sSystemReservedPages and sPageDeficit. Instead
sUnreservedFreePages now actually contains the number of free pages that
have not yet been reserved (it cannot become negative anymore) and the new
sUnsatisfiedPageReservations contains the number of pages that are still
needed for reservation.
- Threads waiting for reservations do now add themselves to a waiter queue,
which is ordered by descending priority (VM priority and thread priority).
High priority waiters are served first when pages become available.
Fixes #5328.
* cache_prefetch_vnode(): Would reserve one less page than allocated later, if
the size wasn't page aligned.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35393 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e65c400299386f99a251395ff2e59572705d7e49 29-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Replaced the vm_page_allocate_page*() "pageState" parameter by a more
general "flags" parameter. It encodes the target state of the page -- so
that the page isn't unnecessarily put in the wrong page queue first -- a
flag whether the page should be cleared, and one to indicate whether the
page should be marked busy.
* Added page state PAGE_STATE_CACHED. Not used yet.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35333 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 72382fa6291e810be2949a70abd8f274f92dbd2c 29-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Removed the page state PAGE_STATE_BUSY and instead introduced a vm_page::busy
flag. The obvious advantage is that one can still see what state a page is in
and even move it between states while being marked busy.
* Removed the vm_page::is_dummy flag. Instead we mark marker pages busy, which
in all cases has the same effect. Introduced a vm_page_is_dummy() that can
still check whether a given page is a dummy page.
* vm_page_unreserve_pages(): Before adding to the system reserve make sure
sUnreservedFreePages is non-negative. Otherwise we'd make nonexisting pages
available for allocation. steal_pages() still has the same problem and it
can't be solved that easily.
* map_page(): No longer changes the page state/mark the page unbusy. That's the
caller's responsibility.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35331 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d18eaf4c5326b0a5e2a50f54bfe700a9ff1a32c2 27-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Improved the clarity of some loops in the page reservation functions. No
functional change (other than avoiding no-ops like subtracting 0).
* vm_page_try_reserve_pages(): Moved the kernel tracing calls from the top of
the function to the points where the reservation already succeeded.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35322 a95241bf-73f2-0310-859d-f6bbb57e9c96


# deee8524b7534d9b586cbcbf366d0660c9769a8e 26-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Introduced {malloc,memalign,free}_etc() which take an additional "flags"
argument. They replace the previous special-purpose allocation functions
(malloc_nogrow(), vip_io_request_malloc()).
* Moved the I/O VIP heap to heap.cpp accordingly.
* Added quite a bit of passing around of allocation flags in the VM,
particularly in the VM*AddressSpace classes.
* Fixed IOBuffer::GetNextVirtualVec(): It was ignoring the VIP flag and always
allocated on the normal heap.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35316 a95241bf-73f2-0310-859d-f6bbb57e9c96


# cff6e9e406132a76bfc20cb35ff5228dd0ba94d8 26-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* The system now holds back a small reserve of committable memory and pages. The
memory and page reservation functions have a new "priority" parameter that
indicates how deep the function may tap into that reserve. The currently
existing priority levels are "user", "system", and "VIP". The idea is that
user programs should never be able to cause a state that gets the kernel into
trouble due to heavy battling for memory. The "VIP" level (not really used
yet) is intended for allocations that are required to free memory eventually
(in the page writer). More levels are thinkable in the future, like "user real
time" or "user system server".
* Added "priority" parameters to several VMCache methods.
* Replaced the map_backing_store() "unmapAddressRange" parameter by a "flags"
parameter.
* Added area creation flag CREATE_AREA_PRIORITY_VIP and slab allocator flag
CACHE_PRIORITY_VIP indicating the importance of the request.
* Changed most code to pass the right priorities/flags.

These changes already significantly improve the behavior in low memory
situations. I've tested a bit with 64 MB (virtual) RAM and, while not
particularly fast and responsive, the system remains at least usable under high
memory pressure.
As a side effect the slab allocator can now be used as general memory allocator.
Not done by default yet, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35295 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 86c794e5c10f1b2d99d672d424a8637639c703dd 21-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

slab allocator:
* Implemented a more elaborated raw memory allocation backend (MemoryManager).
We allocate 8 MB areas whose pages we allocate and map when needed. An area is
divided into equally-sized chunks which form the basic units of allocation. We
have areas with three possible chunk sizes (small, medium, large), which is
basically what the ObjectCache implementations were using anyway.
* Added "uint32 flags" parameter to several of the slab allocator's object
cache and object depot functions. E.g. object_depot_store() potentially wants
to allocate memory for a magazine. But also in pure freeing functions it
might eventually become useful to have those flags, since they could end up
deleting an area, which might not be allowable in all situations. We should
introduce specific flags to indicate that.
* Reworked the block allocator. Since the MemoryManager allocates block-aligned
areas, maintains a hash table for lookup, and maps chunks to object caches,
we can quickly find out which object cache a to be freed allocation belongs
to and thus don't need the boundary tags anymore.
* Reworked the slab boot strap process. We allocate from the initial area only
when really necessary, i.e. when the object cache for the respective
allocation size has not been created yet. A single page is thus sufficient.

other:
* vm_allocate_early(): Added boolean "blockAlign" parameter. If true, the
semantics is the same as for B_ANY_KERNEL_BLOCK_ADDRESS.
* Use an object cache for page mappings. This significantly reduces the
contention on the heap bin locks.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35232 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6379e53e2dd7021ba0e35d41c276dfe94c079596 19-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page no longer points directly to its containing cache, but rather to a
VMCacheRef object which points to the cache. This allows to optimize
VMCache::MoveAllPages(), since it no longer needs to iterate over all pages
to adjust their cache pointer. It can simple swap the cache refs of the two
caches instead.

Reduces the total -j8 Haiku image build time only marginally. The kernel time
drops almost 10%, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35155 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f082f7f019941732f1d2b99f627fbeeeec3746af 15-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added vm_page::accessed flag. Works analogously to vm_page::modified.
* Reorganized the code for [un]mapping pages:
- Added new VMTranslationMap::Unmap{Area,Page[s]}() which essentially do what
vm_unmap_page[s]() did before, just in the architecture specific code, which
allows for specific optimizations. UnmapArea() is for the special case that
the complete area is unmapped. Particularly in case the address space is
deleted, some work can be saved. Several TODOs could be slain.
- Since they are only used within vm.cpp vm_map_page() and vm_unmap_page[s]()
are now static and have lost their prefix (and the "preserveModified"
parameter).
* Added VMTranslationMap::Protect{Page,Area}(). They are just inline wrappers
for Protect().
* X86VMTranslationMap::Protect(): Make sure not to accidentally clear the
accessed/dirty flags.
* X86VMTranslationMap::Unmap()/Protect(): Make page table skipping actually
work. It was only skipping to the next page.
* Adjusted the PPC code to at least compile.

No measurable effect for the -j8 Haiku image build time, though the kernel time
drops minimally.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35089 a95241bf-73f2-0310-859d-f6bbb57e9c96


# bcc2c157a1c54f5169de1e7a3e32c49e92bbe0aa 13-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Refactored vm_translation_map:
* Pulled the physical page mapping functions out of vm_translation_map into
a new interface VMPhysicalPageMapper.
* Renamed vm_translation_map to VMTranslationMap and made it a proper C++
class. The functions in the operations vector have become methods.
* Added class GenericVMPhysicalPageMapper implementing VMPhysicalPageMapper
as far as possible (without actually writing new code).
* Adjusted the x86 and the PPC specifics accordingly (untested for the
latter). For the other architectures the build is, I'm afraid, seriously
broken.

The next steps will modify and extend the VMTranslationMap interface, so that
it will be possible to fix the bugs in vm_unmap_page[s]() and employ
architecture specific optimizations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35066 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 829f3028369d9e3178e0dfc3c0653d12724949fe 11-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Introduced vm_page::modified flag, which is used by vm_unmap_page[s]() to
preserve the dirty flag of the mapping without having to potentially move the
page to the modified queue. This lifts the (ignored) requirement that the
pages to be unmapped must not be busy.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35023 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9c6720c064f91dee20daed59dd87026639e7d3bb 11-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed two instances of debug code I missed to adjust in r35004. Fixes #5242.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35020 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 451ca8b4b43e650a8c6cd7edd7f59640ebfee7f9 11-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

PAGE_TYPE_GUARD was unused and for the other two types a simple one bit flag
suffices. Therefore replaced vm_page::type by vm_page::is_dummy.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35013 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d7455de2f603518cf6470bbca9aa19fe5a41c4ca 11-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

allocate_page_run(): Use temporary lists to store the pages we're allocating.
This makes appending the pages to the active queue more efficient and we
don't need the vm_page::is_cleared bit anymore.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35011 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7372a88af4f3840ed98db5cf9c5cc54df6f55543 10-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Replaced the page queue mutexes by spinlocks. The critical sections are very
short and quite hot, so mutexes just cause more overhead due to frequent
rescheduling than waiting for the spinlocks does. The free and clear queues
are additionally protected by a R/W lock, which is mostly read-locked, save
for rare cases like allocating page runs.

The total -j8 Haiku image build speedup is marginal. The kernel time drops
about 8%, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35004 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5e0aacb9f8a032433dbbd0fa59478b5514c7fafe 09-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

vm_page_schedule_write_page_range(): The debug code was a bit too possessive.
We can only access the page, if it is not busy. Fixes #5228.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34980 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 4aedc0670142dcc9d3aab8d0f18c7f03ac490b1e 09-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

"page" debugger command:
* Various smaller fixes.
* Used add_debugger_command_etc() and added more verbose usage message.
* Added option "-m" which iterates through all address spaces and finds out
which virtual pages are mapped to the page.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34979 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5bcbe8b2a0ae70aeeab02cff2e93f9295703ef17 09-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

"find_page" didn't search the inactive queue.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34972 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2a30aab6f46a414a481dbc59d113e1f7bf2b3d48 08-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Don't announce page access before being sure that the page isn't busy. Fixes
the erroneously trigger panic() in #5216.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34958 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3cd2094396dde9ca42263c535041a95d5f0d5fff 06-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added new debug feature (DEBUG_PAGE_ACCESS) to detect invalid concurrent
access to a vm_page. It is basically an atomically accessed thread ID field
in the vm_page structure, which is explicitly set by macros marking the
critical sections. As a first positive effect I had to review quite a bit of
code and found several issues.
* Added several TODOs and comments. Some harmless ones, but also a few
troublesome ones in vm.cpp regarding page unmapping.
* file_cache: PrecacheIO::Prepare()/read_into_cache: Removed superfluous
vm_page_allocate_page() return value checks. It cannot fail anymore.
* Removed the heavily contended "pages" lock. We use different policies now:
- sModifiedTemporaryPages is accessed atomically.
- sPageDeficitLock and sFreePageCondition are protected by a new mutex.
- The page queues have individual locks (mutexes).
- Renamed set_page_state_nolock() to set_page_state(). Unless the caller says
otherwise, it does now lock the affected pages queues itself. Also changed
the return value to void -- we panic() anyway.
* set_page_state(): Add free/clear pages to the beginning of their respective
queues as this is more cache-friendly.
* Pages with the states PAGE_STATE_WIRED or PAGE_STATE_UNUSED are no longer
in any queue. They were in the "active" queue, but there's no good reason
to have them there. In case we decide to let the page daemon work the queues
(like FreeBSD) they would just be in the way.
* Pulled the common part of vm_page_allocate_page_run[_no_base]() into a helper
function. Also fixed a bug I introduced previously: The functions must not
vm_page_unreserve_pages() on success, since they remove the pages from the
free/clear queue without decrementing sUnreservedFreePages.
* vm_page_set_state(): Changed return type to void. The function cannot really
fail and no-one was checking it anyway.
* vm_page_free(), vm_page_set_state(): Added assertion: The page must not be
free/clear before. This is implied by the policy that no-one is allowed to
access free/clear pages without holding the respective queue's lock, which is
not the case at this point. This found the bug fixed in r34912.
* vm_page_requeue(): Added general assertions. panic() when requeuing of
free/clear pages is requested. Same reason as above.
* vm_clone_area(), B_FULL_LOCK case: Don't map busy pages. The implementation is
still not correct, though.

My usual -j8 Haiku build test runs another 10% faster, now. The total kernel
time drops about 18%. As hoped the new locks have only a fraction of the old
"pages" lock contention. Other locks lead the "most wanted list" now.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34933 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 88675a7eb21fdf0d3d6bf4baad7e15c0c8f76219 04-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

steal_pages(): Recheck sUnreservedFreePages after incrementing sPageDeficit.
Since the former is no longer guarded by any lock, there's a race condition
with vm_page_unreserve_pages() which would cause us to wait longer than
necessary.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34898 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 37caa95564bcae0d9a05b5a694d4759080afb25b 04-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Replaced the sReservedPages counter tracking the page reservations by
sUnreservedFreePages which tracks the difference between free/clear and
reserved pages. Access to it uses atomic operations which allows the three
page (un)reservation to avoid locking in most cases, thus reducing contention
of the "pages" lock.

In the -j8 Haiku image build that decreases the contention of the "pages"
lock to about one third of the previous value. As a positive side effect the
VMCache lock contention drops about the same factor. The total build speedup
is about 20%, the total kernel time drops about 20%.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34888 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1e175b599bf595150e70bb49437bc114cbbb0afe 03-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

Removed duplicate condition.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34886 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5800e8a486993399f7f68be67099dc64bdb8a4be 03-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved the page management functionality into its own file.
* Renamed page_queue to VMPageQueue and made it a proper C++ class. Use
DoublyLinkedList instead of own list code.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34874 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1021fd28262697dbbbe1d54a868f0672900c78f3 01-Jan-2010 Ingo Weinhold <ingo_weinhold@gmx.de>

* agp_gart(): Use vm_page_[un]reserve_pages().
* Removed unused vm_page_allocate_pages().
* Removed now unused (always true) "reserved" parameter from
vm_page_allocate_page().
* Removed unused (always false) "stealActive" parameter from steal_page().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34836 a95241bf-73f2-0310-859d-f6bbb57e9c96


# eb8dc1ebfbe911a6af06efe02d003aa37687faad 27-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* 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


# 522c2f19d458245474fcaf5b0254e0099906b117 07-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added a simple mechanism to wait for events to VMCache. WaitForPageEvents()
waits for certain events on a given page, NotifyPageEvents() wakes up
waiting threads respectively.
* Used the new feature instead of condition variables for waiting on busy
pages. We save publishing and unpublishing of a condition variable whenever
a page is marked busy. There's only something to do, if there's at least
one thread waiting in the list of the respective cache. The general
assumption is that this is only rarely the case and even if it happens,
there should be only very few threads.
* Added an apparently missing notification in cache_io(). At least I didn't
see the reason for it not being there.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34537 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f34a1dd5d701373687b6f3f0e6e76bd2b1ae6007 02-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

Created VMArea.{h,cpp} and moved VMArea and the global area hash table (new
class VMAreaHash) there.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34450 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e50cf8765be50a7454c9488db38b638cf90805af 02-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved the VM headers into subdirectory vm/.
* Renamed vm_cache.h/vm_address_space.h to VMCache.h/VMAddressSpace.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34449 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 90d870c1556bdc415c7f41de5474ebebb0ceebdd 02-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved VMAddressSpace definition to vm_address_space.h.
* "Classified" VMAddressSpace, i.e. turned the vm_address_space_*() functions
into methods, made all attributes (but "areas") private, and added
accessors.
* Also turned the vm.cpp functions vm_area_lookup() and
remove_area_from_address_space() into VMAddressSpace methods. The rest of
the area management functionality will follow soon.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34447 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a477e3cf200097774f88ed4e4134f87674a2a063 01-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

Finished renaming of vm_cache to VMCache.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34424 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b0db552cd921ff16d61400ee5a5f855f392e8b87 01-Dec-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

Renamed vm_address_space to VMAddressSpace.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34422 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7d6c7206c16a4b9b0257d90cc3a39c4e1ba198f0 28-Oct-2009 Axel Dörfler <axeld@pinc-software.de>

* There is no need for the sPageLock to be a spinlock - a mutex should do. This
should improve the kernel latencies, as things like
vm_page_allocate_page_run() is very expensive.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33807 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7ebd7cfc40a91ce308a3c7d82368865a97a75861 11-Oct-2009 Michael Lotz <mmlr@mlotz.ch>

Add a vm_page_allocate_page_run_no_base. It bases its search on the pages found
in the free and/or clear queue. This performs better in the case where only few
pages are free/clear but performs worse in the case where there are a lot of
usable pages. It's not used anywhere but it might come in handy one time.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33527 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7a4d60459edc51749fe39ac8f142f34c1a55f6b1 11-Oct-2009 Michael Lotz <mmlr@mlotz.ch>

Implement combining scattered physical pages using seperate iovecs in
PageWriteTransfer. This makes the transfer accept virtually contiguous pages,
where the offset is contiguous on either end of the current transfer, but where
the pages aren't physically contiguous. It will then add seperate iovecs for
these pages (32 at max right now). This reduces the number of IO requests
generated and allows for optimizations down the IO path (like in the physical to
virtual mapping case for example).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33526 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1af7d115046ccc76641973fe434ed5760e6fdd20 10-Oct-2009 Michael Lotz <mmlr@mlotz.ch>

* Rework page writing to combine page writes where possible. For now the pages
are required to be physically contiguos, which should be reworked to put them
into seperate iovecs. Still this manages to combine a great deal of page
writes into larger bursts already. Reduces the amount of IO requests being
scheduled (and greatly benefits media where page wise writes are slow when
they are accessed through a non-IOScheduler path, i.e. USB mass storage until
that is properly implemented).
* Abstracted per page page writing tasks into a PageWriteWrapper class.
* Abstracted per transfer page writing tasks into PageWriteTransfer class which
formerly was the PageWriterCallback.
* Use both classes from the PageWriterRun and from
vm_page_write_modified_page_range to remove code duplication.
* Adjusted synchronous VMAnonymousCache::Write() to cope correctly with larger
iovecs and more than one iovec. It assumed that there was exactly one page per
vector previously.
* Introduced MaxPagesPerWrite() and MaxPagesPerAsyncWrite() to VMCache to allow
a cache to specify restricitions. VMAnonymousCache does restrict the max pages
to 1 for WriteAsync right now as I didn't feel like reworking that one to cope
with non single page writes just yet.
* Pulled out PageWriteTransfer methods for better readability.
* Some typo fixes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33507 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 257f000bd25b76c2f86624197958efa2bde499a6 06-Sep-2009 Michael Lotz <mmlr@mlotz.ch>

* When reserving pages and there aren't yet enough free pages, only steal as
many pages as are actually missing, not the full count.
* Take into account that free_page_queue_count() can be less than sReservedPages
(when some of the reserved pages have been allocated already) in
vm_page_num_unused_pages(). Before it could return negative and therefore
wrapped numbers.
* Simplify the page scrubber loop by continuing early. Also avoids a needless
interrupt spin lock acquisition when there's nothing to do.
* Some minor coding style cleanup.
* Fix a typo.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32980 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a866fa94667cd2f1432ee61194eeab36a7883e8a 02-May-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

panic() when a page that is still mapped is freed.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30606 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2d8073a9dc84ecdf5106afaf98996e0ed12f4a72 30-Apr-2009 Axel Dörfler <axeld@pinc-software.de>

* Added a TODO about a problematic use of vm_page_allocate_page() in combination
with vm_cache_acquire_locked_page_cache().
* Added new function vm_page_num_unused_pages() which returns the pages that are
actually completely free and unused.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30514 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 65d2b8a8e9fefd59eb270d7c0030ebe85b75d553 20-Apr-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Introduces VMCache::CanWritePage() returning whether the given cache can
theoretically write the given page.
* page writer: Fixed the incorrect check whether a temporary page can be
written by using the new CanWritePage().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30281 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3539fc6e191942dbc454cec7155c5a2540d9455c 17-Apr-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

page writer:
* When writing a page failed it is not a good idea to re-enqueue it at the tail
of the modified queue, since that is definitely behind the page writer's
marker and the page would be picked up again before reaching the end of the
queue. If that happened with more than 256 pages, the page writer would keep
picking up only those non-writable pages and make no more progress.
* When selecting pages also skip temporary pages, if there's no more swap space
available, since trying to write those pages would most likely fail anyway
(triggering the first problem).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30230 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8c91d29b34dcd98f5fc6c64848fc5651659088f2 07-Apr-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* PageWriterRun::Go(), vm_page_write_modified_page_range(): When writing the
page failed since the cache has been shrunk, we need not only remove the
page from the cache, we also need to remove all of its area mappings and
free it. Not removing the area mappings might have been the cause of #3110,
not freeing it would cause it to be leaked for good.
* vm_page_write_modified_page_range(): When writing failed for another reason
and the page wasn't in the modified queue before, we would lose the info
in which queue it was before and setting the page state to modified would
assume the active queue. This could potentially screw up our page queue
structures.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29992 a95241bf-73f2-0310-859d-f6bbb57e9c96


# aa4ba93e25c1c63730ba69e04d3d96c3253924fd 08-Mar-2009 Ingo Weinhold <ingo_weinhold@gmx.de>

* Renamed src/system/kernel/device_manager/io_requests.{h,cpp} to
IORequest.{h,cpp}.
* Introduced public <io_requests.h> header. Currently it only declares the
single function BFS uses.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29446 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c33667d400856680a8e0122300861eda77d1847a 01-Feb-2009 Michael Lotz <mmlr@mlotz.ch>

Fixing warnings under GCC4 in preparation to enable -Werror there as well:
* Replaced the use of offsetof() for structs that aren't PODs. Add a
offset_of_member() macro to util/khash.h because that's what it's used for
in our cases.
* Change the signature of add_debugger_command()/remove_debugger_command() on
GCC > 2 to avoid the depricated conversion from string constants to char *.
* Adding some "suggested" parenthesis. I know that not everyone likes that, but
it pointed out at least one bug that is fixed here as well.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29113 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 59dbd26f5f41a6c1272f6cac9c8cda4b19b79097 20-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved more debug macros to kernel_debug_config.h.
* Turned the checks for all those macros to "#if"s instead of "#ifdef"s.
* Introduced macro KDEBUG_LEVEL which serves as a master setting.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28248 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 47c40a10a10dc615e078754503f2c19b9f98c38d 19-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Prefixed memset_physical() and memcpy_to_physical() with "vm_",
added vm_memcpy_from_physical() and vm_memcpy_physical_page(), and
added respective functions to the vm_translation_map operations. The
architecture specific implementation can now decide how to implement
them most efficiently. Added generic implementations that can be used,
though.
* Changed vm_{get,put}_physical_page(). The former no longer accepts
flags (the only flag PHYSICAL_PAGE_DONT_WAIT wasn't needed anymore).
Instead it returns an implementation-specific handle that has to be
passed to the latter. Added vm_{get,put}_physical_page_current_cpu()
and *_debug() variants, that work only for the current CPU,
respectively when in the kernel debugger. Also adjusted the
vm_translation_map operations accordingly.
* Made consequent use of the physical memory operations in the source
tree.
* Also adjusted the m68k and ppc implementations with respect to the
vm_translation_map operation changes, but they are probably broken,
nevertheless.
* For x86 the generic physical page mapper isn't used anymore. It is
suboptimal in any case. For systems with small memory it is too much
overhead, since one can just map the complete physical memory (that's
not done yet, though). For systems with large memory it counteracts
the VM strategy to reuse the least recently used pages. Since those
pages will most likely not be mapped by the page mapper anymore, it
will keep remapping chunks. This was also the reason why building
Haiku in Haiku was significantly faster with only 256 MB RAM (since
that much could be kept mapped all the time).
Now we're using a different strategy: We have small pools of virtual
page slots per CPU that are used for the physical page operations
(memset_physical(), memcpy_*_physical()) with CPU-pinned thread.
Furthermore we have four slots per translation map, which are used to
map page tables.

These changes speed up the Haiku image build in Haiku significantly. On
my Core2 Duo 2.2 GHz 2 GB machine about 40% to 20 min 40 s (KDEBUG
disabled, block cache debug disabled). Still more than factor 3 slower
than FreeBSD and Linux, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28244 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 51f837ae4218262dbc2782053e840d58d6a5ff08 16-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Dynamically adjust the page writer's I/O priority depending on how many
pages have to be written and how tight the memory situation is.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28198 a95241bf-73f2-0310-859d-f6bbb57e9c96


# feec0dd9691ee36874b6937343e990a97f9c36ab 12-Oct-2008 François Revol <revol@free.fr>

Fix ifdef, should be DEBUG_PAGE_QUEUE there.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28009 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 1b6eff280f4afcf4d7c9dc9ccdc3a65f4e6ca0fd 11-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Replaced the vm_get_physical_page() "flags"
PHYSICAL_PAGE_{NO,CAN}_WAIT into an actual flag
PHYSICAL_PAGE_DONT_WAIT.
* Pass the flags through to the chunk mapper callback.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27979 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d654f56af243580068a6260e11e5c832b325d291 11-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added kernel tracing for the page daemon and the page writer.
* Added some commented out debug output in vm.cpp.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27971 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8b6f1d5ef5c5446d816eaaaf3a1a37f82334ba2a 08-Oct-2008 Rene Gollent <anevilyak@gmail.com>

Fixed warnings with tracing enabled and made some very noisy dprintfs trace-only
as they were flooding the syslog.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27935 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e43cb37bcdf44d3c2b866098e3f29a0820d9a509 05-Oct-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Moved several VM related debug settings to kernel_debug_config.h.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27876 a95241bf-73f2-0310-859d-f6bbb57e9c96


# ca7cb625b9769be2657365e2137197bdc3a9692d 17-Sep-2008 Axel Dörfler <axeld@pinc-software.de>

* Implemented a (private for now) get_system_info_etc() call, that can retrieve
various system information.
* Implemented retrieving some VM stats via this call.
* The VM now maintains a page fault counter, and sets system_info::page_faults
accordingly.
* Added a (pretty simple) "vmstat" command line app.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27597 a95241bf-73f2-0310-859d-f6bbb57e9c96


# fd49e6b35a41bd2858b1907ae369f5cfb76d5115 30-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Print some more interesting timing info for the page writer.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27245 a95241bf-73f2-0310-859d-f6bbb57e9c96


# ae21ddaf58dbc505465b9495a3a44ace56b244a7 28-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

steal_pages() was leaking a cache reference since r26572, i.e caches
locked there would be leaked eventually.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27228 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 96b6a162a1bce6bbceec5a722ed4749b265aec4c 27-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Increased the number of pages the page writer tries to write per run.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27217 a95241bf-73f2-0310-859d-f6bbb57e9c96


# aacb158ca27477b7f38fa547f97f8d011699e1cb 23-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* The LIMIT_AVAILABLE_MEMORY macro can be defined to limit the amount of
RAM Haiku uses (for debugging purposes).
* "page_stats" prints some more infos now.
* page_writer():
- Moved the low_resource_state() invocation out of the inner loop.
Reduces lock contention on the sLowResourceLock recursive lock.
- Additional debug output: Every 1024 written pages the page writer
prints a message.
* steal_pages(): Addressed the TODO: When there should be pages to
steal, but we can't get them ATM, we now timeout on the free pages
condition variable instead of snoozing unconditionally, so that we
wake up earlier when someone frees pages in the meantime.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27181 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2e8e6c9c6e537f2518e20ceda967ab8895823ef6 21-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Introduced vm_page_try_reserve_pages(), which fails when not enough
pages are free ATM.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27116 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 2a79a7686f90e5720024387dd90f8e058d13b044 18-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* VMCache::Write(): Added "uint32 flags" argument which is supposed to
be passed on to the IORequest. Most relevantly physical pages can now
be written directly by passing B_PHYSICAL_IO_REQUEST.
* Added VMCache::WriteAsync() which is supposed to write pages
asynchronously. The base class version version falls back to the
synchronous Write(). Only VMVnodeCache implements WriteAsync() ATM,
VMAnonymousCache (swap support) still has to be adjusted accordingly.
* write_page() doesn't need to map the page anymore as it can write the
physical page directly.
* Modified the page writer to write pages asynchronously. This shouldn't
have any noticeable effect yet. It will though as soon as the I/O
scheduler reorders I/O operations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27056 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e387dd151bf6a781c30333e22f9efcf7f3b33ca5 08-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

"page_stats" does now also print the number of mapped pages.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26875 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8d12bd1370b89bd29d6b306f5875ec08ce5f4a74 05-Aug-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Moved the incrementing/decrementing of vm_page::wired_count into
dedicated functions.
* Introduced gMappedPagesCount variable which counts the total number of
physical pages that are mapped.
* Added vm_page_get_stats() which fills in the memory related part of
the system_info structure. Used and cached pages are computed
differently, now. The "available" (== not committed) memory is no
longer used for the computation as it doesn't say anything about the
actually used/free pages (with swap support enabled it is even
less meaningful, since we first commit swap space when possible).
We do also consider the memory used by the block cache as cached
pages, now. All in all these changes should fix the memory statistics
reported by get_system_info(), IOW bug #2574.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26837 a95241bf-73f2-0310-859d-f6bbb57e9c96


# dbc6635d1eb2ae1e7024b500074387f283cbc690 31-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

The page queues no longer count added dummy pages. This fixes a problem
in steal_pages() which uses the number of pages in the inactive queue as
return criterion. It would thus return, if only marker pages were in the
queue and no page could be stolen. This led to a busy loop in
vm_page_allocate_page(). The whole system would become unusable when the
thread in question was the heap grower, since it would starve everyone
else due to its high priority.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26710 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d3374bdc15d9f0e2bac4a1b47b1b82cfb1e10c8d 28-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Reverted most of r26641.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26658 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 134a2fd160e5d09966687e31fb2051b5da110390 26-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Patch by Zhao Shuai with some modifications by myself:
* Renamed sModifiedTemporaryPages to sModifiedNoSwapPages to better
express what this variable is about.
* Changed tracking of sModifiedNoSwapPages. It really counts
non-swappable pages only, now (if swap support is enabled).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26641 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c586076dcafe59a79b7f3073f2471497d62b29af 24-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Patch by Zhao Shuai with changes by myself:
* Init swap support in main().
* Added "bool swappable" parameter to
VMCacheFactory::CreateAnonymousCache(). A cache supporting swapping
is created when true. Adjusted invocations accordingly.
* The page writer does now write non-locked swappable pages (when
memory is low).
* Fixed header guard of VMAnonymousNoSwapCache.h.
* Swap support is compiled conditionally, controlled by the
ENABLE_SWAP_SUPPORT in src/system/kernel/vm/VMAnonymousCache.h. It is
disabled ATM. Since no swap files are added, it wouldn't have much
effect anyway.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26625 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e6bd90c58dbae64f3b464edcff90dcb06e63a716 23-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* bfs_fsync() was the only place which could cause the
fs_vnode_ops::write_pages() to be called with fsReenter = true. Since
this is no longer the case, the argument has become superfluous. For
read_pages() it always was. Removed the argument from the functions
and all functions that propagated it.
* Some whitespace at the end of lines was removed.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26579 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5c99d639708df9b4e2cc847b38d510149d19ec78 22-Jul-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Merged branch haiku/branches/developer/bonefish/vm into trunk. This
introduces the following relevant changes:
* VMCache:
- Renamed vm_cache to VMCache, merged it with vm_store and made it a
C++ class with virtual methods (replacing the store operations).
Turned the different store implementations into subclasses.
- Introduced MergeStore() callback, changed semantics of Commit().
- Changed locking and referencing semantics. A reference can only be
acquired/released with the cache locked. An unreferenced cache is
deleted and a mergeable cache merged when it is unlocked. This
removes the "busy" state of a cache and simplifies the page fault
code.
* Added VMAnonymousCache, which will implement swap support (work by
Zhao Shuai). It is not integrated and used yet, though.
* Enabled the mutex/recursive lock holder asserts.
* Fixed DoublyLinkedList::Swap().
* Generalized the low memory handler to a low resource handler. And made
semaphores and reserved memory handled resources. Made
vm_try_resource_memory() optionally wait (with timeout), and used that
feature to reserve memory for areas.
...


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26572 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6db6b628d6fdad197f44cc51fea342e888064575 16-Jul-2008 Axel Dörfler <axeld@pinc-software.de>

* Added B_PHYSICAL_BASE_ADDRESS address specification for anonymous areas.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26456 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e5f7642ca8331f375e7169bb024d0096962abc8f 04-Jul-2008 Michael Lotz <mmlr@mlotz.ch>

Remove a few unused variables.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26249 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 45b309e39d7a6a3c58eb2575c3f1fb4bc6866456 04-Jul-2008 Michael Lotz <mmlr@mlotz.ch>

Spotted this while reading through page code. The usage_count would be set for
wrong pages when allocating a page run unless the run started at page 0 as the
start offset was missing.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26245 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e1b630c55d9d0c25aef812efc9c2410f5ba53456 28-Jun-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Replaced the global cache pages hash table by an IteratableSplayTree
per cache.
* Changed the strategy vm_cache_acquire_page_cache_ref() uses to ensure
that the cache isn't deleted while trying to get a reference. Instead
of the global cache pages hash table lock, it holds the global cache
list lock now. We acquire + release this lock in delete_cache() after
removing all pages and just before deleting the object.
* Some small optimizations using the property that the cache's pages are
ordered, now (vm_cache_resize(), vm_page_write_modified_page_range(),
vm_page_schedule_write_page_range()).
* Replaced some code counting a cache's pages by simply using
vm_cache::page_count.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26160 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 7b67df9c067bb9e002e06b995312ce5ac1221797 23-Jun-2008 Salvatore Benedetto <salvatore.benedetto@gmail.com>

* Fix cache reference leak


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26110 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 710b77326dcacb1ed5deab5d02db3c6ec162be70 01-Jun-2008 Axel Dörfler <axeld@pinc-software.de>

* vm_cache::virtual_size is not always a multiple of B_PAGE_SIZE for files.
In these cases, the last partial page would have never been written back.
* This fixes bug #2282, and eventually others.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25747 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0f448d21e52dfbde6ebd029af30d19542224c16d 22-May-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added vm_page_write_modified_page_range(), which is similar to
vm_page_write_modified_pages(), save that it only writes pages in the
given range.
* Added vm_page_schedule_write_page_range() which schedules all modified
pages in the given cache's range for writing by the page writer.
* Added _kern_sync_memory() syscall and the msync() POSIX function.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25620 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0c615a01ae49634aaf59fbe35b3d55b3bb8890df 01-May-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Removed old mutex implementation and renamed cutex to mutex.
* Trivial adjustments of code using mutexes. Mostly removing the
mutex_init() return value check.
* Added mutex_lock_threads_locked(), which is called with the threads
spinlock being held. The spinlock is released while waiting, of
course. This function is useful in cases where the existence of the
mutex object is ensured by holding the threads spinlock.
* Changed the two instances in the VFS code where an IO context of
another team needs to be locked to use mutex_lock_threads_locked().
Before it required a semaphore-based mutex implementation.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25283 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 184de764fe4d2593164db6e8b3d3a42021f6bc2f 30-Apr-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Replaced the vm_cache mutex by a cutex. This should save quite a few
semaphores.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25277 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c16d05cff9c434423a5a3ce21ee16bdf54a3b049 29-Apr-2008 Axel Dörfler <axeld@pinc-software.de>

* steal_page() called remove_page_from_queue() without holding the sPageLock.
This fixes bug #1900 for real.
* Rearranged find_page_candidate() a bit, removed duplicate code, added a panic
in case the marker state is invalid.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25255 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0b51ee4efd06f8fb34dc67256ba1533a4e11a644 29-Apr-2008 Axel Dörfler <axeld@pinc-software.de>

* The page writer was calling remove_page_marker() without holding the
sPageLock. This could easily mess up the page queue.
* Now, remove_page_marker() gets the lock itself. This fixes bug #1900.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25250 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6bf15ffcdcfc62c39948e0e9449064e65b7f13bd 27-Apr-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Changed macros that enable tracing for individual components from
defined/undefined to numeric values (0 for undefined). This allows for
trace levels.
* Set SYSCALL_TRACING_IGNORE_KTRACE_OUTPUT default to 1, since this is
what one usually wants.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25213 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6cef245eca821584f07f5a13558f51ec586852e8 22-Apr-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

* Detemplatized ConditionVariable{Entry}. Merged them with their
respective Private* base class.
* Changed sigwait() and sigsuspend() to use thread_block() instead of a
condition variable.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25100 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6b53669383384c213fac62ca0ec4300b62e43c7b 01-Apr-2008 Axel Dörfler <axeld@pinc-software.de>

* Renamed vm_get_available_memory() to vm_available_memory() to fit better
into our usual naming scheme.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24745 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 82d444a25e08fe5daab2258551308be720cdd477 27-Mar-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Changed the page allocation tracking history to kernel tracing instead.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24614 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 332e24fb438866dc46dc7d0a0500b5efac0959d3 26-Mar-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed a quasi-livelock in steal_pages() as proposed in ticket #1929.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24605 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 41f8d41647c52758df0d91031609d31ca01032ce 25-Mar-2008 Axel Dörfler <axeld@pinc-software.de>

Applied patch by Rene Gollent:
* Add a cached_pages field to the system_info structure, and change the
meaning of the used_pages field to not include cached pages.
* Provide the needed info using the new calls vm_get_available_memory(),
and vm_page_num_available_pages().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24571 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8b76a59a0d7cc41928cd0519032c9f8e3cf7656c 17-Mar-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Fixed race condition in the page writer: The state of the page we have
picked might have changed while we were locking its cache. Might fix
#1931.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24430 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9835c090a69357df22aaaa5a3e12483a36f8deb0 07-Feb-2008 Ingo Weinhold <ingo_weinhold@gmx.de>

Added a boolean "force" parameter to thread_yield(). When true, the
function has the old behavior. When false, it just calls the scheduler
without any priority adjustment or other stuff.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23906 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 53f797970921393d6a7cb3bf578758a95ae9fd94 17-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

* Fixed a deadlock (and resolved TODO): we need to make all pages unbusy again
before releasing our cache reference. Otherwise removing a vnode (triggered
by releasing the cache in our thread) could need pages we still own.
* Put the caches and pages into a union to save stack space; they are not
needed at the same time.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23580 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a825cef64bcfa172a96273b99531fc6415e9a1d8 12-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

Added TODO comment about a possible deadlock Marcus just found :-)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23450 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3e5b9076f93c9dde1d73865931250d86e4ff2fea 09-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

* Fixed (or rather, worked around) a deadlock in the VM: when a file was
resized but still had dirty pages to be written back,
vm_cache_resize() (which is called with the inode lock being held)
deadlocked with the page writer.
* Now, I reintroduced busy_writing: it'll be set by everything that
writes back pages (vm_page_write_modified(), and the page writer),
and will be checked for in vm_cache_resize() - other functions are not
affected for now, AFAICT.
* vm_cache_resize() will clear that flag, and the writer will check it
again after it wrote back the page (which will fail when it's outside
the file bounds), and if it's cleared, it will get rid of the page
(if the file has been resized again in the mean time, writing it will
succeed then, and we'll keep the page around).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23334 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 34dafb63520e4249030dca06fe5c2d6baae60b71 09-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

Minor refactoring.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23319 a95241bf-73f2-0310-859d-f6bbb57e9c96


# bcb71f00e814d6eb5bb4390fb1d896c0dfc2be00 09-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

* My last change to vm_page.cpp made an existing bug much more likely to
appear: when freeing a modified page, it wouldn't have a cache
anymore, but set_page_state_nolock() depended on it.
* To work around this, I added a vm_page_free() function, which the
caches that free modified pages have to call (but others may, too).
It will correctly maintain the sModifiedTemporaryPages counter in case
the cache has already been removed.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23318 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3d2595d16a4bfa18041f1bcaa5eeb34b0865d008 09-Jan-2008 Axel Dörfler <axeld@pinc-software.de>

The modified temporary page counter could go out of sync pretty easily.
This could cause the page writer to run endlessly.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23309 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9abdc42489bda76a02d537333d9135131160d90f 08-Dec-2007 Axel Dörfler <axeld@pinc-software.de>

If there are more than 4 MB dirty cache pages, the page writer won't stop anymore
writing back pages when there is enough free memory.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23086 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3d268eda3d0ca504c865533347decf27b54025b6 10-Nov-2007 Axel Dörfler <axeld@pinc-software.de>

* Extracted file_map API out of the file cache - it's now an optional service
that can be used by file systems.
* Changed the way the file cache works: instead of reading/writing to the
underlying device directly, it can now be used for any data source, ie.
also network file systems.
* As a result, the former pages_io() moved to the VFS layer, and can now be
called by a file system via {read|write}_file_io_vec_pages() (naming
suggestions are always welcomed :-)). It now gets an FD, and uses that to
communicate with the device (via its fs_{read|write}_pages() hooks).
* The file_cache_{read|write}() functions must now be called without holding
an I/O relevant file system lock. That allows the file cache to prepare the
pages without colliding with the page writer, IOW the "mayBlock" flag can
go into the attic again (yay!).
* This also results in a much better performance when the system does I/O and
is low on memory, as the page writer can now finally write back some pages,
and that even without maxing out the CPU :)
* The API changes put slightly more burden on the fs_{read|write}_pages()
hooks, but in combination with the file_map it's still pretty straight
forward. It just will have to dispatch the call to the underlying device
directly, usually it will just call its fs_{read|write}_pages() hooks
via the above mentioned calls.
* Ported BFS and FAT to the new API, the latter has not been tested, though.
* Also ported the API changes to the fs_shell. I also completely removed its
file cache level page handling - the downside is that device access is no
longer cached (ie. depends on the host OS now), the upside is that the code
is greatly simplified.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22886 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 67f0ddf604ba391918a3f6fdda28e98b63a56c81 07-Nov-2007 Axel Dörfler <axeld@pinc-software.de>

Added the sModifiedTemporaryPages counter to the output of the "page_stats" KDL
command.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22856 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f7e414f22b68451ecb9201f435630753117976fd 07-Nov-2007 Axel Dörfler <axeld@pinc-software.de>

* Made page_writer() use a marker page as well, so that it won't try to get
the same pages over and over.
* Increased the priority of the page writer a bit, so that it is higher than
the one of the page daemon.
* Added a sModifiedTemporaryPages counter to let the page_writer decide how
many pages are there to write back (temporary pages would go to the swap file
and are only written back when memory is low).
* In case there are more than 1024 modified (non-temporary) pages around, the
page writer will constantly write out pages, not only when being pushed.
* The page writer now temporarily always leave out temporary pages (as long as
we don't have a swap file).
* Shuffled functions around a bit.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22852 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a81e874ffbce5711b9cce402479eba05f8d5db2a 05-Nov-2007 Ingo Weinhold <ingo_weinhold@gmx.de>

* Added opt-in debugging feature: Recent allocation-related operations
on pages are recorded in a history and can be printed via the
"page_allocations" command.
* Fixed a problem in the page scrubber. It temporarily removed pages
from the free list, which could have been reserved by someone else.
When actually allocating the reserved pages, that someone could find
free and clear lists empty and would therefore rightfully panic
("Had reserved page, but there is none!").


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22841 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 5ff3d4f2db5b4970385825bc8a48ecd268954594 05-Nov-2007 Axel Dörfler <axeld@pinc-software.de>

* If steal_pages() stole more than originally asked for, it might have lost those pages in the
non-reserve case.
* vm_page_allocate_page() could also lose a stolen page in case more free pages were available
after steal_pages() was called.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22834 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f8941839c39a0bd8452cec1d50abf7961c990210 11-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Reworked stealing pages: the page thief thread is gone now,
vm_page_reserve_pages() and vm_page_allocate_page() will now steal pages from
the inactive queue as needed.
* We currently never steal active pages anymore, but this might need to be
revised later (therefore, the page scanner never waits anymore, but uses
mutex_trylock() to lock a cache).
* The page scanner and writer now both run at normal priority - let's see how
that will work out.
* Introduced an inactive queue.
* Instead of shuffling pages around in the queue (and therefore destroying LRU)
the page stealing mechanism now uses a marker page to be able to release the
page lock without losing its position in the queue.
* The page writer now always grabs the whole release count of the semaphore, so
that there won't be a huge backlog to catch up with.
* vm_page_num_free_pages() now also includes the inactive queue as well as the
reserved pages (they are no longer regarded as free pages).
* Added a insert_page_after() function that inserts a page after another one,
needed by the marker code.
* clear_page() now gets a vm_page instead of a physical address which simplified
some code.
* Removed superfluous initialization of the queues (if those aren't zeroed on
start, we would have serious problems, anyway).
* Removed old and unimplemented dump_free_page_table() ("free_pages") KDL
command.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22506 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 477c9d1dc0c9e0ba73bad72ffbfab374d770dd52 09-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* vm_set_area_protection() would remap the whole area instead of just the page
it intended to. That resulted in more writable pages where you wouldn't want
them (ie. allowing the area to change pages in lower caches).
* We were losing modified pages: vm_unmap_pages() sometimes has to preserve
the modified flag (eg. when called from page fault).
* Both of these were responsible that stealing active pages would crash
applications - even if less likely, this could also have happened when
stealing inactive pages. Therefore, I've activated stealing active pages
again.
* The page writer now pushes the pages of busy vnodes to the end of the queue,
so that it won't pick them up again too soon (the vnode destruction would
be in the process of writing those pages back, anyway).
* The page thief now triggers the page writer to run once it has to steal
active pages. This might be a bit too aggressive, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22495 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 873f2ffc1a4b797fde3d6b93b9e43bf05a85a9ce 08-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Fixed the page_thief(): it never noticed it could not get a page.
* The page_thief() will no longer steal any pages in B_LOW_MEMORY_NOTE state,
only in the more serious cases.
* I've disabled stealing active pages for now again; there seem to be some
problems with it (either with how we do it, or with other stuff).
* vm_page_schedule_write_page() now always releases the page writer semaphore,
resulting in many more written pages - this isn't optimal as long as there is
no I/O scheduler, but before it was much too rare when there are many dirty
pages.
* Customized the thread priorities a bit to make the page scanner/thief/writer
experience a bit nicer with our current scheduler.
* vm_page_reserve_pages() would return too early, it did not test if really
enough pages are free.
* Under certain circumstances, the wakeup from vm_page_reserve_pages() did not
work - we now always notify in vm_page_unreserve_pages() to work around that
problem.
* Checked if the page reservations are done when needed and are always balanced
for the whole kernel.
* vm_page_allocate_page() now panics if it can't deliver a reserved page.
* vm_page_allocate_page_run() can no longer steal reserved pages.
* With all of those changes, I could finally copy a file in emulation, ie. the
Luposian bug should finally be fixed, even though the system might still not
be perfectly stable under low memory. Will do some more testing.
* write_page() no longer prints something on failure.
* Dumping a whole page queue will now also write the cache type of each page.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22486 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 20b232e900921a97e6b88917c04ca6777da551cd 07-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

Actually forgot this nail: the file cache will now reserve the pages it will
allocate with the vm_cache locked - this is necessary to be able to steal pages
from itself (large files...).
The system doesn't actually lock up anymore, but it still renders itself unusable;
obviously the page thief does not work correctly, yet. The rest of the experience
is created by our current scheduler (the page thief runs and runs, but it doesn't
free any pages anymore).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22466 a95241bf-73f2-0310-859d-f6bbb57e9c96


# c950f17a5156c4e3042c0a2429aff0ad1eb80391 06-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Added a acquire_unreferenced_ref() to vm_store
* his has to be used by the page writer to make sure the vnode is still valid.
* This should have been the final nail on the Luposian bug - I haven't tested
it yet, but we'll certainly see :-)


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22462 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 121135147663558c07943440613382f4de66c9bf 06-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

The page thief can now also steal active pages under pressure.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22456 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 0e183340579eeeb7703088d847cfd1284a511129 06-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Mapping a page might actually need memory - since we usually have locks that
interfere with the page thief, we always need to have reserved a page for
this upfront. I introduced a function to the vm_translation_map layer that
estimates how much pages a mapping might need at maximum. All functions that
map a page now call this and reserve the needed pages upfront.
It might not be a nice solution, but it works.
* The page thief could run into a panic when trying to call vm_cache_release_ref()
on a non-existing (NULL) cache.
* Also, it will now ignore wired active pages.
* There is still a race condition between the page writer and the vnode
destruction - writing a page back needs a valid vnode, but that might just
have been deleted.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22455 a95241bf-73f2-0310-859d-f6bbb57e9c96


# edf668344a83d0ea97728372863488448c539600 04-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* Added some docs.
* Removed dead code.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22439 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 9d8c209014a71a82de460aafd94bed1f6aa90f55 04-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* vm_remove_all_page_mappings() now returns an accumulation of the flags of
the unmapped page.
* This is needed by everyone who calls this to make sure modifications to a
page aren't ignored. Namely, the page scanner and the page thief were
affected.
* Cleaned up locking the page's cache a bit in page_thief(); there is now
a helper class that takes care of everything.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22438 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 3e9513aa4a8bf5f2fb2b86a767ffe46f6e626acc 03-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

* fs_{write|read}_pages() now has an additional argument "mayBlock".
* the page writer don't allow to block, while all other writers do. This fixes
bug #1509. The reason the page writer needs this is because it marks several
pages from different caches as busy.
* Fixed a warning about ASSERT being defined already in BFS, since
util/DoublyLinkedList.h now includes debug.h.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22434 a95241bf-73f2-0310-859d-f6bbb57e9c96


# e5b464d09f35b2f8be9b911cba4013d07d2876af 02-Oct-2007 Axel Dörfler <axeld@pinc-software.de>

Added a TODO what we need to do with stolen active pages - for now, we don't
do anything with them, though.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22413 a95241bf-73f2-0310-859d-f6bbb57e9c96


# b15c9adec7b23608dc4bb6e54733d1c7ed6b11b6 30-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Decoupled the page_thief() from the low memory handler chain. This is
necessary because low memory handlers might need to wait for other services
while we need to make sure the page thief can always steal pages.
* Made the page thief more aggressive when memory is critical: added a third
run where it will also steal a small amount of active pages to keep things
going.
* The page thief did not maintain the cache's reference correctly in all
situations.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22382 a95241bf-73f2-0310-859d-f6bbb57e9c96


# cfed176e681304337c5ceee6bc34e3fce05b3c02 28-Sep-2007 Ingo Weinhold <ingo_weinhold@gmx.de>

* I just saw the page writer passing a free page to write_page().
Apparently not everyone checks the page state for PAGE_STATE_BUSY.
vm_page_write_modified_pages() does now at least.
* Fixed typos in comments.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22349 a95241bf-73f2-0310-859d-f6bbb57e9c96


# a6778735f9b06e497f3ad8e23b7c6da9356bbef5 28-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

bonefish+axeld:
* We now have a page writer that takes some pages from the modified queue
and writes it back every few seconds. It can be triggered by the page
scanner to do that more often, though. That mechanism can be greatly
improved once we have our I/O scheduler working.
* Removed vm_page_write_modified_page() again - it was all "eaten up" by
the page writer.
* Reworked vm_page_write_modified_pages() a bit: it now uses
vm_test_map_modification() and vm_clear_map_flags() instead of the
iterating over all areas which wouldn't even work correctly.
The code is much simpler now, too.
* You usually put something to the tail of a queue, and remove the contents
from the head, not vice versa - changed queue implementation to reflect this.
* Additionally, there is now a enqueue_page_to_head() if you actually want the
opposite.
* vm_page_requeue() allows you to move a page in a queue to the head or tail.
* Replaced vm_clear_map_activation() with vm_clear_map_flags() which allows
you to clear other flags than PAGE_ACCESSED.
* The page scanner dumps now some arguments with each run.
* Removed the old disabled pageout_daemon() from NewOS.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22348 a95241bf-73f2-0310-859d-f6bbb57e9c96


# f98d60ae0497903f9eddf676514005d6ade2af00 26-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Removed the automatic release of the "modified_pages_available" semaphore
in enqueue_page() - it doesn't really belong there.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22328 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8692ec023c373576f9bd46adeb9954ce708b8026 26-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Renamed vm_page_write_modified() to vm_page_write_modifed_pages() and
introduced a new vm_page_write_modified_page().
* Resolved a TODO: vm_page_write_modified_pages() did not mark a to be
written page busy but unlocked its cache which could let someone else
steal that page in the mean time.
* Moved the logic when to move a page to the active or inactive queue to
a new function move_page_to_active_or_inactive_queue().
* Moved page_state_to_string() to vm_page(); it's now also used by the
"page" and "page_queue" KDL commands.
* Made the output of the "page_queue list" command more useful.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22323 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8e0f884c71025810db35b54234f1a2919131b108 26-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Since the page scanner and thief can work more effectively when no vm_caches
are locked, there is now a vm_page_reserve_pages() call to ensure upfront that
there is a page for me when I need it, and may have locked some caches.
* The vm_soft_fault() routine now makes use of that feature.
* vm_page_allocate_page() now resets the vm_page::usage_count, so that the file
cache does not need to do this in read_chunk_into_cache() and
write_chunk_to_cache().
* In cache_io() however, it need to update the usage_count - and it does that
now. Since non-mapped caches don't have mappings, the page scanner will punish
the cache pages stronger than other pages which is accidently just what we
want.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22319 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 6d4aea47962e0ea08b81327fbbf93b32ae821177 25-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

bonefish+axeld:
* Removed the vm_cache/vm_store ref_count duality that besides being a bit ugly
also created the page dameon cache retrieval problem: now, only areas (and
cache consumers) retrieve a reference to the store (and therefore, the vnode).
The page daemon doesn't need to care about this at all anymore, and the pseudo
references of the vm_cache could be removed again.
* Rearranged deletion of vnodes such that its ID can be reused directly after
fs_remove_vnode() has been called.
* vm_page_allocate_page() no longer panics when it runs out of pages, but just
waits for new pages to become available using the new sFreeCondition condition
variable - to make sure this happens in an acceptable time frame, it'll
trigger a run of the low memory handlers.
* Implemented a page_thief() that steals inactive pages from caches and puts
them into the free queue. It runs as a low memory handler.
* The file cache now sets the usage count on the pages it inserts into the
cache (needs some rework though, cache_io() doesn't do it yet).
* Instead of panicking, the kernel will currently dead lock in low memory
situations, since BFS does a bit too much in bfs_release_vnode().
* Some minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22315 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 8c657126cdd318c4af32423d10f44a48a861868d 25-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Removed unused vm_page::busy_{reading|writing} fields.
* Fixed vm_page_allocate_page_run(): it did not take the pageState into account,
and would therefore return uninitialized memory (ie. B_CONTIGUOUS areas would
contain garbage).
Now, it stores if a page is cleared in a new vm_page::is_cleared field.
* Some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22306 a95241bf-73f2-0310-859d-f6bbb57e9c96


# d8badf6791ef375651b56007ed5dab0c17b6d303 03-Sep-2007 Axel Dörfler <axeld@pinc-software.de>

* Renamed page queues according to our style guide.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22155 a95241bf-73f2-0310-859d-f6bbb57e9c96


# 279c6b76dc2a862f712eb2222381988f74b7b199 09-Aug-2007 Ingo Weinhold <ingo_weinhold@gmx.de>

* Use condition variables when waiting for busy pages or busy caches.
* Removed a few instances where the page state was set busy directly after
allocating it. This is a no-op, since a page is always busy after
allocation.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21875 a95241bf-73f2-0310-859d-f6bbb57e9c96