All of lore.kernel.org
 help / color / mirror / Atom feed
From: Borislav Petkov <bp@alien8.de>
To: "H. Peter Anvin" <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
	Andy Lutomirski <luto@amacapital.net>,
	Andy Lutomirski <luto@kernel.org>, X86 ML <x86@kernel.org>,
	Denys Vlasenko <vda.linux@googlemail.com>,
	Brian Gerst <brgerst@gmail.com>,
	Denys Vlasenko <dvlasenk@redhat.com>,
	Ingo Molnar <mingo@kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Oleg Nesterov <oleg@redhat.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Alexei Starovoitov <ast@plumgrid.com>,
	Will Drewry <wad@chromium.org>, Kees Cook <keescook@chromium.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Mel Gorman <mgorman@suse.com>
Subject: Re: [PATCH] x86_64, asm: Work around AMD SYSRET SS descriptor attribute issue
Date: Tue, 28 Apr 2015 17:55:11 +0200	[thread overview]
Message-ID: <20150428155511.GF19025@pd.tnic> (raw)
In-Reply-To: <2F6CA156-F03F-4F49-A6B9-7D1D1E1D805B@zytor.com>

On Mon, Apr 27, 2015 at 01:14:51PM -0700, H. Peter Anvin wrote:
> I did a microbenchmark in user space... let's see if I can find it.

How about the simple one below?

Provided it is correct, it shows that the 0x66-prefixed 3-byte NOPs are
better than the 0F 1F 00 suggested by the manual (Haha!):

$ taskset -c 3 ./nops
Running 600 times, 10000000 loops per run.
nop_0x90 average: 439.805220
nop_3_byte average: 442.412915

---
/*
 * How to run:
 *
 * taskset -c <cpunum> argv0
 */
#include <stdio.h>
#include <sys/syscall.h>
#include <stdlib.h>
#include <unistd.h>

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 inline u64 read_tsc(void)
{
	u64 ret;

	asm volatile("mfence");
	ret = rdtsc();
	asm volatile("mfence");

	return ret;
}

static inline void nop_0x90(void)
{
	asm volatile(
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"

			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"

			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
			".byte 0x66, 0x66, 0x90\n\t"
		    );
}

static inline void nop_3_byte(void)
{
	asm volatile(
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"

			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"

			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
			".byte 0x0f, 0x1f, 0x00\n\t"
		    );
}

int main()
{
	int i, j;
	u64 p1, p2;
	u64 r;
	double avg, t;

#define TIMES 600
#define LOOPS 10000000ULL

	printf("Running %d times, %lld loops per run.\n", TIMES, LOOPS);

	avg = 0;

	for (r = 0, j = 0; j < TIMES; j++) {
		for (i = 0; i < LOOPS; i++) {
			p1 = read_tsc();
			nop_0x90();
			p2 = read_tsc();

			r += (p2 - p1);
		}

		t = (double)r / LOOPS;

//		printf("NOP cycles: %lld, cycles/nop_0x90: %f\n", r, t);
		avg += t;
		r = 0;
	}

	printf("nop_0x90 average: %f\n", avg/TIMES);

	avg = 0;

	for (r = 0, j = 0; j < TIMES; j++) {
		for (i = 0; i < LOOPS; i++) {
			p1 = read_tsc();
			nop_3_byte();
			p2 = read_tsc();

			r += (p2 - p1);
		}

		t = (double)r / LOOPS;

//		printf("NOP cycles: %lld, cycles/nop_3_byte: %f\n", r, t);
		avg += t;
		r = 0;
	}

	printf("nop_3_byte average: %f\n", avg/TIMES);

	return 0;
}

-- 
Regards/Gruss,
    Boris.

