Module Name: src Committed By: tls Date: Mon Aug 26 23:41:24 UTC 2013
Modified Files: src/sys/dev: rnd_private.h src/sys/kern: kern_rndq.c kern_rndsink.c Log Message: Temporary fix for previous: avoid recursion through rnd_wakeup_readers() when entropy first becomes available. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/dev/rnd_private.h cvs rdiff -u -r1.15 -r1.16 src/sys/kern/kern_rndq.c cvs rdiff -u -r1.3 -r1.4 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.2 src/sys/dev/rnd_private.h:1.3 --- src/sys/dev/rnd_private.h:1.2 Sun Aug 25 21:12:56 2013 +++ src/sys/dev/rnd_private.h Mon Aug 26 23:41:24 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: rnd_private.h,v 1.2 2013/08/25 21:12:56 tls Exp $ */ +/* $NetBSD: rnd_private.h,v 1.3 2013/08/26 23:41:24 tls Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -55,6 +55,7 @@ (short read ok) */ uint32_t rnd_extract_data(void *, uint32_t, uint32_t); -void rnd_process_events(void); /* XXX should be static */ +int rnd_process_events(void); /* XXX should be static */ +void rnd_wakeup_readers(void); /* XXX should be static */ #endif Index: src/sys/kern/kern_rndq.c diff -u src/sys/kern/kern_rndq.c:1.15 src/sys/kern/kern_rndq.c:1.16 --- src/sys/kern/kern_rndq.c:1.15 Sun Aug 25 21:12:56 2013 +++ src/sys/kern/kern_rndq.c Mon Aug 26 23:41:24 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rndq.c,v 1.15 2013/08/25 21:12:56 tls Exp $ */ +/* $NetBSD: kern_rndq.c,v 1.16 2013/08/26 23:41:24 tls 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.15 2013/08/25 21:12:56 tls Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.16 2013/08/26 23:41:24 tls Exp $"); #include <sys/param.h> #include <sys/ioctl.h> @@ -141,7 +141,6 @@ 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 *); @@ -169,7 +168,7 @@ rnd_init_softint(void) { rnd_intr, NULL); rnd_wakeup = softint_establish(SOFTINT_CLOCK|SOFTINT_MPSAFE, rnd_wake, NULL); - rnd_process_events(); + rnd_intr(NULL); } /* @@ -816,8 +815,10 @@ 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. */ -void +int rnd_process_events(void) { rnd_sample_t *sample = NULL; @@ -931,19 +932,15 @@ rnd_process_events(void) rnd_sample_free(sample); } - - /* - * Wake up any potential readers waiting. - */ - if (wake) { - rnd_schedule_wakeup(); - } + return wake; } static void rnd_intr(void *arg) { - rnd_process_events(); + if (rnd_process_events()) { + rnd_schedule_wakeup(); + } } static void @@ -1031,13 +1028,19 @@ 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; - rnd_process_events(); /* XXX extra take/release rndpool_mtx */ + 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_wakeup_readers(); + } + return retval; } Index: src/sys/kern/kern_rndsink.c diff -u src/sys/kern/kern_rndsink.c:1.3 src/sys/kern/kern_rndsink.c:1.4 --- src/sys/kern/kern_rndsink.c:1.3 Sun Aug 25 21:12:56 2013 +++ src/sys/kern/kern_rndsink.c Mon Aug 26 23:41:24 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_rndsink.c,v 1.3 2013/08/25 21:12:56 tls Exp $ */ +/* $NetBSD: kern_rndsink.c,v 1.4 2013/08/26 23:41:24 tls 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.3 2013/08/25 21:12:56 tls Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_rndsink.c,v 1.4 2013/08/26 23:41:24 tls Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -131,7 +131,7 @@ rndpool_maybe_extract(void *buffer, size const uint32_t bits_needed = ((bytes + RND_ENTROPY_THRESHOLD) * NBBY); - rnd_process_events(); /* XXX extra take/release rndpool_mtx */ + (void)rnd_process_events(); /* XXX extra take/release rndpool_mtx */ mutex_spin_enter(&rndpool_mtx); if (bits_needed <= rndpool_get_entropy_count(&rnd_pool)) {