Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031080AbbD1Nkh (ORCPT ); Tue, 28 Apr 2015 09:40:37 -0400 Received: from mail.skyhub.de ([78.46.96.112]:37437 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030453AbbD1Nkb (ORCPT ); Tue, 28 Apr 2015 09:40:31 -0400 Date: Tue, 28 Apr 2015 15:40:12 +0200 From: Borislav Petkov To: Denys Vlasenko Cc: Linus Torvalds , Andy Lutomirski , Andy Lutomirski , X86 ML , "H. Peter Anvin" , Denys Vlasenko , Brian Gerst , Ingo Molnar , Steven Rostedt , Oleg Nesterov , Frederic Weisbecker , Alexei Starovoitov , Will Drewry , Kees Cook , Linux Kernel Mailing List , Mel Gorman Subject: Re: [PATCH] x86_64, asm: Work around AMD SYSRET SS descriptor attribute issue Message-ID: <20150428134012.GC19025@pd.tnic> References: <20150427113506.GG6774@pd.tnic> <20150427154631.GB28871@pd.tnic> <20150427164024.GD28871@pd.tnic> <20150427183854.GG28871@pd.tnic> <20150427191145.GJ28871@pd.tnic> <553E8C3E.8040701@redhat.com> <20150427194512.GK28871@pd.tnic> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20150427194512.GK28871@pd.tnic> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3180 Lines: 130 On Mon, Apr 27, 2015 at 09:45:12PM +0200, Borislav Petkov wrote: > > Maybe you are measuring random noise. > > Yeah. Last exercise tomorrow. Let's see what those numbers would look > like. Right, so with Mel's help, I did a simple microbenchmark to measure how many cycles a syscall (getpid()) needs on 4.1-rc1 and with your patch. 4.1-rc1 ------- Running 60 times, 10000000 loops per run. Cycles: 3977233027, cycles/syscall: 397.723303 Cycles: 3964979519, cycles/syscall: 396.497952 Cycles: 3962470261, cycles/syscall: 396.247026 Cycles: 3963524693, cycles/syscall: 396.352469 Cycles: 3962853704, cycles/syscall: 396.285370 Cycles: 3964603727, cycles/syscall: 396.460373 Cycles: 3964758926, cycles/syscall: 396.475893 Cycles: 3965268019, cycles/syscall: 396.526802 Cycles: 3962198683, cycles/syscall: 396.219868 ... 4.1-rc1 + 17be0aec74fb036eb4eb32c2268f3420a034762b from tip ----------------------------------------------------------- Running 60 times, 10000000 loops per run. Cycles: 3973575441, cycles/syscall: 397.357544 Cycles: 3963999393, cycles/syscall: 396.399939 Cycles: 3962613575, cycles/syscall: 396.261357 Cycles: 3963440408, cycles/syscall: 396.344041 Cycles: 3963475255, cycles/syscall: 396.347526 Cycles: 3964471785, cycles/syscall: 396.447179 Cycles: 3962890513, cycles/syscall: 396.289051 Cycles: 3964940114, cycles/syscall: 396.494011 Cycles: 3964186426, cycles/syscall: 396.418643 ... So yeah, your patch is fine - provided I've done everything right. Here's the microbenchmark: --- /* * How to run: * * taskset -c ./sys */ #include #include #include #include typedef unsigned long long u64; #define DECLARE_ARGS(val, low, high) unsigned low, high #define EAX_EDX_VAL(val, low, high) ((low) | ((u64)(high) << 32)) #define EAX_EDX_ARGS(val, low, high) "a" (low), "d" (high) #define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high) static __always_inline unsigned long long rdtsc(void) { DECLARE_ARGS(val, low, high); asm volatile("rdtsc" : EAX_EDX_RET(val, low, high)); return EAX_EDX_VAL(val, low, high); } static long my_getpid(void) { long ret; asm volatile ("syscall" : "=a" (ret) : "a" (SYS_getpid) : "memory", "cc", "rcx", "r11"); return ret; } static inline u64 read_tsc(void) { u64 ret; asm volatile("mfence"); ret = rdtsc(); asm volatile("mfence"); return ret; } int main() { int i, j; u64 p1, p2; u64 count = 0; #define TIMES 60 #define LOOPS 10000000ULL printf("Running %d times, %lld loops per run.\n", TIMES, LOOPS); for (j = 0; j < TIMES; j++) { for (i = 0; i < LOOPS; i++) { p1 = read_tsc(); my_getpid(); p2 = read_tsc(); count += (p2 - p1); } printf("Cycles: %lld, cycles/syscall: %f\n", count, (double)count / LOOPS); count = 0; } return 0; } -- Regards/Gruss, Boris. ECO tip #101: Trim your mails when you reply. -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/