[linux-pm] memcpy() in swsusp (was: Re: [PATCH 2/2] Fix console handling during suspend/resume)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux