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 =

Reply via email to