From 44d78061e90e777b51cae8e01eda5c0d3ce63103 Mon Sep 17 00:00:00 2001 From: Richard Braun Date: Tue, 2 Feb 2016 23:17:20 +0100 Subject: Fix various memory managment errors A few errors were introduced in the latest changes. o Add VM_PAGE_WAIT calls around physical allocation attempts in case of memory exhaustion. o Fix stack release. o Fix memory exhaustion report. o Fix free page accounting. * kern/slab.c (kmem_pagealloc, kmem_pagefree): New functions (kmem_slab_create, kmem_slab_destroy, kalloc, kfree): Use kmem_pagealloc and kmem_pagefree instead of the raw page allocation functions. (kmem_cache_compute_sizes): Don't store slab order. * kern/slab.h (struct kmem_cache): Remove `slab_order' member. * kern/thread.c (stack_alloc): Call VM_PAGE_WAIT in case of memory exhaustion. (stack_collect): Call vm_page_free_contig instead of kmem_free to release pages. * vm/vm_page.c (vm_page_seg_alloc): Fix memory exhaustion report. (vm_page_setup): Don't update vm_page_free_count. (vm_page_free_pa): Check page parameter. (vm_page_mem_free): New function. * vm/vm_page.h (vm_page_free_count): Remove extern declaration. (vm_page_mem_free): New prototype. * vm/vm_pageout.c: Update comments not to refer to vm_page_free_count. (vm_pageout_scan, vm_pageout_continue, vm_pageout): Use vm_page_mem_free instead of vm_page_free_count, update types accordingly. * vm/vm_resident.c (vm_page_free_count, vm_page_free_count_minimum): Remove variables. (vm_page_free_avail): New variable. (vm_page_bootstrap, vm_page_grab, vm_page_release, vm_page_grab_contig, vm_page_free_contig, vm_page_wait): Use vm_page_mem_free instead of vm_page_free_count, update types accordingly, don't set vm_page_free_count_minimum. * vm/vm_user.c (vm_statistics): Likewise. --- vm/vm_page.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'vm/vm_page.h') diff --git a/vm/vm_page.h b/vm/vm_page.h index 4e870d82..6f4f3c22 100644 --- a/vm/vm_page.h +++ b/vm/vm_page.h @@ -161,8 +161,6 @@ queue_head_t vm_page_queue_active; /* active memory queue */ extern queue_head_t vm_page_queue_inactive; /* inactive memory queue */ -extern -int vm_page_free_count; /* How many pages are free? */ extern int vm_page_fictitious_count;/* How many fictitious pages are free? */ extern @@ -483,12 +481,16 @@ struct vm_page * vm_page_lookup_pa(phys_addr_t pa); * * The selector is used to determine the segments from which allocation can * be attempted. + * + * This function should only be used by the vm_resident module. */ struct vm_page * vm_page_alloc_pa(unsigned int order, unsigned int selector, unsigned short type); /* * Release a block of 2^order physical pages. + * + * This function should only be used by the vm_resident module. */ void vm_page_free_pa(struct vm_page *page, unsigned int order); @@ -507,4 +509,12 @@ void vm_page_info_all(void); */ phys_addr_t vm_page_mem_size(void); +/* + * Return the amount of free (unused) pages. + * + * XXX This currently relies on the kernel being non preemptible and + * uniprocessor. + */ +unsigned long vm_page_mem_free(void); + #endif /* _VM_VM_PAGE_H_ */ -- cgit v1.2.3