Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern Centralize bookkeeping of rnd_initial_entropy.
details: https://anonhg.NetBSD.org/src/rev/794084fdc818
branches: trunk
changeset: 807584:794084fdc818
user: riastradh <riastradh%NetBSD.org@localhost>
date: Tue Apr 14 14:11:51 2015 +0000
description:
Centralize bookkeeping of rnd_initial_entropy.
It is not adjusted everywhere it should be, although the only places
it perhaps formally ought to be are places with questionable entropy
estimates in the first place.
diffstat:
sys/kern/kern_rndq.c | 53 ++++++++++++++++++++++++++-------------------------
1 files changed, 27 insertions(+), 26 deletions(-)
diffs (102 lines):
diff -r e5732449f0a9 -r 794084fdc818 sys/kern/kern_rndq.c
--- a/sys/kern/kern_rndq.c Tue Apr 14 14:08:36 2015 +0000
+++ b/sys/kern/kern_rndq.c Tue Apr 14 14:11:51 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_rndq.c,v 1.60 2015/04/14 13:57:35 riastradh Exp $ */
+/* $NetBSD: kern_rndq.c,v 1.61 2015/04/14 14:11:51 riastradh Exp $ */
/*-
* Copyright (c) 1997-2013 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.60 2015/04/14 13:57:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.61 2015/04/14 14:11:51 riastradh Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -290,25 +290,6 @@
rnd_wakeup_readers(void)
{
- /*
- * XXX This bookkeeping shouldn't be here -- this is not where
- * the rnd_initial_entropy state change actually happens.
- */
- mutex_spin_enter(&rnd_global.lock);
- const size_t entropy_count = rndpool_get_entropy_count(&rnd_global.pool);
- if (entropy_count < RND_ENTROPY_THRESHOLD * 8) {
- mutex_spin_exit(&rnd_global.lock);
- return;
- } else {
-#ifdef RND_VERBOSE
- if (__predict_false(!rnd_initial_entropy))
- rnd_printf_verbose("rnd: have initial entropy (%zu)\n",
- entropy_count);
-#endif
- rnd_initial_entropy = 1;
- }
- mutex_spin_exit(&rnd_global.lock);
-
rndsinks_distribute();
}
@@ -483,6 +464,27 @@
#endif
/*
+ * Entropy was just added to the pool. If we crossed the threshold for
+ * the first time, set rnd_initial_entropy = 1.
+ */
+static void
+rnd_entropy_added(void)
+{
+ uint32_t pool_entropy;
+
+ KASSERT(mutex_owned(&rnd_global.lock));
+
+ if (__predict_true(rnd_initial_entropy))
+ return;
+ pool_entropy = rndpool_get_entropy_count(&rnd_global.pool);
+ if (pool_entropy > RND_ENTROPY_THRESHOLD * NBBY) {
+ rnd_printf_verbose("rnd: have initial entropy (%zu)\n",
+ pool_entropy);
+ rnd_initial_entropy = 1;
+ }
+}
+
+/*
* initialize the global random pool for our use.
* rnd_init() must be called very early on in the boot process, so
* the pool is ready for other devices to attach as sources.
@@ -566,11 +568,8 @@
rndpool_add_data(&rnd_global.pool, boot_rsp->data,
sizeof(boot_rsp->data),
MIN(boot_rsp->entropy, RND_POOLBITS / 2));
- if (rndpool_get_entropy_count(&rnd_global.pool) >
- RND_ENTROPY_THRESHOLD * 8) {
- rnd_initial_entropy = 1;
- }
- mutex_spin_exit(&rnd_global.lock);
+ rnd_entropy_added();
+ mutex_spin_exit(&rnd_global.lock);
rnd_printf("rnd: seeded with %d bits\n",
MIN(boot_rsp->entropy, RND_POOLBITS / 2));
memset(boot_rsp, 0, sizeof(*boot_rsp));
@@ -1095,6 +1094,7 @@
skip: SIMPLEQ_INSERT_TAIL(&df_samples, sample, next);
}
rndpool_set_entropy_count(&rnd_global.pool, pool_entropy);
+ rnd_entropy_added();
mutex_spin_exit(&rnd_global.lock);
/*
@@ -1607,6 +1607,7 @@
mutex_spin_enter(&rnd_global.lock);
rndpool_add_data(&rnd_global.pool, rnddata->data,
rnddata->len, estimate);
+ rnd_entropy_added();
mutex_spin_exit(&rnd_global.lock);
rnd_wakeup_readers();
Home |
Main Index |
Thread Index |
Old Index