* 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
This commit is contained in:
@@ -60,6 +60,9 @@
|
|||||||
|
|
||||||
//#define TRACK_PAGE_USAGE_STATS 1
|
//#define TRACK_PAGE_USAGE_STATS 1
|
||||||
|
|
||||||
|
#define PAGE_ASSERT(page, condition) \
|
||||||
|
ASSERT_PRINT((condition), "page: %p", (page))
|
||||||
|
|
||||||
#define SCRUB_SIZE 16
|
#define SCRUB_SIZE 16
|
||||||
// this many pages will be cleared at once in the page scrubber thread
|
// this many pages will be cleared at once in the page scrubber thread
|
||||||
|
|
||||||
@@ -1058,7 +1061,7 @@ free_page(vm_page* page, bool clear)
|
|||||||
{
|
{
|
||||||
DEBUG_PAGE_ACCESS_CHECK(page);
|
DEBUG_PAGE_ACCESS_CHECK(page);
|
||||||
|
|
||||||
ASSERT(!page->IsMapped());
|
PAGE_ASSERT(page, !page->IsMapped());
|
||||||
|
|
||||||
VMPageQueue* fromQueue;
|
VMPageQueue* fromQueue;
|
||||||
|
|
||||||
@@ -1091,7 +1094,7 @@ free_page(vm_page* page, bool clear)
|
|||||||
|
|
||||||
if (page->CacheRef() != NULL)
|
if (page->CacheRef() != NULL)
|
||||||
panic("to be freed page %p has cache", page);
|
panic("to be freed page %p has cache", page);
|
||||||
if (!page->mappings.IsEmpty() || page->wired_count > 0)
|
if (page->IsMapped())
|
||||||
panic("to be freed page %p has mappings", page);
|
panic("to be freed page %p has mappings", page);
|
||||||
|
|
||||||
if (fromQueue != NULL)
|
if (fromQueue != NULL)
|
||||||
@@ -1171,8 +1174,8 @@ set_page_state(vm_page *page, int pageState)
|
|||||||
toQueue = &sModifiedPageQueue;
|
toQueue = &sModifiedPageQueue;
|
||||||
break;
|
break;
|
||||||
case PAGE_STATE_CACHED:
|
case PAGE_STATE_CACHED:
|
||||||
ASSERT(page->wired_count == 0 && page->mappings.IsEmpty());
|
PAGE_ASSERT(page, !page->IsMapped());
|
||||||
ASSERT(!page->modified);
|
PAGE_ASSERT(page, !page->modified);
|
||||||
toQueue = &sCachedPageQueue;
|
toQueue = &sCachedPageQueue;
|
||||||
break;
|
break;
|
||||||
case PAGE_STATE_FREE:
|
case PAGE_STATE_FREE:
|
||||||
@@ -1204,7 +1207,7 @@ set_page_state(vm_page *page, int pageState)
|
|||||||
// page states and active pages have a cache that must be locked at
|
// page states and active pages have a cache that must be locked at
|
||||||
// this point. So we rely on the fact that everyone must lock the cache
|
// this point. So we rely on the fact that everyone must lock the cache
|
||||||
// before trying to change/interpret the page state.
|
// before trying to change/interpret the page state.
|
||||||
ASSERT(cache != NULL);
|
PAGE_ASSERT(page, cache != NULL);
|
||||||
cache->AssertLocked();
|
cache->AssertLocked();
|
||||||
page->SetState(pageState);
|
page->SetState(pageState);
|
||||||
} else {
|
} else {
|
||||||
@@ -1229,7 +1232,7 @@ move_page_to_appropriate_queue(vm_page *page)
|
|||||||
|
|
||||||
// Note, this logic must be in sync with what the page daemon does.
|
// Note, this logic must be in sync with what the page daemon does.
|
||||||
int32 state;
|
int32 state;
|
||||||
if (!page->mappings.IsEmpty() || page->wired_count > 0)
|
if (page->IsMapped())
|
||||||
state = PAGE_STATE_ACTIVE;
|
state = PAGE_STATE_ACTIVE;
|
||||||
else if (page->modified)
|
else if (page->modified)
|
||||||
state = PAGE_STATE_MODIFIED;
|
state = PAGE_STATE_MODIFIED;
|
||||||
@@ -1549,7 +1552,7 @@ PageWriteWrapper::Done(status_t result)
|
|||||||
fPage->modified = true;
|
fPage->modified = true;
|
||||||
if (!fCache->temporary)
|
if (!fCache->temporary)
|
||||||
set_page_state(fPage, PAGE_STATE_MODIFIED);
|
set_page_state(fPage, PAGE_STATE_MODIFIED);
|
||||||
else if (fPage->wired_count > 0 || !fPage->mappings.IsEmpty())
|
else if (fPage->IsMapped())
|
||||||
set_page_state(fPage, PAGE_STATE_ACTIVE);
|
set_page_state(fPage, PAGE_STATE_ACTIVE);
|
||||||
else
|
else
|
||||||
set_page_state(fPage, PAGE_STATE_INACTIVE);
|
set_page_state(fPage, PAGE_STATE_INACTIVE);
|
||||||
@@ -2027,8 +2030,8 @@ free_cached_page(vm_page *page, bool dontWait)
|
|||||||
|
|
||||||
DEBUG_PAGE_ACCESS_START(page);
|
DEBUG_PAGE_ACCESS_START(page);
|
||||||
|
|
||||||
ASSERT(page->wired_count == 0 && page->mappings.IsEmpty());
|
PAGE_ASSERT(page, !page->IsMapped());
|
||||||
ASSERT(!page->modified);
|
PAGE_ASSERT(page, !page->modified);
|
||||||
|
|
||||||
// we can now steal this page
|
// we can now steal this page
|
||||||
|
|
||||||
@@ -2235,7 +2238,7 @@ full_scan_inactive_pages(page_stats& pageStats, int32 despairLevel)
|
|||||||
// Note that until in the idle scanning we don't exempt pages of
|
// Note that until in the idle scanning we don't exempt pages of
|
||||||
// temporary caches. Apparently we really need memory, so we better
|
// temporary caches. Apparently we really need memory, so we better
|
||||||
// page out memory as well.
|
// page out memory as well.
|
||||||
bool isMapped = page->wired_count > 0 || !page->mappings.IsEmpty();
|
bool isMapped = page->IsMapped();
|
||||||
if (usageCount > 0) {
|
if (usageCount > 0) {
|
||||||
if (isMapped) {
|
if (isMapped) {
|
||||||
set_page_state(page, PAGE_STATE_ACTIVE);
|
set_page_state(page, PAGE_STATE_ACTIVE);
|
||||||
@@ -2655,7 +2658,7 @@ vm_page_write_modified_pages(VMCache *cache)
|
|||||||
void
|
void
|
||||||
vm_page_schedule_write_page(vm_page *page)
|
vm_page_schedule_write_page(vm_page *page)
|
||||||
{
|
{
|
||||||
ASSERT(page->State() == PAGE_STATE_MODIFIED);
|
PAGE_ASSERT(page, page->State() == PAGE_STATE_MODIFIED);
|
||||||
|
|
||||||
vm_page_requeue(page, false);
|
vm_page_requeue(page, false);
|
||||||
|
|
||||||
@@ -3244,7 +3247,7 @@ vm_page_is_dummy(struct vm_page *page)
|
|||||||
void
|
void
|
||||||
vm_page_free(VMCache *cache, vm_page *page)
|
vm_page_free(VMCache *cache, vm_page *page)
|
||||||
{
|
{
|
||||||
ASSERT(page->State() != PAGE_STATE_FREE
|
PAGE_ASSERT(page, page->State() != PAGE_STATE_FREE
|
||||||
&& page->State() != PAGE_STATE_CLEAR);
|
&& page->State() != PAGE_STATE_CLEAR);
|
||||||
|
|
||||||
if (page->State() == PAGE_STATE_MODIFIED && cache->temporary)
|
if (page->State() == PAGE_STATE_MODIFIED && cache->temporary)
|
||||||
@@ -3257,7 +3260,7 @@ vm_page_free(VMCache *cache, vm_page *page)
|
|||||||
void
|
void
|
||||||
vm_page_set_state(vm_page *page, int pageState)
|
vm_page_set_state(vm_page *page, int pageState)
|
||||||
{
|
{
|
||||||
ASSERT(page->State() != PAGE_STATE_FREE
|
PAGE_ASSERT(page, page->State() != PAGE_STATE_FREE
|
||||||
&& page->State() != PAGE_STATE_CLEAR);
|
&& page->State() != PAGE_STATE_CLEAR);
|
||||||
|
|
||||||
if (pageState == PAGE_STATE_FREE || pageState == PAGE_STATE_CLEAR)
|
if (pageState == PAGE_STATE_FREE || pageState == PAGE_STATE_CLEAR)
|
||||||
@@ -3274,7 +3277,7 @@ vm_page_set_state(vm_page *page, int pageState)
|
|||||||
void
|
void
|
||||||
vm_page_requeue(struct vm_page *page, bool tail)
|
vm_page_requeue(struct vm_page *page, bool tail)
|
||||||
{
|
{
|
||||||
ASSERT(page->Cache() != NULL);
|
PAGE_ASSERT(page, page->Cache() != NULL);
|
||||||
DEBUG_PAGE_ACCESS_CHECK(page);
|
DEBUG_PAGE_ACCESS_CHECK(page);
|
||||||
|
|
||||||
VMPageQueue *queue = NULL;
|
VMPageQueue *queue = NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user