From 069b477dd77f60067206414b78a0edb23404482f Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 29 Jul 2009 18:57:21 +0000 Subject: [PATCH] * Introduced CREATE_AREA_DONT_CLEAR create_area_etc() flag, which allows the call to fetch non-clear pages. * B_PHYSICAL_BASE_ADDRESS does now imply B_CONTIGUOUS. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31932 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/vm.h | 1 + src/system/kernel/vm/vm.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/headers/private/kernel/vm.h b/headers/private/kernel/vm.h index fffd9b5097..e82da57dd3 100644 --- a/headers/private/kernel/vm.h +++ b/headers/private/kernel/vm.h @@ -27,6 +27,7 @@ struct vnode; // area creation flags #define CREATE_AREA_DONT_WAIT 0x01 #define CREATE_AREA_UNMAP_ADDRESS_RANGE 0x02 +#define CREATE_AREA_DONT_CLEAR 0x04 #ifdef __cplusplus diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index eff22bbbaa..7f7f2437b5 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -1768,6 +1768,8 @@ vm_create_anonymous_area(team_id team, const char* name, void** address, page_num_t guardPages; bool canOvercommit = false; addr_t physicalBase = 0; + uint32 newPageState = (flags & CREATE_AREA_DONT_CLEAR) != 0 + ? PAGE_STATE_FREE : PAGE_STATE_CLEAR; TRACE(("create_anonymous_area [%d] %s: size 0x%lx\n", team, name, size)); @@ -1797,6 +1799,7 @@ vm_create_anonymous_area(team_id team, const char* name, void** address, case B_PHYSICAL_BASE_ADDRESS: physicalBase = (addr_t)*address; addressSpec = B_ANY_KERNEL_ADDRESS; + wiring = B_CONTIGUOUS; break; default: @@ -1884,7 +1887,7 @@ vm_create_anonymous_area(team_id team, const char* name, void** address, if (wiring == B_CONTIGUOUS) { // we try to allocate the page run here upfront as this may easily // fail for obvious reasons - page = vm_page_allocate_page_run(PAGE_STATE_CLEAR, physicalBase, + page = vm_page_allocate_page_run(newPageState, physicalBase, size / B_PAGE_SIZE); if (page == NULL) { status = B_NO_MEMORY; @@ -1957,7 +1960,7 @@ vm_create_anonymous_area(team_id team, const char* name, void** address, # endif continue; #endif - vm_page* page = vm_page_allocate_page(PAGE_STATE_CLEAR, true); + vm_page* page = vm_page_allocate_page(newPageState, true); cache->InsertPage(page, offset); vm_map_page(area, page, address, protection);