Module Name: src Committed By: riastradh Date: Tue Aug 27 19:30:10 UTC 2013
Modified Files: src/sys/dev: rnd_private.h src/sys/kern: init_main.c kern_rndq.c kern_rndsink.c Log Message: Back out the recent rnd stop-gap/stop-gap/stop-gap measures. This reverts sys/dev/rnd_private.h -> r1.1 sys/kern/init_main.c -> r1.450 sys/kern/kern_rndq.c -> r1.14 sys/kern/kern_rndsink.c -> r1.2 Parts of these changes will be added back, and the rndsource callbacks will be fixed to avoid the lock recursion bug that motivated the stop-gaps in the first place. ok tls To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/dev/rnd_private.h cvs rdiff -u -r1.451 -r1.452 src/sys/kern/init_main.c cvs rdiff -u -r1.17 -r1.18 src/sys/kern/kern_rndq.c cvs rdiff -u -r1.4 -r1.5 src/sys/kern/kern_rndsink.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/rnd_private.h diff -u src/sys/dev/rnd_private.h:1.3 src/sys/dev/rnd_private.h:1.4 --- src/sys/dev/rnd_private.h:1.3 Mon Aug 26 23:41:24 2013 +++ src/sys/dev/rnd_private.h Tue Aug 27 19:30:10 2013 @@ -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 Index: src/sys/kern/init_main.c diff -u src/sys/kern/init_main.c:1.451 src/sys/kern/init_main.c:1.452 --- src/sys/kern/init_main.c:1.451 Sun Aug 25 21:12:56 2013 +++ src/sys/kern/init_main.c Tue Aug 27 19:30:10 2013 @@ -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 <sys/cdefs.h> -__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(); Index: src/sys/kern/kern_rndq.c diff -u src/sys/kern/kern_rndq.c:1.17 src/sys/kern/kern_rndq.c:1.18 --- src/sys/kern/kern_rndq.c:1.17 Tue Aug 27 14:01:35 2013 +++ src/sys/kern/kern_rndq.c Tue Aug 27 19:30:10 2013 @@ -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 <sys/cdefs.h> -__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 <sys/param.h> #include <sys/ioctl.h> @@ -141,10 +141,12 @@ static krndsource_t rnd_source_no_collec 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 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; } Index: src/sys/kern/kern_rndsink.c diff -u src/sys/kern/kern_rndsink.c:1.4 src/sys/kern/kern_rndsink.c:1.5 --- src/sys/kern/kern_rndsink.c:1.4 Mon Aug 26 23:41:24 2013 +++ src/sys/kern/kern_rndsink.c Tue Aug 27 19:30:10 2013 @@ -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 <sys/cdefs.h> -__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 <sys/param.h> #include <sys/types.h> @@ -131,8 +131,6 @@ rndpool_maybe_extract(void *buffer, size 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 =