diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/random32.c | 76 |
1 files changed, 39 insertions, 37 deletions
diff --git a/lib/random32.c b/lib/random32.c index 614896778700..fa5da61ce7ad 100644 --- a/lib/random32.c +++ b/lib/random32.c | |||
@@ -1,37 +1,35 @@ | |||
1 | /* | 1 | /* |
2 | This is a maximally equidistributed combined Tausworthe generator | 2 | * This is a maximally equidistributed combined Tausworthe generator |
3 | based on code from GNU Scientific Library 1.5 (30 Jun 2004) | 3 | * based on code from GNU Scientific Library 1.5 (30 Jun 2004) |
4 | 4 | * | |
5 | lfsr113 version: | 5 | * lfsr113 version: |
6 | 6 | * | |
7 | x_n = (s1_n ^ s2_n ^ s3_n ^ s4_n) | 7 | * x_n = (s1_n ^ s2_n ^ s3_n ^ s4_n) |
8 | 8 | * | |
9 | s1_{n+1} = (((s1_n & 4294967294) << 18) ^ (((s1_n << 6) ^ s1_n) >> 13)) | 9 | * s1_{n+1} = (((s1_n & 4294967294) << 18) ^ (((s1_n << 6) ^ s1_n) >> 13)) |
10 | s2_{n+1} = (((s2_n & 4294967288) << 2) ^ (((s2_n << 2) ^ s2_n) >> 27)) | 10 | * s2_{n+1} = (((s2_n & 4294967288) << 2) ^ (((s2_n << 2) ^ s2_n) >> 27)) |
11 | s3_{n+1} = (((s3_n & 4294967280) << 7) ^ (((s3_n << 13) ^ s3_n) >> 21)) | 11 | * s3_{n+1} = (((s3_n & 4294967280) << 7) ^ (((s3_n << 13) ^ s3_n) >> 21)) |
12 | s4_{n+1} = (((s4_n & 4294967168) << 13) ^ (((s4_n << 3) ^ s4_n) >> 12)) | 12 | * s4_{n+1} = (((s4_n & 4294967168) << 13) ^ (((s4_n << 3) ^ s4_n) >> 12)) |
13 | 13 | * | |
14 | The period of this generator is about 2^113 (see erratum paper). | 14 | * The period of this generator is about 2^113 (see erratum paper). |
15 | 15 | * | |
16 | From: P. L'Ecuyer, "Maximally Equidistributed Combined Tausworthe | 16 | * From: P. L'Ecuyer, "Maximally Equidistributed Combined Tausworthe |
17 | Generators", Mathematics of Computation, 65, 213 (1996), 203--213: | 17 | * Generators", Mathematics of Computation, 65, 213 (1996), 203--213: |
18 | http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps | 18 | * http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps |
19 | ftp://ftp.iro.umontreal.ca/pub/simulation/lecuyer/papers/tausme.ps | 19 | * ftp://ftp.iro.umontreal.ca/pub/simulation/lecuyer/papers/tausme.ps |
20 | 20 | * | |
21 | There is an erratum in the paper "Tables of Maximally | 21 | * There is an erratum in the paper "Tables of Maximally Equidistributed |
22 | Equidistributed Combined LFSR Generators", Mathematics of | 22 | * Combined LFSR Generators", Mathematics of Computation, 68, 225 (1999), |
23 | Computation, 68, 225 (1999), 261--269: | 23 | * 261--269: http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme2.ps |
24 | http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme2.ps | 24 | * |
25 | 25 | * ... the k_j most significant bits of z_j must be non-zero, | |
26 | ... the k_j most significant bits of z_j must be non- | 26 | * for each j. (Note: this restriction also applies to the |
27 | zero, for each j. (Note: this restriction also applies to the | 27 | * computer code given in [4], but was mistakenly not mentioned |
28 | computer code given in [4], but was mistakenly not mentioned in | 28 | * in that paper.) |
29 | that paper.) | 29 | * |
30 | 30 | * This affects the seeding procedure by imposing the requirement | |
31 | This affects the seeding procedure by imposing the requirement | 31 | * s1 > 1, s2 > 7, s3 > 15, s4 > 127. |
32 | s1 > 1, s2 > 7, s3 > 15, s4 > 127. | 32 | */ |
33 | |||
34 | */ | ||
35 | 33 | ||
36 | #include <linux/types.h> | 34 | #include <linux/types.h> |
37 | #include <linux/percpu.h> | 35 | #include <linux/percpu.h> |
@@ -75,15 +73,17 @@ EXPORT_SYMBOL(prandom_u32_state); | |||
75 | */ | 73 | */ |
76 | u32 prandom_u32(void) | 74 | u32 prandom_u32(void) |
77 | { | 75 | { |
78 | unsigned long r; | ||
79 | struct rnd_state *state = &get_cpu_var(net_rand_state); | 76 | struct rnd_state *state = &get_cpu_var(net_rand_state); |
80 | r = prandom_u32_state(state); | 77 | u32 res; |
78 | |||
79 | res = prandom_u32_state(state); | ||
81 | put_cpu_var(state); | 80 | put_cpu_var(state); |
82 | return r; | 81 | |
82 | return res; | ||
83 | } | 83 | } |
84 | EXPORT_SYMBOL(prandom_u32); | 84 | EXPORT_SYMBOL(prandom_u32); |
85 | 85 | ||
86 | /* | 86 | /** |
87 | * prandom_bytes_state - get the requested number of pseudo-random bytes | 87 | * prandom_bytes_state - get the requested number of pseudo-random bytes |
88 | * | 88 | * |
89 | * @state: pointer to state structure holding seeded state. | 89 | * @state: pointer to state structure holding seeded state. |
@@ -204,6 +204,7 @@ static int __init prandom_init(void) | |||
204 | prandom_seed_very_weak(state, (i + jiffies) ^ random_get_entropy()); | 204 | prandom_seed_very_weak(state, (i + jiffies) ^ random_get_entropy()); |
205 | prandom_warmup(state); | 205 | prandom_warmup(state); |
206 | } | 206 | } |
207 | |||
207 | return 0; | 208 | return 0; |
208 | } | 209 | } |
209 | core_initcall(prandom_init); | 210 | core_initcall(prandom_init); |
@@ -259,6 +260,7 @@ static void __prandom_reseed(bool late) | |||
259 | 260 | ||
260 | if (latch && !late) | 261 | if (latch && !late) |
261 | goto out; | 262 | goto out; |
263 | |||
262 | latch = true; | 264 | latch = true; |
263 | 265 | ||
264 | for_each_possible_cpu(i) { | 266 | for_each_possible_cpu(i) { |