diff options
author | markm <markm@FreeBSD.org> | 2013-10-06 12:40:32 +0000 |
---|---|---|
committer | markm <markm@FreeBSD.org> | 2013-10-06 12:40:32 +0000 |
commit | 0643acd34d203434b5eee69085ba0e8f884f5ab5 (patch) | |
tree | afae865a17396fb82caf2f596222c496e4eac5e7 /sys/dev/random | |
parent | fa3a3d91b58a86d49ce10b7655012d7c1169da9a (diff) | |
download | FreeBSD-src-0643acd34d203434b5eee69085ba0e8f884f5ab5.zip FreeBSD-src-0643acd34d203434b5eee69085ba0e8f884f5ab5.tar.gz |
Debug run. This now works, except that the "live" sources haven't
been tested. With all sources turned on, this unlocks itself in
a couple of seconds! That is no my box, and there is no guarantee
that this will be the case everywhere.
* Cut debug prints.
* Use the same locks/mutexes all the way through.
* Be a tad more conservative about entropy estimates.
Diffstat (limited to 'sys/dev/random')
-rw-r--r-- | sys/dev/random/live_entropy_sources.c | 22 | ||||
-rw-r--r-- | sys/dev/random/random_harvestq.c | 2 | ||||
-rw-r--r-- | sys/dev/random/random_harvestq.h | 1 | ||||
-rw-r--r-- | sys/dev/random/yarrow.c | 6 |
4 files changed, 14 insertions, 17 deletions
diff --git a/sys/dev/random/live_entropy_sources.c b/sys/dev/random/live_entropy_sources.c index d29c94a..7d5ee9b 100644 --- a/sys/dev/random/live_entropy_sources.c +++ b/sys/dev/random/live_entropy_sources.c @@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$"); LIST_HEAD(les_head, live_entropy_sources); static struct les_head sources = LIST_HEAD_INITIALIZER(sources); -static struct sx les_lock; /* need a sleepable lock */ #define LES_THRESHOLD 10 @@ -65,9 +64,9 @@ live_entropy_source_register(struct random_hardware_source *rsource) les = malloc(sizeof(struct live_entropy_sources), M_ENTROPY, M_WAITOK); les->rsource = rsource; - sx_xlock(&les_lock); + mtx_lock_spin(&harvest_mtx); LIST_INSERT_HEAD(&sources, les, entries); - sx_xunlock(&les_lock); + mtx_unlock_spin(&harvest_mtx); } void @@ -77,7 +76,7 @@ live_entropy_source_deregister(struct random_hardware_source *rsource) KASSERT(rsource != NULL, ("invalid input to %s", __func__)); - sx_xlock(&les_lock); + mtx_lock_spin(&harvest_mtx); LIST_FOREACH(les, &sources, entries) { if (les->rsource == rsource) { LIST_REMOVE(les, entries); @@ -85,7 +84,7 @@ live_entropy_source_deregister(struct random_hardware_source *rsource) break; } } - sx_xunlock(&les_lock); + mtx_unlock_spin(&harvest_mtx); } static int @@ -96,7 +95,7 @@ live_entropy_source_handler(SYSCTL_HANDLER_ARGS) count = error = 0; - sx_slock(&les_lock); + mtx_lock_spin(&harvest_mtx); if (LIST_EMPTY(&sources)) error = SYSCTL_OUT(req, "", 0); @@ -113,7 +112,7 @@ live_entropy_source_handler(SYSCTL_HANDLER_ARGS) } } - sx_sunlock(&les_lock); + mtx_unlock_spin(&harvest_mtx); return (error); } @@ -126,8 +125,6 @@ live_entropy_sources_init(void *unused) CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, live_entropy_source_handler, "", "List of Active Live Entropy Sources"); - - sx_init(&les_lock, "live_entropy_sources"); } /* @@ -138,6 +135,7 @@ live_entropy_sources_init(void *unused) * * BEWARE!!! * This function runs inside the RNG thread! Don't do anything silly! + * The harvest_mtx mutex is held; you may count on that. */ void live_entropy_sources_feed(int rounds, event_proc_f entropy_processor) @@ -147,8 +145,6 @@ live_entropy_sources_feed(int rounds, event_proc_f entropy_processor) struct live_entropy_sources *les; int i, n; - sx_slock(&les_lock); - /* * Walk over all of live entropy sources, and feed their output * to the system-wide RNG. @@ -176,15 +172,11 @@ live_entropy_sources_feed(int rounds, event_proc_f entropy_processor) } } - - sx_sunlock(&les_lock); } static void live_entropy_sources_deinit(void *unused) { - - sx_destroy(&les_lock); } SYSINIT(random_adaptors, SI_SUB_DRIVERS, SI_ORDER_FIRST, diff --git a/sys/dev/random/random_harvestq.c b/sys/dev/random/random_harvestq.c index 6ae29fd..4e9d711 100644 --- a/sys/dev/random/random_harvestq.c +++ b/sys/dev/random/random_harvestq.c @@ -52,7 +52,7 @@ __FBSDID("$FreeBSD$"); /* * The harvest mutex protects the consistency of the entropy fifos and - * empty fifo. + * empty fifo and other associated structures. */ struct mtx harvest_mtx; diff --git a/sys/dev/random/random_harvestq.h b/sys/dev/random/random_harvestq.h index 11ccfc4..f4e9bb1 100644 --- a/sys/dev/random/random_harvestq.h +++ b/sys/dev/random/random_harvestq.h @@ -37,5 +37,6 @@ void random_harvestq_internal(u_int64_t, const void *, u_int, u_int, enum esource); extern int random_kthread_control; +extern struct mtx harvest_mtx; #endif /* __RANDOM_HARVEST_H__ */ diff --git a/sys/dev/random/yarrow.c b/sys/dev/random/yarrow.c index ab26eef..6d2ea3b 100644 --- a/sys/dev/random/yarrow.c +++ b/sys/dev/random/yarrow.c @@ -114,7 +114,7 @@ random_process_event(struct harvest *event) struct source *source; enum esource src; -#if 1 +#if 0 /* Do this better with DTrace */ { int i; @@ -243,6 +243,10 @@ reseed(u_int fastslow) u_int i; enum esource j; +#if 0 + printf("Yarrow: %s reseed\n", fastslow == FAST ? "fast" : "slow"); +#endif + /* The reseed task must not be jumped on */ mtx_lock(&random_reseed_mtx); |