--- linux-2.6.0-test8-base/kernel/sysctl.c 2003-10-20 14:16:54.000000000 +1000 +++ linux-2.6.0-test8/kernel/sysctl.c 2003-11-03 10:49:15.000000000 +1100 @@ -664,11 +664,8 @@ static ctl_table vm_table[] = { .procname = "swappiness", .data = &vm_swappiness, .maxlen = sizeof(vm_swappiness), - .mode = 0644, - .proc_handler = &proc_dointvec_minmax, - .strategy = &sysctl_intvec, - .extra1 = &zero, - .extra2 = &one_hundred, + .mode = 0444 /* read-only*/, + .proc_handler = &proc_dointvec, }, #ifdef CONFIG_HUGETLB_PAGE { --- linux-2.6.0-test8-base/mm/vmscan.c 2003-10-20 14:16:54.000000000 +1000 +++ linux-2.6.0-test8/mm/vmscan.c 2003-11-03 11:38:08.542960408 +1100 @@ -47,7 +47,7 @@ /* * From 0 .. 100. Higher means more swappy. */ -int vm_swappiness = 60; +int vm_swappiness = 0; static long total_memory; #ifdef ARCH_HAS_PREFETCH @@ -600,6 +600,7 @@ refill_inactive_zone(struct zone *zone, LIST_HEAD(l_active); /* Pages to go onto the active_list */ struct page *page; struct pagevec pvec; + struct sysinfo i; int reclaim_mapped = 0; long mapped_ratio; long distress; @@ -641,14 +642,38 @@ refill_inactive_zone(struct zone *zone, */ mapped_ratio = (ps->nr_mapped * 100) / total_memory; + si_swapinfo(&i); + if (unlikely(!i.totalswap)) + vm_swappiness = 0; + else { + int app_centile, swap_centile; + + /* + * app_centile is the percentage of physical ram used + * by application pages. + */ + si_meminfo(&i); + app_centile = 100 - (((i.freeram + get_page_cache_size() - + swapper_space.nrpages) * 100) / i.totalram); + + /* + * swap_centile is the percentage of free swap. + */ + swap_centile = i.freeswap * 100 / i.totalswap; + + /* + * Autoregulate vm_swappiness to be equal to the lowest of + * app_centile and swap_centile. -ck + */ + vm_swappiness = min(app_centile, swap_centile); + } + /* * Now decide how much we really want to unmap some pages. The mapped * ratio is downgraded - just because there's a lot of mapped memory * doesn't necessarily mean that page reclaim isn't succeeding. * * The distress ratio is important - we don't want to start going oom. - * - * A 100% value of vm_swappiness overrides this algorithm altogether. */ swap_tendency = mapped_ratio / 2 + distress + vm_swappiness;