diff options
Diffstat (limited to 'vm/vm_page.c')
-rw-r--r-- | vm/vm_page.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/vm/vm_page.c b/vm/vm_page.c index a539ab41..48d70964 100644 --- a/vm/vm_page.c +++ b/vm/vm_page.c @@ -442,6 +442,9 @@ vm_page_seg_alloc(struct vm_page_seg *seg, unsigned int order, simple_lock(&seg->lock); page = vm_page_seg_alloc_from_buddy(seg, order); simple_unlock(&seg->lock); + + if (page == NULL) + return NULL; } assert(page->type == VM_PT_FREE); @@ -637,10 +640,6 @@ vm_page_setup(void) page->type = VM_PT_FREE; vm_page_seg_free_to_buddy(seg, page, 0); page++; - - /* XXX */ - if (i <= VM_PAGE_SEG_DIRECTMAP) - vm_page_free_count++; } table += vm_page_atop(vm_page_seg_size(seg)); @@ -705,6 +704,7 @@ vm_page_alloc_pa(unsigned int order, unsigned int selector, unsigned short type) void vm_page_free_pa(struct vm_page *page, unsigned int order) { + assert(page != NULL); assert(page->seg_index < ARRAY_SIZE(vm_page_segs)); vm_page_seg_free(&vm_page_segs[page->seg_index], page, order); @@ -760,3 +760,22 @@ vm_page_mem_size(void) return total; } + +unsigned long +vm_page_mem_free(void) +{ + unsigned long total; + unsigned int i; + + total = 0; + + for (i = 0; i < vm_page_segs_size; i++) { + /* XXX */ + if (i > VM_PAGE_SEG_DIRECTMAP) + continue; + + total += vm_page_segs[i].nr_free_pages; + } + + return total; +} |