From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Jason A. Donenfeld" <Jason@zx2c4.com>
Cc: "Laszlo Ersek" <lersek@redhat.com>,
LKML <linux-kernel@vger.kernel.org>,
"KVM list" <kvm@vger.kernel.org>,
"QEMU Developers" <qemu-devel@nongnu.org>,
linux-hyperv@vger.kernel.org,
"Linux Crypto Mailing List" <linux-crypto@vger.kernel.org>,
"Alexander Graf" <graf@amazon.com>,
"Michael Kelley (LINUX)" <mikelley@microsoft.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
adrian@parity.io, "Daniel P. Berrangé" <berrange@redhat.com>,
"Dominik Brodowski" <linux@dominikbrodowski.net>,
"Jann Horn" <jannh@google.com>,
"Rafael J. Wysocki" <rafael@kernel.org>,
"Brown, Len" <len.brown@intel.com>, "Pavel Machek" <pavel@ucw.cz>,
"Linux PM" <linux-pm@vger.kernel.org>,
"Colm MacCarthaigh" <colmmacc@amazon.com>,
"Theodore Ts'o" <tytso@mit.edu>, "Arnd Bergmann" <arnd@arndb.de>
Subject: Re: propagating vmgenid outward and upward
Date: Thu, 3 Mar 2022 08:07:16 -0500 [thread overview]
Message-ID: <20220303075426-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <Yh+cB5bWarl8CFN1@zx2c4.com>
On Wed, Mar 02, 2022 at 05:32:07PM +0100, Jason A. Donenfeld wrote:
> Hi Michael,
>
> On Wed, Mar 02, 2022 at 11:22:46AM -0500, Michael S. Tsirkin wrote:
> > > Because that 16 byte read of vmgenid is not atomic. Let's say you read
> > > the first 8 bytes, and then the VM is forked.
> >
> > But at this point when VM was forked plaintext key and nonce are all in
> > buffer, and you previously indicated a fork at this point is harmless.
> > You wrote "If it changes _after_ that point of check ... it doesn't
> > matter:"
>
> Ahhh, fair point. I think you're right.
>
> Alright, so all we're talking about here is an ordinary 16-byte read,
> and 16 bytes of storage per keypair, and a 16-byte comparison.
>
> Still seems much worse than just having a single word...
>
> Jason
Oh I forgot about __int128.
#include <stdio.h>
#include <assert.h>
#include <limits.h>
#include <string.h>
struct lng {
__int128 l;
};
struct shrt {
unsigned long s;
};
struct lng l = { 1 };
struct shrt s = { 3 };
static void test1(volatile struct shrt *sp)
{
if (sp->s != s.s) {
printf("short mismatch!\n");
s.s = sp->s;
}
}
static void test2(volatile struct lng *lp)
{
if (lp->l != l.l) {
printf("long mismatch!\n");
l.l = lp->l;
}
}
int main(int argc, char **argv)
{
volatile struct shrt sv = { 4 };
volatile struct lng lv = { 5 };
if (argc > 1) {
printf("test 1\n");
for (int i = 0; i < 100000000; ++i)
test1(&sv);
} else {
printf("test 2\n");
for (int i = 0; i < 100000000; ++i)
test2(&lv);
}
return 0;
}
with that the compiler has an easier time to produce optimal
code, so the difference is smaller.
Note: compiled with
gcc -O2 -mno-sse -mno-sse2 -ggdb bench3.c
since with sse there's no difference at all.
[mst@tuck ~]$ perf stat -r 100 ./a.out 1 > /dev/null
Performance counter stats for './a.out 1' (100 runs):
94.55 msec task-clock:u # 0.996 CPUs utilized ( +- 0.09% )
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
52 page-faults:u # 548.914 /sec ( +- 0.21% )
400,459,851 cycles:u # 4.227 GHz ( +- 0.03% )
500,147,935 instructions:u # 1.25 insn per cycle ( +- 0.00% )
200,032,462 branches:u # 2.112 G/sec ( +- 0.00% )
1,810 branch-misses:u # 0.00% of all branches ( +- 0.73% )
0.0949732 +- 0.0000875 seconds time elapsed ( +- 0.09% )
[mst@tuck ~]$
[mst@tuck ~]$ perf stat -r 100 ./a.out > /dev/null
Performance counter stats for './a.out' (100 runs):
110.19 msec task-clock:u # 1.136 CPUs utilized ( +- 0.18% )
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
52 page-faults:u # 537.743 /sec ( +- 0.22% )
428,518,442 cycles:u # 4.431 GHz ( +- 0.07% )
900,147,986 instructions:u # 2.24 insn per cycle ( +- 0.00% )
200,032,505 branches:u # 2.069 G/sec ( +- 0.00% )
2,139 branch-misses:u # 0.00% of all branches ( +- 0.77% )
0.096956 +- 0.000203 seconds time elapsed ( +- 0.21% )
--
MST
WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Jason A. Donenfeld" <Jason@zx2c4.com>
Cc: "Brown, Len" <len.brown@intel.com>,
linux-hyperv@vger.kernel.org,
"Colm MacCarthaigh" <colmmacc@amazon.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
adrian@parity.io, "KVM list" <kvm@vger.kernel.org>,
"Jann Horn" <jannh@google.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Linux PM" <linux-pm@vger.kernel.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
"Dominik Brodowski" <linux@dominikbrodowski.net>,
"QEMU Developers" <qemu-devel@nongnu.org>,
"Alexander Graf" <graf@amazon.com>,
"Linux Crypto Mailing List" <linux-crypto@vger.kernel.org>,
"Pavel Machek" <pavel@ucw.cz>, "Theodore Ts'o" <tytso@mit.edu>,
"Michael Kelley (LINUX)" <mikelley@microsoft.com>,
"Laszlo Ersek" <lersek@redhat.com>,
"Arnd Bergmann" <arnd@arndb.de>
Subject: Re: propagating vmgenid outward and upward
Date: Thu, 3 Mar 2022 08:07:16 -0500 [thread overview]
Message-ID: <20220303075426-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <Yh+cB5bWarl8CFN1@zx2c4.com>
On Wed, Mar 02, 2022 at 05:32:07PM +0100, Jason A. Donenfeld wrote:
> Hi Michael,
>
> On Wed, Mar 02, 2022 at 11:22:46AM -0500, Michael S. Tsirkin wrote:
> > > Because that 16 byte read of vmgenid is not atomic. Let's say you read
> > > the first 8 bytes, and then the VM is forked.
> >
> > But at this point when VM was forked plaintext key and nonce are all in
> > buffer, and you previously indicated a fork at this point is harmless.
> > You wrote "If it changes _after_ that point of check ... it doesn't
> > matter:"
>
> Ahhh, fair point. I think you're right.
>
> Alright, so all we're talking about here is an ordinary 16-byte read,
> and 16 bytes of storage per keypair, and a 16-byte comparison.
>
> Still seems much worse than just having a single word...
>
> Jason
Oh I forgot about __int128.
#include <stdio.h>
#include <assert.h>
#include <limits.h>
#include <string.h>
struct lng {
__int128 l;
};
struct shrt {
unsigned long s;
};
struct lng l = { 1 };
struct shrt s = { 3 };
static void test1(volatile struct shrt *sp)
{
if (sp->s != s.s) {
printf("short mismatch!\n");
s.s = sp->s;
}
}
static void test2(volatile struct lng *lp)
{
if (lp->l != l.l) {
printf("long mismatch!\n");
l.l = lp->l;
}
}
int main(int argc, char **argv)
{
volatile struct shrt sv = { 4 };
volatile struct lng lv = { 5 };
if (argc > 1) {
printf("test 1\n");
for (int i = 0; i < 100000000; ++i)
test1(&sv);
} else {
printf("test 2\n");
for (int i = 0; i < 100000000; ++i)
test2(&lv);
}
return 0;
}
with that the compiler has an easier time to produce optimal
code, so the difference is smaller.
Note: compiled with
gcc -O2 -mno-sse -mno-sse2 -ggdb bench3.c
since with sse there's no difference at all.
[mst@tuck ~]$ perf stat -r 100 ./a.out 1 > /dev/null
Performance counter stats for './a.out 1' (100 runs):
94.55 msec task-clock:u # 0.996 CPUs utilized ( +- 0.09% )
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
52 page-faults:u # 548.914 /sec ( +- 0.21% )
400,459,851 cycles:u # 4.227 GHz ( +- 0.03% )
500,147,935 instructions:u # 1.25 insn per cycle ( +- 0.00% )
200,032,462 branches:u # 2.112 G/sec ( +- 0.00% )
1,810 branch-misses:u # 0.00% of all branches ( +- 0.73% )
0.0949732 +- 0.0000875 seconds time elapsed ( +- 0.09% )
[mst@tuck ~]$
[mst@tuck ~]$ perf stat -r 100 ./a.out > /dev/null
Performance counter stats for './a.out' (100 runs):
110.19 msec task-clock:u # 1.136 CPUs utilized ( +- 0.18% )
0 context-switches:u # 0.000 /sec
0 cpu-migrations:u # 0.000 /sec
52 page-faults:u # 537.743 /sec ( +- 0.22% )
428,518,442 cycles:u # 4.431 GHz ( +- 0.07% )
900,147,986 instructions:u # 2.24 insn per cycle ( +- 0.00% )
200,032,505 branches:u # 2.069 G/sec ( +- 0.00% )
2,139 branch-misses:u # 0.00% of all branches ( +- 0.77% )
0.096956 +- 0.000203 seconds time elapsed ( +- 0.21% )
--
MST
next prev parent reply other threads:[~2022-03-03 13:07 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-01 15:42 propagating vmgenid outward and upward Jason A. Donenfeld
2022-03-01 16:15 ` Laszlo Ersek
2022-03-01 16:28 ` Jason A. Donenfeld
2022-03-01 16:28 ` Jason A. Donenfeld
2022-03-01 17:17 ` Michael S. Tsirkin
2022-03-01 17:17 ` Michael S. Tsirkin
2022-03-01 18:37 ` Jason A. Donenfeld
2022-03-01 18:37 ` Jason A. Donenfeld
2022-03-02 7:42 ` Michael S. Tsirkin
2022-03-02 7:42 ` Michael S. Tsirkin
2022-03-02 7:48 ` Michael S. Tsirkin
2022-03-02 7:48 ` Michael S. Tsirkin
2022-03-02 8:30 ` Michael S. Tsirkin
2022-03-02 8:30 ` Michael S. Tsirkin
2022-03-02 11:26 ` Jason A. Donenfeld
2022-03-02 11:26 ` Jason A. Donenfeld
2022-03-02 12:58 ` Michael S. Tsirkin
2022-03-02 12:58 ` Michael S. Tsirkin
2022-03-02 13:55 ` Jason A. Donenfeld
2022-03-02 13:55 ` Jason A. Donenfeld
2022-03-02 14:46 ` Michael S. Tsirkin
2022-03-02 14:46 ` Michael S. Tsirkin
2022-03-02 15:14 ` Jason A. Donenfeld
2022-03-02 15:14 ` Jason A. Donenfeld
2022-03-02 15:20 ` Michael S. Tsirkin
2022-03-02 15:20 ` Michael S. Tsirkin
2022-03-02 15:36 ` Jason A. Donenfeld
2022-03-02 15:36 ` Jason A. Donenfeld
2022-03-02 16:22 ` Michael S. Tsirkin
2022-03-02 16:22 ` Michael S. Tsirkin
2022-03-02 16:32 ` Jason A. Donenfeld
2022-03-02 16:32 ` Jason A. Donenfeld
2022-03-02 17:27 ` Michael S. Tsirkin
2022-03-02 17:27 ` Michael S. Tsirkin
2022-03-03 13:07 ` Michael S. Tsirkin [this message]
2022-03-03 13:07 ` Michael S. Tsirkin
2022-03-02 16:29 ` Michael S. Tsirkin
2022-03-02 16:29 ` Michael S. Tsirkin
2022-03-01 16:21 ` Michael S. Tsirkin
2022-03-01 16:21 ` Michael S. Tsirkin
2022-03-01 16:35 ` Jason A. Donenfeld
2022-03-01 16:35 ` Jason A. Donenfeld
2022-03-01 18:01 ` Greg KH
2022-03-01 18:01 ` Greg KH
2022-03-01 18:24 ` Jason A. Donenfeld
2022-03-01 18:24 ` Jason A. Donenfeld
2022-03-01 19:41 ` Greg KH
2022-03-01 19:41 ` Greg KH
2022-03-01 23:12 ` Jason A. Donenfeld
2022-03-01 23:12 ` Jason A. Donenfeld
2022-03-02 14:35 ` Jason A. Donenfeld
2022-03-09 10:10 ` Alexander Graf
2022-03-09 22:02 ` Jason A. Donenfeld
2022-03-09 22:02 ` Jason A. Donenfeld
2022-03-10 11:18 ` Alexander Graf
2022-03-20 22:53 ` Michael S. Tsirkin
2022-03-20 22:53 ` Michael S. Tsirkin
2022-04-19 15:12 ` Jason A. Donenfeld
2022-04-19 15:12 ` Jason A. Donenfeld
2022-04-19 16:43 ` Michael S. Tsirkin
2022-04-19 16:43 ` Michael S. Tsirkin
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=20220303075426-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=Jason@zx2c4.com \
--cc=adrian@parity.io \
--cc=arnd@arndb.de \
--cc=berrange@redhat.com \
--cc=colmmacc@amazon.com \
--cc=graf@amazon.com \
--cc=gregkh@linuxfoundation.org \
--cc=jannh@google.com \
--cc=kvm@vger.kernel.org \
--cc=len.brown@intel.com \
--cc=lersek@redhat.com \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=linux@dominikbrodowski.net \
--cc=mikelley@microsoft.com \
--cc=pavel@ucw.cz \
--cc=qemu-devel@nongnu.org \
--cc=rafael@kernel.org \
--cc=tytso@mit.edu \
/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.