Hi! > > > > Do you mean the one in copy_data_pages()? Indeed, that may be a problem if > > > > the MMU-based memcpy is used. > > > > > > > > Pavel, should we fix this? > > > > > > Of course it needs fixing ... it's a bug, also a regression. > > > > > > My question is where to fix... swsusp_arch_resume() seems most > > > correct, albeit messy. There's unfortunately no exact parallel > > > on the resume side to where the bug was inserted. Those of us > > > who avoid hacking asm code might prefer restore_processor_state(). > > > > Well, I meant replacing the memcpy() in copy_data_pages with an open coded > > copying loop. That should be enough to fix the problem. > > To be more specific, could you please check if the appended patch (tested > on x86_64) helps? ACK. Please submit it to akpm so it gets fixed. Pavel > kernel/power/snapshot.c | 10 ++++++++-- > 1 files changed, 8 insertions(+), 2 deletions(-) > > Index: linux-2.6.17-mm6/kernel/power/snapshot.c > =================================================================== > --- linux-2.6.17-mm6.orig/kernel/power/snapshot.c > +++ linux-2.6.17-mm6/kernel/power/snapshot.c > @@ -227,11 +227,17 @@ static void copy_data_pages(struct pbe * > for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) { > if (saveable(zone, &zone_pfn)) { > struct page *page; > + long *src, *dst; > + int n; > + > 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); > + /* copy_page and memcpy are not usable for copying task structs. */ > + dst = (long *)pbe->address; > + src = (long *)pbe->orig_address; > + for (n = PAGE_SIZE / sizeof(long); n; n--) > + *dst++ = *src++; > pbe = pbe->next; > } > } -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html