Messages in this thread Patch in this message |  | | | Date | Sun, 29 Aug 2004 15:54:03 +0200 | | From | Erik Rigtorp <> | | Subject | Re: [PATCH] make swsusp produce nicer screen output |
| |
On Tue, Aug 24, 2004 at 11:49:30PM +0200, Pavel Machek wrote: > Hi! > > > > Well, it looks nice, be sure to submit smooth version :-). > > I'm working on it :). > > > > I'd leave dots here. Its usefull to see if it done something or not. > > > > Well, it will display a spinning thingy that is updated every time > > shrink_all_memory(10000) returns. Maybe you want to see how much memory was > > freed? > > Yes, it is quite important to see how many pages were freed even after > freeing stopped. "done (1234 pages freed)" would solve it... Added code for this in the new patch
> > > And do we need to handle the case when nr_copy_pages < 100? > > It really should not crash. 100 pages is 4MB. Thats little low but > seems possible.
Well it's probably best to handle this case, to be on the safe side.
Here's a new version of the patch.
diff -Nru linux-2.6.8.1-mm2/kernel/power/disk.c linux-2.6.8.1-mm2-erkki/kernel/power/disk.c --- linux-2.6.8.1-mm2/kernel/power/disk.c 2004-08-20 17:10:58.000000000 +0200 +++ linux-2.6.8.1-mm2-erkki/kernel/power/disk.c 2004-08-29 14:16:53.000000000 +0200 @@ -85,10 +85,20 @@ static void free_some_memory(void) { - printk("Freeing memory: "); - while (shrink_all_memory(10000)) - printk("."); - printk("|\n"); + unsigned int i = 0; + unsigned int tmp; + unsigned long pages = 0; + char *p = "-\\|/"; + + printk("Freeing memory... "); + while (tmp = shrink_all_memory(10000)) { + pages += tmp; + printk("\b%c", p[i]); + i++; + if (i > 3) + i = 0; + } + printk("\bdone (%li pages freed)\n", pages); } diff -Nru linux-2.6.8.1-mm2/kernel/power/swsusp.c linux-2.6.8.1-mm2-erkki/kernel/power/swsusp.c --- linux-2.6.8.1-mm2/kernel/power/swsusp.c 2004-08-20 17:10:58.000000000 +0200 +++ linux-2.6.8.1-mm2-erkki/kernel/power/swsusp.c 2004-08-29 13:51:55.000000000 +0200 @@ -296,15 +296,21 @@ { int error = 0; int i; - - printk( "Writing data to swap (%d pages): ", nr_copy_pages ); + unsigned int mod; + + if (nr_copy_pages < 100) + mod = 1; + else + mod = nr_copy_pages / 100; + + printk( "Writing data to swap (%d pages)... ", nr_copy_pages ); for (i = 0; i < nr_copy_pages && !error; i++) { - if (!(i%100)) - printk( "." ); + if (!(i%mod)) + printk( "\b\b\b\b%3d%%", i / mod ); error = write_page((pagedir_nosave+i)->address, &((pagedir_nosave+i)->swap_address)); } - printk(" %d Pages done.\n",i); + printk("\b\b\b\bdone\n"); return error; } @@ -534,8 +540,6 @@ if (!pfn_valid(pfn)) return 0; - if (!(pfn%1000)) - printk("."); page = pfn_to_page(pfn); BUG_ON(PageReserved(page) && PageNosave(page)); if (PageNosave(page)) @@ -556,15 +560,28 @@ { struct zone *zone; unsigned long zone_pfn; + unsigned long mod; + + printk("Counting pages... "); nr_copy_pages = 0; for_each_zone(zone) { if (!is_highmem(zone)) { - for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) + if (zone->spanned_pages < 100) + mod = 1; + else + mod = zone->spanned_pages / 100; + + for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) { nr_copy_pages += saveable(zone, &zone_pfn); + if (!(zone_pfn % mod)) + printk("\b\b\b\b%3ld%%", zone_pfn / mod); + } } } + + printk("\b\b\b\bdone\n"); } @@ -573,9 +590,17 @@ struct zone *zone; unsigned long zone_pfn; struct pbe * pbe = pagedir_nosave; + unsigned long mod; + printk("Copying pages... "); + for_each_zone(zone) { - if (!is_highmem(zone)) + if (!is_highmem(zone)) { + if (zone->spanned_pages < 100) + mod = 1; + else + mod = zone->spanned_pages / 100; + for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) { if (saveable(zone, &zone_pfn)) { struct page * page; @@ -584,9 +609,14 @@ /* copy_page is no usable for copying task structs. */ memcpy((void *)pbe->address, (void *)pbe->orig_address, PAGE_SIZE); pbe++; + if (!(zone_pfn % mod)) + printk("\b\b\b\b%3ld%%", zone_pfn / mod); } } + } } + + printk("\b\b\b\bdone\n"); } @@ -1150,14 +1180,20 @@ struct pbe * p; int error; int i; - + int mod; + + if (nr_copy_pages < 100) + mod = 1; + else + mod = nr_copy_pages / 100; + if ((error = swsusp_pagedir_relocate())) return error; - printk( "Reading image data (%d pages): ", nr_copy_pages ); + printk( "Reading image data (%d pages): ", nr_copy_pages ); for(i = 0, p = pagedir_nosave; i < nr_copy_pages && !error; i++, p++) { - if (!(i%100)) - printk( "." ); + if (!(i%mod)) + printk( "\b\b\b\b%3d%%", i / mod ); error = bio_read_page(swp_offset(p->swap_address), (void *)p->address); } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |