Re: [PATCH backport] x86, vdso: Use asm volatile in __getcpu

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

 



On Tue, Jan 13, 2015 at 02:44:09PM -0800, Andy Lutomirski wrote:
> commit 1ddf0b1b11aa8a90cef6706e935fc31c75c406ba upstream
>

Thank you for the backport Andy.  I'll queue it for the 3.16 kernel.

Cheers,
--
Luís

> In Linux 3.18 and below, GCC hoists the lsl instructions in the
> pvclock code all the way to the beginning of __vdso_clock_gettime,
> slowing the non-paravirt case significantly.  For unknown reasons,
> presumably related to the removal of a branch, the performance issue
> is gone as of
> 
> e76b027e6408 x86,vdso: Use LSL unconditionally for vgetcpu
> 
> but I don't trust GCC enough to expect the problem to stay fixed.
> 
> There should be no correctness issue, because the __getcpu calls in
> __vdso_vlock_gettime were never necessary in the first place.
> 
> Note to stable maintainers: In 3.18 and below, depending on
> configuration, gcc 4.9.2 generates code like this:
> 
>      9c3:       44 0f 03 e8             lsl    %ax,%r13d
>      9c7:       45 89 eb                mov    %r13d,%r11d
>      9ca:       0f 03 d8                lsl    %ax,%ebx
> 
> This patch won't apply as is to any released kernel, but I'll send a
> trivial backported version if needed.
> 
> [
>  Backported by Andy Lutomirski.  Should apply to all affected
>  versions.  This fixes a functionality bug as well as a performance
>  bug: buggy kernels can infinite loop in __vdso_clock_gettime on
>  affected compilers.  See, for exammple:
> 
>  https://bugzilla.redhat.com/show_bug.cgi?id=1178975
> ]
> 
> Fixes: 51c19b4f5927 x86: vdso: pvclock gettime support
> Cc: stable@xxxxxxxxxxxxxxx # 3.8+
> Cc: Marcelo Tosatti <mtosatti@xxxxxxxxxx>
> Acked-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
> Signed-off-by: Andy Lutomirski <luto@xxxxxxxxxxxxxx>
> 
> Conflicts:
> 	arch/x86/include/asm/vgtod.h
> ---
>  arch/x86/include/asm/vsyscall.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/x86/include/asm/vsyscall.h b/arch/x86/include/asm/vsyscall.h
> index 2a46ca720afc..2874be9aef0a 100644
> --- a/arch/x86/include/asm/vsyscall.h
> +++ b/arch/x86/include/asm/vsyscall.h
> @@ -34,7 +34,7 @@ static inline unsigned int __getcpu(void)
>  		native_read_tscp(&p);
>  	} else {
>  		/* Load per CPU data from GDT */
> -		asm("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG));
> +		asm volatile ("lsl %1,%0" : "=r" (p) : "r" (__PER_CPU_SEG));
>  	}
>  
>  	return p;
> -- 
> 2.1.0
> 
> --
> To unsubscribe from this list: send the line "unsubscribe stable" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]