On Sun 2017-12-10 13:58:23, Andy Lutomirski wrote: > > On Dec 10, 2017, at 1:38 PM, Pavel Machek wrote: > > > > > > After 4.15-rc2, suspend stopped working on Thinkpad X60. 5b06bbc > > (unintentionally?) reordered stuff with respect to > > fix_processor_context() on 32-bit and 64-bit. We undo that change on > > 32-bit. > > > > Can you explain what was wrong with the reordering? Your patch certainly *looks* incorrect. > No, I can't, sorry. > I'm guessing that the real issue is that 32-bit needs %fs restored > early for TLS. Maybe. I can test patches... I don't think it would be good idea to revert 5b06bbcfc2c621da3009da8decb7511500c293ed, but since it introduced regression in -rc2, I believe we should fix the regression now, and then we can try to provide cleaner solution. As Linus noted, the code is quite "interesting". Pavel > > > While we are at it, fix a comment. > > > > Signed-off-by: Pavel Machek > > Fixes: 5b06bbcfc2c621da3009da8decb7511500c293ed > > > > diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c > > index 5191de1..af7b613 100644 > > --- a/arch/x86/power/cpu.c > > +++ b/arch/x86/power/cpu.c > > @@ -216,8 +216,8 @@ static void notrace __restore_processor_state(struct saved_context *ctxt) > > write_cr0(ctxt->cr0); > > > > /* > > - * now restore the descriptor tables to their proper values > > - * ltr is done i fix_processor_context(). > > + * Now restore the descriptor tables to their proper values > > + * ltr is done in fix_processor_context(). > > */ > > #ifdef CONFIG_X86_32 > > load_idt(&ctxt->idt); > > @@ -235,13 +235,11 @@ static void notrace __restore_processor_state(struct saved_context *ctxt) > > wrmsrl(MSR_GS_BASE, ctxt->gs_base); > > #endif > > > > - fix_processor_context(); > > - > > +#ifdef CONFIG_X86_32 > > /* > > - * Restore segment registers. This happens after restoring the GDT > > - * and LDT, which happen in fix_processor_context(). > > + * Restore segment registers. > > */ > > -#ifdef CONFIG_X86_32 > > + > > loadsegment(es, ctxt->es); > > loadsegment(fs, ctxt->fs); > > loadsegment(gs, ctxt->gs); > > @@ -252,8 +250,17 @@ static void notrace __restore_processor_state(struct saved_context *ctxt) > > */ > > if (boot_cpu_has(X86_FEATURE_SEP)) > > enable_sep_cpu(); > > + > > + fix_processor_context(); > > #else > > /* CONFIG_X86_64 */ > > + /* > > + * Restore segment registers. This happens after restoring the GDT > > + * and LDT, which happen in fix_processor_context(). > > + */ > > + > > + fix_processor_context(); > > + > > asm volatile ("movw %0, %%ds" :: "r" (ctxt->ds)); > > asm volatile ("movw %0, %%es" :: "r" (ctxt->es)); > > asm volatile ("movw %0, %%fs" :: "r" (ctxt->fs)); > > -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html