diff --git a/sys/dev/rnd_private.h b/sys/dev/rnd_private.h index aad1eea1eb17..e83ad0f9b1fe 100644 --- a/sys/dev/rnd_private.h +++ b/sys/dev/rnd_private.h @@ -1,4 +1,4 @@ -/* $NetBSD: rnd_private.h,v 1.3 2013/08/26 23:41:24 tls Exp $ */ +/* $NetBSD: rnd_private.h,v 1.4 2013/08/27 19:30:10 riastradh Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -55,7 +55,4 @@ (short read ok) */ uint32_t rnd_extract_data(void *, uint32_t, uint32_t); -int rnd_process_events(void); /* XXX should be static */ -void rnd_wakeup_readers(void); /* XXX should be static */ - #endif diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index b19d4ac9604c..373186088772 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -1,4 +1,4 @@ -/* $NetBSD: init_main.c,v 1.451 2013/08/25 21:12:56 tls Exp $ */ +/* $NetBSD: init_main.c,v 1.452 2013/08/27 19:30:10 riastradh Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -97,7 +97,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.451 2013/08/25 21:12:56 tls Exp $"); +__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.452 2013/08/27 19:30:10 riastradh Exp $"); #include "opt_ddb.h" #include "opt_ipsec.h" @@ -519,9 +519,6 @@ main(void) /* Now timer is working. Enable preemption. */ kpreempt_enable(); - /* Enable deferred processing of RNG samples */ - rnd_init_softint(); - #ifdef SYSVSHM /* Initialize System V style shared memory. */ shminit(); @@ -568,6 +565,8 @@ main(void) if_attachdomain(); splx(s); + rnd_init_softint(); + #ifdef GPROF /* Initialize kernel profiling. */ kmstartup(); diff --git a/sys/kern/kern_rndq.c b/sys/kern/kern_rndq.c index db06ad7b3d4b..98f27e6225e0 100644 --- a/sys/kern/kern_rndq.c +++ b/sys/kern/kern_rndq.c @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rndq.c,v 1.17 2013/08/27 14:01:35 riastradh Exp $ */ +/* $NetBSD: kern_rndq.c,v 1.18 2013/08/27 19:30:10 riastradh Exp $ */ /*- * Copyright (c) 1997-2013 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.17 2013/08/27 14:01:35 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.18 2013/08/27 19:30:10 riastradh Exp $"); #include #include @@ -141,10 +141,12 @@ static krndsource_t rnd_source_no_collect = { void *rnd_process, *rnd_wakeup; struct callout skew_callout; +void rnd_wakeup_readers(void); static inline u_int32_t rnd_estimate_entropy(krndsource_t *, u_int32_t); static inline u_int32_t rnd_counter(void); static void rnd_intr(void *); static void rnd_wake(void *); +static void rnd_process_events(void); u_int32_t rnd_extract_data_locked(void *, u_int32_t, u_int32_t); /* XXX */ static void rnd_add_data_ts(krndsource_t *, const void *const, uint32_t, uint32_t, uint32_t); @@ -165,10 +167,7 @@ rndsave_t *boot_rsp; void rnd_init_softint(void) { rnd_process = softint_establish(SOFTINT_SERIAL|SOFTINT_MPSAFE, - rnd_intr, NULL); - rnd_wakeup = softint_establish(SOFTINT_CLOCK|SOFTINT_MPSAFE, - rnd_wake, NULL); - rnd_intr(NULL); + rnd_intr, NULL); } /* @@ -211,6 +210,7 @@ rnd_schedule_process(void) rnd_schedule_softint(rnd_process); return; } + rnd_process_events(); } static inline void @@ -220,6 +220,11 @@ rnd_schedule_wakeup(void) rnd_schedule_softint(rnd_wakeup); return; } + if (!cold) { + rnd_wakeup = softint_establish(SOFTINT_CLOCK|SOFTINT_MPSAFE, + rnd_wake, NULL); + } + rnd_wakeup_readers(); } /* @@ -815,10 +820,8 @@ rnd_hwrng_test(rnd_sample_t *sample) * by the add routines directly if the callout has never fired (that * is, if we are "cold" -- just booted). * - * Returns >0 if we got enough entropy to distribute some (wake sleepers) - * 0 elsewise. */ -int +static void rnd_process_events(void) { rnd_sample_t *sample = NULL; @@ -932,15 +935,19 @@ rnd_process_events(void) rnd_sample_free(sample); } - return wake; + + /* + * Wake up any potential readers waiting. + */ + if (wake) { + rnd_schedule_wakeup(); + } } static void rnd_intr(void *arg) { - if (rnd_process_events()) { - rnd_schedule_wakeup(); - } + rnd_process_events(); } static void @@ -1028,19 +1035,11 @@ rnd_extract_data_locked(void *p, u_int32_t len, u_int32_t flags) u_int32_t rnd_extract_data(void *p, u_int32_t len, u_int32_t flags) { - int wake; uint32_t retval; - wake = rnd_process_events(); /* XXX extra take/release rndpool_mtx */ - mutex_spin_enter(&rndpool_mtx); retval = rnd_extract_data_locked(p, len, flags); mutex_spin_exit(&rndpool_mtx); - - if (wake) { - rnd_schedule_wakeup(); - } - return retval; } diff --git a/sys/kern/kern_rndsink.c b/sys/kern/kern_rndsink.c index 16799bc4b7c7..d61a3f392e30 100644 --- a/sys/kern/kern_rndsink.c +++ b/sys/kern/kern_rndsink.c @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rndsink.c,v 1.4 2013/08/26 23:41:24 tls Exp $ */ +/* $NetBSD: kern_rndsink.c,v 1.5 2013/08/27 19:30:10 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: kern_rndsink.c,v 1.4 2013/08/26 23:41:24 tls Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_rndsink.c,v 1.5 2013/08/27 19:30:10 riastradh Exp $"); #include #include @@ -131,8 +131,6 @@ rndpool_maybe_extract(void *buffer, size_t bytes) const uint32_t bits_needed = ((bytes + RND_ENTROPY_THRESHOLD) * NBBY); - (void)rnd_process_events(); /* XXX extra take/release rndpool_mtx */ - mutex_spin_enter(&rndpool_mtx); if (bits_needed <= rndpool_get_entropy_count(&rnd_pool)) { const uint32_t extracted __unused =