static void copy_data_pages(struct pbe *pblist) { struct zone *zone; unsigned long zone_pfn; struct pbe *pbe, *p; pbe = pblist; for_each_zone (zone) { if (is_highmem(zone)) continue; mark_free_pages(zone); /* This is necessary for swsusp_free() */ for_each_pb_page (p, pblist) SetPageNosaveFree(virt_to_page(p)); for_each_pbe (p, pblist) SetPageNosaveFree(virt_to_page(p->address)); for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) { if (saveable(zone, &zone_pfn)) { struct page *page; page = pfn_to_page(zone_pfn + zone->zone_start_pfn); BUG_ON(!pbe); pbe->orig_address = (unsigned long)page_address(page); /* copy_page is not usable for copying task structs. */ memcpy((void *)pbe->address, (void *)pbe->orig_address, PAGE_SIZE); pbe = pbe->next; } } } BUG_ON(pbe); }
static void copy_data_pages(void) { struct zone *zone; unsigned long zone_pfn; struct pbe * pbe = pagedir_nosave; int to_copy = nr_copy_pages; for_each_zone(zone) { if (is_highmem(zone)) continue; mark_free_pages(zone); for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) { if (saveable(zone, &zone_pfn)) { struct page * page; page = pfn_to_page(zone_pfn + zone->zone_start_pfn); pbe->orig_address = (long) page_address(page); /* copy_page is not usable for copying task structs. */ memcpy((void *)pbe->address, (void *)pbe->orig_address, PAGE_SIZE); pbe++; to_copy--; } } } BUG_ON(to_copy); }
static void count_pages(void) { unsigned long pfn; int n = 0; for (pfn = 0; pfn < max_pfn; pfn++) { if (saveable(&pfn)) n++; } pmdisk_pages = n; }
static unsigned count_data_pages(void) { struct zone *zone; unsigned long zone_pfn; unsigned int n = 0; for_each_zone (zone) { if (is_highmem(zone)) continue; mark_free_pages(zone); for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) n += saveable(zone, &zone_pfn); } return n; }
static void copy_pages(void) { struct pbe * p = pagedir_save; unsigned long pfn; int n = 0; for (pfn = 0; pfn < max_pfn; pfn++) { if (saveable(&pfn)) { n++; p->orig_address = ADDRESS(pfn); copy_page((void *) p->address, (void *) p->orig_address); p++; } } BUG_ON(n != pmdisk_pages); }