lkml.org 
[lkml]   [2017]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] Fix resume on x86-32 machines
    On Sun 2017-12-10 13:58:23, Andy Lutomirski wrote:
    > > On Dec 10, 2017, at 1:38 PM, Pavel Machek <pavel@ucw.cz> 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 <pavel@ucw.cz>
    > > 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
    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2017-12-10 23:21    [W:2.147 / U:0.248 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site