[haiku-commits] r37117 - haiku/trunk/src/system/kernel/vm

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 12 Jun 2010 18:04:49 +0200 (CEST)

Author: bonefish
Date: 2010-06-12 18:04:49 +0200 (Sat, 12 Jun 2010)
New Revision: 37117
Changeset: http://dev.haiku-os.org/changeset/37117/haiku

Modified:
   haiku/trunk/src/system/kernel/vm/vm_page.cpp
Log:
* 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.


Modified: haiku/trunk/src/system/kernel/vm/vm_page.cpp
===================================================================
--- haiku/trunk/src/system/kernel/vm/vm_page.cpp        2010-06-12 15:57:21 UTC 
(rev 37116)
+++ haiku/trunk/src/system/kernel/vm/vm_page.cpp        2010-06-12 16:04:49 UTC 
(rev 37117)
@@ -113,6 +113,11 @@
 static vm_page *sPages;
 static page_num_t sPhysicalPageOffset;
 static page_num_t sNumPages;
+static page_num_t sNonExistingPages;
+       // pages in the sPages array that aren't backed by physical memory
+static uint64 sIgnoredPages;
+       // pages of physical memory ignored by the boot loader (and thus not
+       // available here)
 static vint32 sUnreservedFreePages;
 static vint32 sUnsatisfiedPageReservations;
 static vint32 sModifiedTemporaryPages;
@@ -2812,12 +2817,19 @@
 vm_page_init_num_pages(kernel_args *args)
 {
        // calculate the size of memory by looking at the physical_memory_range 
array
-       page_num_t physicalPagesEnd = 0;
        sPhysicalPageOffset = args->physical_memory_range[0].start / 
B_PAGE_SIZE;
+       page_num_t physicalPagesEnd = sPhysicalPageOffset
+               + args->physical_memory_range[0].size / B_PAGE_SIZE;
 
+       sNonExistingPages = 0;
+       sIgnoredPages = args->ignored_physical_memory / B_PAGE_SIZE;
+
        for (uint32 i = 0; i < args->num_physical_memory_ranges; i++) {
-               physicalPagesEnd = (args->physical_memory_range[i].start
-                       + args->physical_memory_range[i].size) / B_PAGE_SIZE;
+               page_num_t start = args->physical_memory_range[i].start / 
B_PAGE_SIZE;
+               if (start > physicalPagesEnd)
+                       sNonExistingPages += start - physicalPagesEnd;
+               physicalPagesEnd = start
+                       + args->physical_memory_range[i].size / B_PAGE_SIZE;
        }
 
        TRACE(("first phys page = 0x%lx, end 0x%lx\n", sPhysicalPageOffset,
@@ -2899,7 +2911,7 @@
        // reserve, but should be a few more pages, so we don't have to extract
        // a cached page with each allocation.
        sFreePagesTarget = VM_PAGE_RESERVE_USER
-               + std::max((page_num_t)32, sNumPages / 1024);
+               + std::max((page_num_t)32, (sNumPages - sNonExistingPages) / 
1024);
 
        // The target of free + cached and inactive pages. On low-memory 
machines
        // keep things tight. free + cached is the pool of immediately 
allocatable
@@ -3511,7 +3523,7 @@
 page_num_t
 vm_page_num_pages(void)
 {
-       return sNumPages;
+       return sNumPages - sNonExistingPages;
 }
 
 
@@ -3562,10 +3574,10 @@
        // can't really be freed in a low memory situation.
        page_num_t blockCachePages = block_cache_used_memory() / B_PAGE_SIZE;
 
-       info->max_pages = sNumPages;
-       info->used_pages = gMappedPagesCount - blockCachePages;
-       info->cached_pages = sNumPages >= (uint32)free + info->used_pages
-               ? sNumPages - free - info->used_pages : 0;
+       info->max_pages = sNumPages - sNonExistingPages;
+       info->used_pages = gMappedPagesCount - blockCachePages + sIgnoredPages;
+       info->cached_pages = info->max_pages >= free + info->used_pages
+               ? info->max_pages - free - info->used_pages : 0;
        info->page_faults = vm_num_page_faults();
 
        // TODO: We don't consider pages used for page directories/tables yet.


Other related posts:

  • » [haiku-commits] r37117 - haiku/trunk/src/system/kernel/vm - ingo_weinhold