From: Paul Mackerras <paulus@samba.org>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: tytso@mit.edu, kvm@vger.kernel.org,
Gleb Natapov <gleb@redhat.com>,
linuxppc-dev@ozlabs.org, linux-kernel@vger.kernel.org,
kvm-ppc@vger.kernel.org, agraf@suse.de,
herbert@gondor.hengli.com.au, mpm@selenic.com
Subject: Re: [PATCH 3/3] KVM: PPC: Book3S: Add support for hwrng found on some powernv systems
Date: Wed, 2 Oct 2013 15:09:40 +1000 [thread overview]
Message-ID: <20131002050940.GA25363@drongo> (raw)
In-Reply-To: <524AAFAA.3010801@redhat.com>
On Tue, Oct 01, 2013 at 01:19:06PM +0200, Paolo Bonzini wrote:
> Anyhow, I would like to know more about this hwrng and hypercall.
>
> Does the hwrng return random numbers (like rdrand) or real entropy (like
> rdseed that Intel will add in Broadwell)? What about the hypercall?
Well, firstly, your terminology is inaccurate. Real entropy will give
you random numbers. I think when you say "random numbers" you
actually mean "pseudo-random numbers".
Secondly, the RNG produces real entropy. The way it works is that
there are 64 ring oscillators running at different frequencies (above
1GHz). They get sampled at (typically) 1MHz and the samples get put
in a 64-entry FIFO, which is read by MMIO. There is practically no
correlation between bits or between adjacent samples. The only
deficiency is that the distribution of each bit is not always
precisely 50% zero / 50% one (it is somewhere between 40/60 and
60/40).
The whitening addresses this bias. Looking at the stream of values
for a given bit, we XOR that stream with another stream that is
uncorrelated and has a 50/50 distribution (or very very close to
that), which gives a stream whose distribution is closer to 50/50 than
either input stream. The second stream is effectively derived by
XORing together all 64 bits of some previous sample. XORing together
many uncorrelated streams that are each close to 50/50 distribution
gives a stream that is much closer to a 50/50 distribution (by the
"piling up lemma"). The result passes all the dieharder tests.
> For example virtio-rng is specified to return actual entropy, it doesn't
> matter if it is from hardware or software.
>
> In either case, the patches have problems.
>
> 1) If the hwrng returns random numbers, the whitening you're doing is
> totally insufficient and patch 2 is forging entropy that doesn't exist.
>
> 2) If the hwrng returns entropy, a read from the hwrng is going to even
> more expensive than an x86 rdrand (perhaps ~2000 cycles). Hence, doing
The MMIO itself is reasonably quick if the FIFO is not empty, but the
long-term overall rate is limited by the sampling rate.
> the emulation in the kernel is even less necessary. Also, if the hwrng
> returns entropy patch 1 is unnecessary: you do not need to waste
> precious entropy bits by passing them to arch_get_random_long; just run
> rngd in the host as that will put the entropy to much better use.
Not sure why they are particularly "precious"; we get 64 bits per
microsecond whether we use them or not. What are you suggesting
arch_get_random_long() should do instead?
> 3) If the hypercall returns random numbers, then it is a pretty
> braindead interface since returning 8 bytes at a time limits the
> throughput to a handful of MB/s (compare to 200 MB/sec for x86 rdrand).
> But more important: in this case drivers/char/hw_random/pseries-rng.c
> is completely broken and insecure, just like patch 2 in case (1) above.
Assuming that by "random numbers" you actually mean "pseudo-random
numbers", then this doesn't apply.
> 4) If the hypercall returns entropy (same as virtio-rng), the same
> considerations on speed apply. If you can only produce entropy at say 1
> MB/s (so reading 8 bytes take 8 microseconds---which is actually very
> fast), it doesn't matter that much to spend 7 microseconds on a
> userspace roundtrip. It's going to be only half the speed of bare
> metal, not 100 times slower.
8 bytes takes at most 1 microsecond, so the round-trip to userspace is
definitely noticeable.
Paul.
next prev parent reply other threads:[~2013-10-02 5:09 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-26 6:31 [PATCH 1/3] powerpc: Implement arch_get_random_long/int() for powernv Michael Ellerman
2013-09-26 6:31 ` [PATCH 2/3] hwrng: Add a driver for the hwrng found in power7+ systems Michael Ellerman
2013-09-26 8:01 ` Benjamin Herrenschmidt
2013-10-01 8:25 ` Michael Ellerman
2013-09-26 6:31 ` [PATCH 3/3] KVM: PPC: Book3S: Add support for hwrng found on some powernv systems Michael Ellerman
2013-09-26 9:06 ` Paolo Bonzini
2013-10-01 8:34 ` Michael Ellerman
2013-10-01 8:39 ` Gleb Natapov
2013-10-01 9:23 ` Paul Mackerras
2013-10-01 9:57 ` Gleb Natapov
2013-10-01 10:00 ` Alexander Graf
2013-10-01 9:38 ` Benjamin Herrenschmidt
2013-10-01 11:19 ` Paolo Bonzini
2013-10-01 21:44 ` Benjamin Herrenschmidt
2013-10-02 8:38 ` Paolo Bonzini
2013-10-02 5:09 ` Paul Mackerras [this message]
2013-10-02 8:46 ` Paolo Bonzini
2013-10-02 9:06 ` Benjamin Herrenschmidt
2013-10-02 9:11 ` Alexander Graf
2013-10-02 9:50 ` Alexander Graf
2013-10-02 10:02 ` Gleb Natapov
2013-10-02 13:57 ` Michael Ellerman
2013-10-02 14:08 ` Alexander Graf
2013-10-02 14:33 ` Paolo Bonzini
2013-10-02 14:36 ` Alexander Graf
2013-10-02 14:38 ` Paolo Bonzini
2013-10-02 22:45 ` Paul Mackerras
2013-10-03 5:48 ` Gleb Natapov
2013-10-03 10:06 ` Paul Mackerras
2013-10-03 12:08 ` Gleb Natapov
2013-10-02 14:37 ` Gleb Natapov
2013-10-02 22:21 ` Benjamin Herrenschmidt
2013-10-03 6:08 ` Gleb Natapov
2013-10-02 22:13 ` Benjamin Herrenschmidt
2013-10-02 14:10 ` Gleb Natapov
2013-10-02 22:15 ` Benjamin Herrenschmidt
2013-10-02 22:02 ` Benjamin Herrenschmidt
2013-10-03 5:43 ` Gleb Natapov
2013-10-03 7:22 ` Benjamin Herrenschmidt
2013-10-02 22:07 ` Benjamin Herrenschmidt
2013-10-03 6:28 ` Gleb Natapov
2013-10-02 21:58 ` Benjamin Herrenschmidt
2013-10-01 9:58 ` Paolo Bonzini
2013-09-27 14:15 ` Anshuman Khandual
2013-10-01 8:36 ` Michael Ellerman
2013-09-26 7:58 ` [PATCH 1/3] powerpc: Implement arch_get_random_long/int() for powernv Benjamin Herrenschmidt
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=20131002050940.GA25363@drongo \
--to=paulus@samba.org \
--cc=agraf@suse.de \
--cc=gleb@redhat.com \
--cc=herbert@gondor.hengli.com.au \
--cc=kvm-ppc@vger.kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=mpm@selenic.com \
--cc=pbonzini@redhat.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).