Pager virtual address pool bookkeeping added for all pager virtual addresses

Previously virt_to_phys/phys_to_virt macros were used such that they did a
blind offset translation for creating a pager internal virtual address for
user mappings.

This is now changed such that a properly bookkeeped virtual address pool is
used which will avoid any clashes on the virtual space.
This commit is contained in:
Bahadir Balban
2009-08-19 14:44:36 +03:00
parent d351d6846a
commit 95b7b65c89
11 changed files with 94 additions and 46 deletions
+7 -2
View File
@@ -86,7 +86,7 @@ int file_page_out(struct vm_object *vm_obj, unsigned long page_offset)
return 0;
paddr = (void *)page_to_phys(page);
vaddr = phys_to_virt(paddr);
vaddr = l4_new_virtual(1);
/* Map the page to vfs task */
l4_map(paddr, vaddr, 1, MAP_USR_RW_FLAGS, VFS_TID);
@@ -100,6 +100,7 @@ int file_page_out(struct vm_object *vm_obj, unsigned long page_offset)
/* Unmap it from vfs */
l4_unmap(vaddr, 1, VFS_TID);
l4_del_virtual(vaddr, 1);
/* Clear dirty flag */
page->flags &= ~VM_DIRTY;
@@ -108,6 +109,8 @@ int file_page_out(struct vm_object *vm_obj, unsigned long page_offset)
out_err:
l4_unmap(vaddr, 1, VFS_TID);
l4_del_virtual(vaddr, 1);
return err;
}
@@ -130,7 +133,7 @@ struct page *file_page_in(struct vm_object *vm_obj, unsigned long page_offset)
if (!(page = find_page(vm_obj, page_offset))) {
/* Allocate a new page */
paddr = alloc_page(1);
vaddr = phys_to_virt(paddr);
vaddr = l4_new_virtual(1);
page = phys_to_page(paddr);
/* Map the page to vfs task */
@@ -143,6 +146,7 @@ struct page *file_page_in(struct vm_object *vm_obj, unsigned long page_offset)
/* Unmap it from vfs */
l4_unmap(vaddr, 1, VFS_TID);
l4_del_virtual(vaddr, 1);
/* Update vm object details */
vm_obj->npages++;
@@ -163,6 +167,7 @@ struct page *file_page_in(struct vm_object *vm_obj, unsigned long page_offset)
out_err:
l4_unmap(vaddr, 1, VFS_TID);
l4_del_virtual(vaddr, 1);
free_page(paddr);
return PTR_ERR(err);
}