hibernate/resume regression
A message that is not in the archive (sent off-list or not yet received): [email protected]
----- Original Message -----
Quoted 1 line
Yes we know; does the fix currently in mainstream work for you?
Yes, it worked for me.
CAI Qian
Quoted 83 lines
Sent from my mobile phone. Please pardon any lack of formatting.
CAI Qian <[email protected]> wrote:
OK, reverted the following patch fixed the problem. CAI Qian commit
e5f15b45ddf3afa2bbbb10c7ea34fb32b6de0a0eAuthor: Yinghai Lu <[email protected]> Date: Fri Feb 18 11:30:30 2011 +0000 x86: Cleanup highmap after brk is concluded Nowcleanup_highmapactually is in two
steps: one is early inhead64.cand only clears above_end; a second one is ininit_memory_mapping()and tries to clean from_brk_endto_end. It should check if those boundaries arePMD_SIZEaligned but currently does not. Alsoinit_memory_mapping()is called several times for numa or memory hotplug, so we really should not handle initial kernel mappings there. This patch movescleanup_highmap()down after_brk_endis settled so we can do everything in one step. Also we honormax_pfn_mappedin the implementation ofcleanup_highmap.Signed-off-by Yinghai Lu <[email protected]> Signed-off-by: StefanoStabellini <[email protected]> LKML-Reference:
<alpine.DEB.2.00.1103171739050.3382@kaball-desktop> Signed-off-by: H. Peter Anvin <[email protected]> diff --gita/arch/x86/kernel/head64.cb/arch/x86/kernel/head64.cindex 2d2673c..5655c22 100644 ---a/arch/x86/kernel/head64.c+++b/arch/x86/kernel/head64.c@@ -77,9 +77,6 @@ void__initx86_64_start_kernel(char * real_mode_data)/* Make NULL pointers segfault */zap_identity_mappings(); - /* Cleanup the over mapped high alias */ -cleanup_highmap(); -max_pfn_mapped=KERNEL_IMAGE_SIZE>>PAGE_SHIFT; for (i = 0; i <NUM_EXCEPTION_VECTORS; i++) { diff --gita/arch/x86/kernel/setup.cb/arch/x86/kernel/setup.cindex b176f2b..4a52a5f 100644 ---a/arch/x86/kernel/setup.c+++b/arch/x86/kernel/setup.c@@ -294,30 +294,11 @@ static void__initinit_gbpages(void)elsedirect_gbpages= 0; } - -static void__initcleanup_highmap_brk_end(void)-{ -pud_t*pud; -pmd_t*pmd; - -mmu_cr4_features=read_cr4(); - - /* - *_brk_endcannot change anymore, but it and_endmay be - * located on different 2M pages.cleanup_highmap(), however, - * can only consider_endwhen it runs, so destroy any - * mappings beyond_brk_endhere. - */ - pud =pud_offset(pgd_offset_k(_brk_end), _brk_end); - pmd =pmd_offset(pud, _brk_end - 1); - while (++pmd <=pmd_offset(pud, (unsigned long)_end - 1)) -pmd_clear(pmd); -} #else static inline voidinit_gbpages(void){ } -static inline voidcleanup_highmap_brk_end(void)+static void__initcleanup_highmap(void){ } #endif @@ -330,8 +311,6 @@ static void__initreserve_brk(void)/* Mark brk area as locked down and no longer taking any new allocations */_brk_start= 0; - -cleanup_highmap_brk_end(); } #ifdefCONFIG_BLK_DEV_INITRD@@ -950,6 +929,8 @@ void__initsetup_arch(char **cmdline_p)*/reserve_brk(); +cleanup_highmap(); + memblock.current_limit =get_max_mapped();memblock_x86_fill(); diff --gita/arch/x86/mm/init_64.cb/arch/x86/mm/init_64.cindex a08a62c..7026505 100644 ---a/arch/x86/mm/init_64.c+++b/arch/x86/mm/init_64.c@@ -51,6 +51,7 @@ #include <asm/numa.h> #include <asm/cacheflush.h> #include <asm/init.h> +#include <asm/setup.h> static int__initparse_direct_gbpages_off(char *arg){ @@ -293,18 +294,18 @@ void__initinit_extra_mapping_uc(unsigned long phys, unsigned long size)* to the compile time generated pmds. This results in invalid pmds up * to the point where we hit the physaddr 0 mapping. * - * We limit the mappings to the region from_textto_end._endis - * rounded up to the 2MB boundary. This catches the invalid pmds as + * We limit the mappings to the region from_textto_brk_end._brk_end+ * is rounded up to the 2MB boundary. This catches the invalid pmds as * well, as they are located before_text: */ void__initcleanup_highmap(void){ unsigned long vaddr =__START_KERNEL_map; - unsigned long end =roundup((unsigned long)_end, PMD_SIZE)- 1; + unsigned longvaddr_end=__START_KERNEL_map+ (max_pfn_mapped<<PAGE_SHIFT); + unsigned long end =roundup((unsigned long)_brk_end, PMD_SIZE)- 1;pmd_t*pmd =level2_kernel_pgt; -pmd_t*last_pmd= pmd +PTRS_PER_PMD; - for (; pmd <last_pmd; pmd++, vaddr +=PMD_SIZE) { + for (; vaddr +PMD_SIZE
- 1 <vaddr_end; pmd++, vaddr +=PMD_SIZE) { if (pmd_none(*pmd)) continue; if (vaddr < (unsigned long)_text|| vaddr > end) ----- Original Message ----- > The latest Linus tree had a regression that prevent hibernate/resume > from working. > > It is now failing to resume every time tried after hibernate. > > PM: Starting manual resume from disk > Freezing user space processes ... > EXT4-fs (dm-0):
INFO: recovery required on readonly filesystem > EXT4-fs (dm-0): write access will be enabled during recovery > EXT4-fs (dm-0): recovery complete > EXT4-fs (dm-0): mounted filesystem with ordered data mode.
Opts: > (null) > (elapsed 0.18 seconds) done. > Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done. > PM: Loading and decompressing image data (301765 pages) ... done > PM: Read 1207060 kbytes in 6.47 seconds (186.56 MB/s) > serial 00:08: disabled > > I have not had a chance to track down the offensive patch(es) yet. > > CAI Qian