| From 154565f2565407088d65c2b282e3449dd386392d Mon Sep 17 00:00:00 2001 |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| Date: Thu, 22 Dec 2011 11:36:22 -0800 |
| Subject: [PATCH] random: Use arch_get_random_int instead of cycle counter if |
| avail |
| |
| commit cf833d0b9937874b50ef2867c4e8badfd64948ce upstream. |
| |
| We still don't use rdrand in /dev/random, which just seems stupid. We |
| accept the *cycle*counter* as a random input, but we don't accept |
| rdrand? That's just broken. |
| |
| Sure, people can do things in user space (write to /dev/random, use |
| rdrand in addition to /dev/random themselves etc etc), but that |
| *still* seems to be a particularly stupid reason for saying "we |
| shouldn't bother to try to do better in /dev/random". |
| |
| And even if somebody really doesn't trust rdrand as a source of random |
| bytes, it seems singularly stupid to trust the cycle counter *more*. |
| |
| So I'd suggest the attached patch. I'm not going to even bother |
| arguing that we should add more bits to the entropy estimate, because |
| that's not the point - I don't care if /dev/random fills up slowly or |
| not, I think it's just stupid to not use the bits we can get from |
| rdrand and mix them into the strong randomness pool. |
| |
| Link: http://lkml.kernel.org/r/CA%2B55aFwn59N1=m651QAyTy-1gO1noGbK18zwKDwvwqnravA84A@mail.gmail.com |
| Acked-by: "David S. Miller" <davem@davemloft.net> |
| Acked-by: "Theodore Ts'o" <tytso@mit.edu> |
| Acked-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Cc: Matt Mackall <mpm@selenic.com> |
| Cc: Tony Luck <tony.luck@intel.com> |
| Cc: Eric Dumazet <eric.dumazet@gmail.com> |
| Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/char/random.c b/drivers/char/random.c |
| index f017045..4e9e6f9 100644 |
| --- a/drivers/char/random.c |
| +++ b/drivers/char/random.c |
| @@ -617,8 +617,8 @@ static struct timer_rand_state input_timer_state; |
| static void add_timer_randomness(struct timer_rand_state *state, unsigned num) |
| { |
| struct { |
| - cycles_t cycles; |
| long jiffies; |
| + unsigned cycles; |
| unsigned num; |
| } sample; |
| long delta, delta2, delta3; |
| @@ -630,7 +630,11 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) |
| goto out; |
| |
| sample.jiffies = jiffies; |
| - sample.cycles = get_cycles(); |
| + |
| + /* Use arch random value, fall back to cycles */ |
| + if (!arch_get_random_int(&sample.cycles)) |
| + sample.cycles = get_cycles(); |
| + |
| sample.num = num; |
| mix_pool_bytes(&input_pool, &sample, sizeof(sample)); |
| |
| -- |
| 1.7.12.rc1.1.gbce1580 |
| |