ECO tip #101: Trim your mails when you reply.
--

  reply	other threads:[~2015-04-28 15:55 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-24  2:15 [PATCH] x86_64, asm: Work around AMD SYSRET SS descriptor attribute issue Andy Lutomirski
2015-04-24  2:18 ` Andy Lutomirski
2015-04-26 12:34   ` Denys Vlasenko
2015-04-24  3:58 ` Brian Gerst
2015-04-24  9:59 ` Denys Vlasenko
2015-04-24 10:59   ` Borislav Petkov
2015-04-24 19:58     ` Borislav Petkov
2015-04-24 11:27 ` Denys Vlasenko
2015-04-24 12:00   ` Brian Gerst
2015-04-24 16:25     ` Linus Torvalds
2015-04-24 17:33       ` Brian Gerst
2015-04-24 17:41         ` Linus Torvalds
2015-04-24 17:57           ` Brian Gerst
2015-04-24 20:21 ` Andy Lutomirski
2015-04-24 20:46   ` Denys Vlasenko
2015-04-24 20:50     ` Andy Lutomirski
2015-04-24 21:45       ` H. Peter Anvin
2015-04-24 21:45       ` H. Peter Anvin
2015-04-24 21:45       ` H. Peter Anvin
2015-04-24 21:45       ` H. Peter Anvin
2015-04-24 21:45       ` H. Peter Anvin
2015-04-24 21:45       ` H. Peter Anvin
2015-04-25  2:17       ` Denys Vlasenko
2015-04-26 23:36         ` Andy Lutomirski
2015-04-24 20:53   ` Linus Torvalds
2015-04-25 21:12 ` Borislav Petkov
2015-04-26 11:22   ` perf numbers (was: Re: [PATCH] x86_64, asm: Work around AMD SYSRET SS descriptor attribute issue) Borislav Petkov
2015-04-26 23:39   ` [PATCH] x86_64, asm: Work around AMD SYSRET SS descriptor attribute issue Andy Lutomirski
2015-04-27  8:53     ` Borislav Petkov
2015-04-27 10:07       ` Denys Vlasenko
2015-04-27 10:09         ` Borislav Petkov
2015-04-27 11:35       ` Borislav Petkov
2015-04-27 12:08         ` Denys Vlasenko
2015-04-27 12:48           ` Borislav Petkov
2015-04-27 14:57         ` Linus Torvalds
2015-04-27 15:06           ` Linus Torvalds
2015-04-27 15:35             ` Borislav Petkov
2015-04-27 15:46           ` Borislav Petkov
2015-04-27 15:56             ` Andy Lutomirski
2015-04-27 16:04               ` Brian Gerst
2015-04-27 16:10                 ` Denys Vlasenko
2015-04-27 16:00             ` Linus Torvalds
2015-04-27 16:40               ` Borislav Petkov
2015-04-27 18:14                 ` Linus Torvalds
2015-04-27 18:38                   ` Borislav Petkov
2015-04-27 18:47                     ` Linus Torvalds
2015-04-27 18:53                       ` Borislav Petkov
2015-04-27 19:59                         ` H. Peter Anvin
2015-04-27 20:03                           ` Borislav Petkov
2015-04-27 20:14                             ` H. Peter Anvin
2015-04-28 15:55                               ` Borislav Petkov [this message]
2015-04-28 16:28                                 ` Linus Torvalds
2015-04-28 16:58                                   ` Borislav Petkov
2015-04-28 17:16                                     ` Linus Torvalds
2015-04-28 18:38                                       ` Borislav Petkov
2015-04-30 21:39                                         ` H. Peter Anvin
2015-04-30 23:23                                           ` H. Peter Anvin
2015-05-01  9:03                                             ` Borislav Petkov
2015-05-03 11:51                                           ` Borislav Petkov
2015-04-27 19:11                     ` Borislav Petkov
2015-04-27 19:21                       ` Denys Vlasenko
2015-04-27 19:45                         ` Borislav Petkov
2015-04-28 13:40                           ` Borislav Petkov
2015-04-27 16:12           ` Denys Vlasenko
2015-04-27 18:12             ` Linus Torvalds
2015-04-27 18:47               ` Borislav Petkov
2015-04-27 14:39     ` Borislav Petkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150428155511.GF19025@pd.tnic \
    --to=bp@alien8.de \
    --cc=ast@plumgrid.com \
    --cc=brgerst@gmail.com \
    --cc=dvlasenk@redhat.com \
    --cc=fweisbec@gmail.com \
    --cc=hpa@zytor.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=luto@kernel.org \
    --cc=mgorman@suse.com \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=rostedt@goodmis.org \
    --cc=torvalds@linux-foundation.org \
    --cc=vda.linux@googlemail.com \
    --cc=wad@chromium.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.