diff options
| author | David S. Miller <davem@davemloft.net> | 2013-11-11 14:33:06 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-11-11 14:33:06 -0500 |
| commit | 75ecab1df14d90e86cebef9ec5c76befde46e65f (patch) | |
| tree | aa0aee61cf99280eaa533956438c9daec3a2afc7 /include/linux | |
| parent | 129596674c00352cbbb1efaf36db50726fd374ef (diff) | |
| parent | a6a9c0f1bf5a9a5faa605773ea75e0b93c3ab108 (diff) | |
Merge branch 'prandom'
prandom fixes/improvements
====================
It would be great if you could still consider this series that fixes and
improves prandom for 3.13. We have sent it to netdev as prandom() originally
came from net/core/utils.c and networking is its main user. For a detailled
description, please see individual patches.
For patch 3 in this series, there will be a minor merge conflict with the
random tree that is for 3.13. See below how to resolve it.
====
Hannes says: on merge with the random tree I would suggest to resolve the
conflict in drivers/char/random.c like this:
if (r->entropy_total > 128) {
r->initialized = 1;
r->entropy_total = 0;
if (r == &nonblocking_pool) {
prandom_reseed_late();
pr_notice("random: %s pool is initialized\n",
r->name);
}
}
So it won't generate a warning if DEBUG_RANDOM_BOOT gets activated.
====
Patch 1 should probably also go to -stable.
Set tested on 32 and 64 bit machines.
Thanks a lot!
Ref. original discussion: http://patchwork.ozlabs.org/patch/289951/
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/random.h | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/include/linux/random.h b/include/linux/random.h index 6312dd9ba449..4002b3df4c85 100644 --- a/include/linux/random.h +++ b/include/linux/random.h | |||
| @@ -29,8 +29,13 @@ unsigned long randomize_range(unsigned long start, unsigned long end, unsigned l | |||
| 29 | u32 prandom_u32(void); | 29 | u32 prandom_u32(void); |
| 30 | void prandom_bytes(void *buf, int nbytes); | 30 | void prandom_bytes(void *buf, int nbytes); |
| 31 | void prandom_seed(u32 seed); | 31 | void prandom_seed(u32 seed); |
| 32 | void prandom_reseed_late(void); | ||
| 32 | 33 | ||
| 33 | u32 prandom_u32_state(struct rnd_state *); | 34 | struct rnd_state { |
| 35 | __u32 s1, s2, s3, s4; | ||
| 36 | }; | ||
| 37 | |||
| 38 | u32 prandom_u32_state(struct rnd_state *state); | ||
| 34 | void prandom_bytes_state(struct rnd_state *state, void *buf, int nbytes); | 39 | void prandom_bytes_state(struct rnd_state *state, void *buf, int nbytes); |
| 35 | 40 | ||
| 36 | /* | 41 | /* |
| @@ -50,9 +55,10 @@ static inline void prandom_seed_state(struct rnd_state *state, u64 seed) | |||
| 50 | { | 55 | { |
| 51 | u32 i = (seed >> 32) ^ (seed << 10) ^ seed; | 56 | u32 i = (seed >> 32) ^ (seed << 10) ^ seed; |
| 52 | 57 | ||
| 53 | state->s1 = __seed(i, 1); | 58 | state->s1 = __seed(i, 2U); |
| 54 | state->s2 = __seed(i, 7); | 59 | state->s2 = __seed(i, 8U); |
| 55 | state->s3 = __seed(i, 15); | 60 | state->s3 = __seed(i, 16U); |
| 61 | state->s4 = __seed(i, 128U); | ||
| 56 | } | 62 | } |
| 57 | 63 | ||
| 58 | #ifdef CONFIG_ARCH_RANDOM | 64 | #ifdef CONFIG_ARCH_RANDOM |
