Re: [another patch] Re: 2.0.31-pre5: Couldn't get a free page.....

Dr. Werner Fink (werner@suse.de)
Fri, 15 Aug 1997 10:43:01 +0200


> This one causes it even the first time. All the settings
> I tested produced the debug message on the 2nd run. I didn't
> bother to test it a 3rd time. I will now test it with 8 64 96
> and your patch.
>
> Well, with 2.0.31-pre6+Benjamin's patch

Could you apply the appended patch. It's from Krzysztof Strasburger.
Does it help? If it helps this small patch should go into 2.0.31.

[...]

>
> With kernel defaults (64 96 128) the first two sequential runs
> didn't produce any messages! But, the following two runs
> both did. I didn't even bother to run simultaneous bonnies.

Look's like the pages occupied in the swap cache should be
counted for the calculation done by vm_enough_memory() as Krzysztof
Strasburger mentioned.

>
> Does any of you hackers see a pattern here? I'm just a dumb
> cs-student but I would say the more times I run bonnie the
> frequent the messages get (I'm not doing anything besides
> writing this message between runs), wouldn't that implicate
> that there is a atomic/non-atomic buffer/cache/page leak
> somewhere? Maybe I'm just over my head here. Well, tell me
> what to test next I will give it a shot when I return from work.

Werner

----------------------------------------------------------------
diff -u -r linux.orig/include/linux/swap.h linux/include/linux/swap.h
--- linux.orig/include/linux/swap.h Mon Jun 3 14:38:37 1996
+++ linux/include/linux/swap.h Fri Apr 18 17:11:22 1997
@@ -34,6 +34,7 @@

extern int nr_swap_pages;
extern int nr_free_pages;
+extern int nr_swap_cache_pages;
extern atomic_t nr_async_pages;
extern int min_free_pages;
extern int free_pages_low;
@@ -113,10 +114,12 @@
swap_cache_find_total++;
#endif
entry = xchg(swap_cache + index, 0);
+ if (entry) {
#ifdef SWAP_CACHE_INFO
- if (entry)
swap_cache_find_success++;
#endif
+ nr_swap_cache_pages--;
+ }
return entry;
}

@@ -133,6 +136,7 @@
swap_cache_del_success++;
#endif
swap_free(entry);
+ nr_swap_cache_pages--;
return 1;
}
return 0;
diff -u -r linux.orig/mm/mmap.c linux/mm/mmap.c
--- linux.orig/mm/mmap.c Fri Dec 6 22:09:24 1996
+++ linux/mm/mmap.c Fri Apr 18 17:12:08 1997
@@ -55,9 +55,10 @@
long freepages;
freepages = buffermem >> PAGE_SHIFT;
freepages += page_cache_size;
- freepages >>= 1;
+/* freepages >>= 1;*/
freepages += nr_free_pages;
freepages += nr_swap_pages;
+ freepages += nr_swap_cache_pages;
freepages -= MAP_NR(high_memory) >> 4;
return freepages > pages;
}
diff -u -r linux.orig/mm/swap_state.c linux/mm/swap_state.c
--- linux.orig/mm/swap_state.c Wed Mar 13 14:17:23 1996
+++ linux/mm/swap_state.c Fri Apr 18 17:12:11 1997
@@ -32,6 +32,8 @@
*/
unsigned long *swap_cache;

+int nr_swap_cache_pages = 0;
+
#ifdef SWAP_CACHE_INFO
unsigned long swap_cache_add_total = 0;
unsigned long swap_cache_add_success = 0;
@@ -64,6 +66,7 @@
#ifdef SWAP_CACHE_INFO
swap_cache_add_success++;
#endif
+ nr_swap_cache_pages++;
return 1;
}
return 0;
diff -u -r linux.orig/mm/swapfile.c linux/mm/swapfile.c
--- linux.orig/mm/swapfile.c Thu Apr 10 23:47:14 1997
+++ linux/mm/swapfile.c Fri Apr 18 17:12:12 1997
@@ -570,6 +570,7 @@
++val->totalswap;
}
}
+ val->freeswap += nr_swap_cache_pages;
val->freeswap <<= PAGE_SHIFT;
val->totalswap <<= PAGE_SHIFT;
return;