Re: Software suspend testing in 2.6.0-test1

Peter Osterlund
2003-07-18T15:43:08Z

Pavel Machek <pavel@ucw.cz> writes:

> > However I'm trying to remember why the code exists at all. Why doesn't
> > swsusp just allocate lots of pages then free them again?
>
> Because that either
>
> a) does not free enough pages or
>
> b) triggers OOM killer.
>
> It was actually your idea, IIRC ;-).
>
> Ahha, you seem to be addressing that in your code. Peter, perhaps you
> want to test that one?

I tried the patch below, but it didn't work. Nothing (or very little)
was swapped out to disk. I also tried using GFP_KERNEL, but that
seemed to cause a deadlock. (Maybe it would have gone OOM if I had
waited long enough). I think the problem is that pdflush and friends
are already frozen when this code runs.

--- linux/kernel/suspend.c.old Fri Jul 18 15:46:48 2003
+++ linux/kernel/suspend.c Fri Jul 18 15:45:51 2003
@@ -621,10 +621,32 @@
*/
static void free_some_memory(void)
{
- printk("Freeing memory: ");
- while (shrink_all_memory(10000))
- printk(".");
+ LIST_HEAD(list);
+ struct page *page, *tmp;
+ int sleep_count = 0;
+ int i = 0;
+
+ while (sleep_count < 10) {
+ page = alloc_page(GFP_ATOMIC);
+ if (page) {
+ list_add(&page->list, &list);
+ sleep_count = 0;
+ } else {
+ blk_congestion_wait(WRITE, HZ/20);
+ sleep_count++;
+ }
+ i++;
+ if (!(i%1000))
+ printk(".");
+ }
printk("|\n");
+
+ i = 0;
+ list_for_each_entry_safe(page, tmp, &list, list) {
+ __free_page(page);
+ i++;
+ }
+ printk("%d pages freed\n", i);
}

/* Make disk drivers accept operations, again */

--
Peter Osterlund - petero2@telia.com