Thread (6 messages) 6 messages, 4 authors, 2000-11-09
DORMANTno replies

[PATCH] Reserve VM for root (was: Re: Looking for better VM)

From: Szabolcs Szakacsits <hidden>
Date: 2000-11-09 16:20:59
Also in: lkml

On Wed, 8 Nov 2000, Rik van Riel wrote:
OK. This is a lot more reasonable. 
Just the same what was in my first in email.
I'm actually looking into putting non-overcommit as a configurable
option in the kernel.
Nice to hear, please make it a boot time option, not a compile time
one. Also a control for how many percent the kernel can overcommit
would be nice -- this is how modern Unices do.
 
However, this does not save you from the fact that the
system is essentially deadlocked when nothing can get
more memory and nothing goes away. 
I've also never said OOM killer should be disabled. In theory the
non-overcommitting systems deadlock, Linux survives. Ironically
usually it's just the opposite in practice. Any user can
deadlock/crash Linux [default install, no quotas] but not an
non-overcommitting system [root can clean up]. Here is an example code
"simulating" a leaking daemon that will "deadlock" Linux even with
your OOM killer patch [that is anyway *MUCH* better than the actually
non-existing one in 2.2.x kernels]:

main() { while(1) if (fork()) malloc(1); }

With the patch below I could ssh to the host and killall the offending
processes. To enable reserving VM space for root do 

echo -1 > /proc/sys/vm/overcommit_memory 

The number of reserved pages can be tuned via /proc/sys/vm/reserved,
default is 5% of the RAM (note, RAM won't be reserved, but VM).

BTW, I wanted to take a look at the frequently mentioned beancounter patch, 
here is the current state,
	http://www.asp-linux.com/en/products/ubpatch.shtml 
"Sorry, due to growing expenses for support of public version of ASPcomplete 
we do not provide sources till first official release."

	Szaka


diff -ur linux.orig/include/linux/sysctl.h linux/include/linux/sysctl.h
--- linux.orig/include/linux/sysctl.h	Thu Nov  9 08:20:19 2000
+++ linux/include/linux/sysctl.h	Thu Nov  9 06:30:11 2000
@@ -122,7 +122,8 @@
 	VM_PAGECACHE=7,		/* struct: Set cache memory thresholds */
 	VM_PAGERDAEMON=8,	/* struct: Control kswapd behaviour */
 	VM_PGT_CACHE=9,		/* struct: Set page table cache parameters */
-	VM_PAGE_CLUSTER=10	/* int: set number of pages to swap together */
+	VM_PAGE_CLUSTER=10,	/* int: set number of pages to swap together */
+	VM_RESERVED=11		/* int: number of pages reserved for root */
 };
 
 
diff -ur linux.orig/kernel/sysctl.c linux/kernel/sysctl.c
--- linux.orig/kernel/sysctl.c	Thu Nov  9 08:20:19 2000
+++ linux/kernel/sysctl.c	Thu Nov  9 06:27:33 2000
@@ -37,6 +37,7 @@
 extern int bdf_prm[], bdflush_min[], bdflush_max[];
 extern char binfmt_java_interpreter[], binfmt_java_appletviewer[];
 extern int sysctl_overcommit_memory;
+extern int vm_reserved;
 extern int nr_queued_signals, max_queued_signals;
 
 #ifdef CONFIG_KMOD
@@ -259,6 +260,8 @@
 	 &pgt_cache_water, 2*sizeof(int), 0600, NULL, &proc_dointvec},
 	{VM_PAGE_CLUSTER, "page-cluster", 
 	 &page_cluster, sizeof(int), 0600, NULL, &proc_dointvec},
+	{VM_RESERVED, "reserved", 
+	 &vm_reserved, sizeof(int), 0600, NULL, &proc_dointvec},
 	{0}
 };
 
diff -ur linux.orig/mm/mmap.c linux/mm/mmap.c
--- linux.orig/mm/mmap.c	Thu Nov  9 08:20:19 2000
+++ linux/mm/mmap.c	Thu Nov  9 08:17:10 2000
@@ -40,6 +40,7 @@
 kmem_cache_t *vm_area_cachep;
 
 int sysctl_overcommit_memory;
+int vm_reserved;
 
 /* Check that a process has enough memory to allocate a
  * new virtual mapping.
@@ -59,7 +60,7 @@
 	long free;
 	
         /* Sometimes we want to use more memory than we have. */
-	if (sysctl_overcommit_memory)
+	if (sysctl_overcommit_memory == 1)
 	    return 1;
 
 	free = buffermem >> PAGE_SHIFT;
@@ -67,6 +68,8 @@
 	free += nr_free_pages;
 	free += nr_swap_pages;
 	free -= (page_cache.min_percent + buffer_mem.min_percent + 2)*num_physpages/100; 
+	if (sysctl_overcommit_memory == -1 && current->uid && free < vm_reserved)
+		return 0;
 	return free > pages;
 }
 
@@ -872,6 +875,11 @@
 
 void __init vma_init(void)
 {
+	struct sysinfo i;
+
+	si_meminfo(&i);
+	vm_reserved = (i.totalram >> PAGE_SHIFT) / 20;  
+
 	vm_area_cachep = kmem_cache_create("vm_area_struct",
 					   sizeof(struct vm_area_struct),
 					   0, SLAB_HWCACHE_ALIGN,

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux.eu.org/Linux-MM/
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help