Added vm_[un]wire_page(), which are essentially versions of

[un]lock_memory_etc() optimized for a single page.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36156 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2010-04-11 15:07:06 +00:00
parent 713bede839
commit 349039ff2e
3 changed files with 163 additions and 0 deletions
+23
View File
@@ -43,6 +43,10 @@ struct VMAreaWiredRange : SinglyLinkedListLinkImpl<VMAreaWiredRange> {
bool implicit; // range created automatically
VMAreaUnwiredWaiterList waiters;
VMAreaWiredRange()
{
}
VMAreaWiredRange(addr_t base, size_t size, bool writable, bool implicit)
:
area(NULL),
@@ -53,6 +57,15 @@ struct VMAreaWiredRange : SinglyLinkedListLinkImpl<VMAreaWiredRange> {
{
}
void SetTo(addr_t base, size_t size, bool writable, bool implicit)
{
this->area = NULL;
this->base = base;
this->size = size;
this->writable = writable;
this->implicit = implicit;
}
bool IntersectsWith(addr_t base, size_t size) const
{
return this->base + this->size - 1 >= base
@@ -63,6 +76,16 @@ struct VMAreaWiredRange : SinglyLinkedListLinkImpl<VMAreaWiredRange> {
typedef SinglyLinkedList<VMAreaWiredRange> VMAreaWiredRangeList;
struct VMPageWiringInfo {
VMAreaWiredRange range;
addr_t physicalAddress;
// the actual physical address corresponding to
// the virtual address passed to vm_wire_page()
// (i.e. with in-page offset)
vm_page* page;
};
struct VMArea {
char* name;
area_id id;
+4
View File
@@ -24,6 +24,7 @@ struct VMArea;
struct VMCache;
struct vm_page;
struct vnode;
struct VMPageWiringInfo;
// area creation flags
@@ -113,6 +114,9 @@ void vm_clear_map_flags(struct vm_page *page, uint32 flags);
void vm_remove_all_page_mappings(struct vm_page *page);
int32 vm_clear_page_mapping_accessed_flags(struct vm_page *page);
int32 vm_remove_all_page_mappings_if_unaccessed(struct vm_page *page);
status_t vm_wire_page(team_id team, addr_t address, bool writable,
struct VMPageWiringInfo* info);
void vm_unwire_page(struct VMPageWiringInfo* info);
status_t vm_get_physical_page(addr_t paddr, addr_t* vaddr, void** _handle);
status_t vm_put_physical_page(addr_t vaddr, void* handle);