Module Name:    src
Committed By:   riastradh
Date:           Sat Mar 19 11:55:03 UTC 2022

Modified Files:
        src/sys/arch/arm/broadcom: bcm2835_rng.c
        src/sys/arch/arm/omap: am335x_trng.c
        src/sys/arch/arm/ti: ti_rng.c
        src/sys/arch/mips/cavium/dev: octeon_rnm.c
        src/sys/arch/mips/ingenic: ingenic_rng.c
        src/sys/dev/ic: amdccp.c amdccpvar.h rng200.c rng200var.h

Log Message:
rnd(9): Omit needless locks in various HWRNG drivers.

Now that the rnd(9) API guarantees serial callbacks, we can simplify
everything a bit more.

(Some drivers like hifn(4) and sun8icrypto(4) still use locks to
coordinate with other parts of the driver to submit requests to and
process responses from the device.)


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/broadcom/bcm2835_rng.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/omap/am335x_trng.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/ti/ti_rng.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/mips/cavium/dev/octeon_rnm.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/mips/ingenic/ingenic_rng.c
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/ic/amdccp.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/ic/amdccpvar.h \
    src/sys/dev/ic/rng200var.h
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/ic/rng200.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/arch/arm/broadcom/bcm2835_rng.c
diff -u src/sys/arch/arm/broadcom/bcm2835_rng.c:1.16 src/sys/arch/arm/broadcom/bcm2835_rng.c:1.17
--- src/sys/arch/arm/broadcom/bcm2835_rng.c:1.16	Sat Mar 19 11:37:05 2022
+++ src/sys/arch/arm/broadcom/bcm2835_rng.c	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm2835_rng.c,v 1.16 2022/03/19 11:37:05 riastradh Exp $ */
+/*	$NetBSD: bcm2835_rng.c,v 1.17 2022/03/19 11:55:03 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_rng.c,v 1.16 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_rng.c,v 1.17 2022/03/19 11:55:03 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -58,7 +58,6 @@ struct bcm2835rng_softc {
 	bus_space_tag_t		sc_iot;
 	bus_space_handle_t	sc_ioh;
 
-	kmutex_t		sc_lock;
 	krndsource_t		sc_rndsource;
 };
 
@@ -121,7 +120,6 @@ bcmrng_attach(device_t parent, device_t 
 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, RNG_CTRL, ctrl);
 
 	/* set up an rndsource */
-	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
 	rndsource_setcb(&sc->sc_rndsource, &bcmrng_get, sc);
 	rnd_attach_source(&sc->sc_rndsource, device_xname(self), RND_TYPE_RNG,
 	    RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB);
@@ -134,7 +132,6 @@ bcmrng_get(size_t bytes_wanted, void *ar
 	uint32_t status, cnt;
 	uint32_t buf[RNG_DATA_MAX]; /* 1k on the stack */
 
-	mutex_enter(&sc->sc_lock);
 	while (bytes_wanted) {
 		status = bus_space_read_4(sc->sc_iot, sc->sc_ioh, RNG_STATUS);
 		cnt = __SHIFTOUT(status, RNG_STATUS_CNT);
@@ -148,5 +145,4 @@ bcmrng_get(size_t bytes_wanted, void *ar
 		bytes_wanted -= MIN(bytes_wanted, (cnt * 4));
 	}
 	explicit_memset(buf, 0, sizeof(buf));
-	mutex_exit(&sc->sc_lock);
 }

Index: src/sys/arch/arm/omap/am335x_trng.c
diff -u src/sys/arch/arm/omap/am335x_trng.c:1.4 src/sys/arch/arm/omap/am335x_trng.c:1.5
--- src/sys/arch/arm/omap/am335x_trng.c:1.4	Sat Mar 19 11:37:05 2022
+++ src/sys/arch/arm/omap/am335x_trng.c	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: am335x_trng.c,v 1.4 2022/03/19 11:37:05 riastradh Exp $ */
+/* $NetBSD: am335x_trng.c,v 1.5 2022/03/19 11:55:03 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: am335x_trng.c,v 1.4 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: am335x_trng.c,v 1.5 2022/03/19 11:55:03 riastradh Exp $");
 
 #include "opt_omap.h"
 
@@ -56,7 +56,6 @@ struct trng_softc {
 	bus_space_tag_t sc_iot;
 	bus_space_handle_t sc_ioh;
 
-	kmutex_t sc_lock;
 	krndsource_t sc_rndsource;
 };
 
@@ -99,8 +98,6 @@ trng_attach(device_t parent, device_t se
 		return;
 	}
 
-	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
 	prcm_module_enable(&rng_module);
 
 	if ((TRNG_READ(sc, TRNG_CONTROL_REG) & TRNG_CONTROL_ENABLE) == 0) {
@@ -127,7 +124,6 @@ trng_callback(size_t bytes_wanted, void 
 	uint32_t buf[2];
 	u_int retry;
 
-	mutex_enter(&sc->sc_lock);
 	while (bytes_wanted) {
 		for (retry = 10; retry > 0; retry--) {
 			if (TRNG_READ(sc, TRNG_STATUS_REG) & TRNG_STATUS_READY)
@@ -144,5 +140,4 @@ trng_callback(size_t bytes_wanted, void 
 		bytes_wanted -= MIN(bytes_wanted, sizeof(buf));
 	}
 	explicit_memset(buf, 0, sizeof(buf));
-	mutex_exit(&sc->sc_lock);
 }

Index: src/sys/arch/arm/ti/ti_rng.c
diff -u src/sys/arch/arm/ti/ti_rng.c:1.6 src/sys/arch/arm/ti/ti_rng.c:1.7
--- src/sys/arch/arm/ti/ti_rng.c:1.6	Sat Mar 19 11:37:05 2022
+++ src/sys/arch/arm/ti/ti_rng.c	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ti_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $ */
+/* $NetBSD: ti_rng.c,v 1.7 2022/03/19 11:55:03 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ti_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ti_rng.c,v 1.7 2022/03/19 11:55:03 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -51,7 +51,6 @@ struct ti_rng_softc {
 	bus_space_tag_t sc_iot;
 	bus_space_handle_t sc_ioh;
 
-	kmutex_t sc_lock;
 	krndsource_t sc_rndsource;
 };
 
@@ -101,8 +100,6 @@ ti_rng_attach(device_t parent, device_t 
 		return;
 	}
 
-	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
 	if ((RD4(sc, TRNG_CONTROL_REG) & TRNG_CONTROL_ENABLE) == 0) {
 		WR4(sc, TRNG_CONFIG_REG,
 		    __SHIFTIN(0x21, TRNG_CONFIG_MIN_REFILL) |
@@ -127,7 +124,6 @@ ti_rng_callback(size_t bytes_wanted, voi
 	uint32_t buf[2];
 	u_int retry;
 
-	mutex_enter(&sc->sc_lock);
 	while (bytes_wanted) {
 		for (retry = 10; retry > 0; retry--) {
 			if (RD4(sc, TRNG_STATUS_REG) & TRNG_STATUS_READY)
@@ -144,5 +140,4 @@ ti_rng_callback(size_t bytes_wanted, voi
 		bytes_wanted -= MIN(bytes_wanted, sizeof(buf));
 	}
 	explicit_memset(buf, 0, sizeof(buf));
-	mutex_exit(&sc->sc_lock);
 }

Index: src/sys/arch/mips/cavium/dev/octeon_rnm.c
diff -u src/sys/arch/mips/cavium/dev/octeon_rnm.c:1.14 src/sys/arch/mips/cavium/dev/octeon_rnm.c:1.15
--- src/sys/arch/mips/cavium/dev/octeon_rnm.c:1.14	Sat Mar 19 11:37:05 2022
+++ src/sys/arch/mips/cavium/dev/octeon_rnm.c	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: octeon_rnm.c,v 1.14 2022/03/19 11:37:05 riastradh Exp $	*/
+/*	$NetBSD: octeon_rnm.c,v 1.15 2022/03/19 11:55:03 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2007 Internet Initiative Japan, Inc.
@@ -99,7 +99,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: octeon_rnm.c,v 1.14 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: octeon_rnm.c,v 1.15 2022/03/19 11:55:03 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -127,7 +127,6 @@ struct octrnm_softc {
 	uint64_t		sc_sample[RNG_FIFO_WORDS];
 	bus_space_tag_t		sc_bust;
 	bus_space_handle_t	sc_regh;
-	kmutex_t		sc_lock;
 	krndsource_t		sc_rndsrc;	/* /dev/random source */
 	unsigned		sc_rogroup;
 };
@@ -184,9 +183,6 @@ octrnm_attach(device_t parent, device_t 
 		return;
 	}
 
-	/* Create a mutex to serialize access to the FIFO.  */
-	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
 	/*
 	 * Reset the core, enable the RNG engine without entropy, wait
 	 * 81 cycles for it to produce a single sample, and draw the
@@ -230,7 +226,6 @@ octrnm_rng(size_t nbytes, void *vsc)
 	unsigned i;
 
 	/* Sample the ring oscillators round-robin.  */
-	mutex_enter(&sc->sc_lock);
 	while (needed) {
 		/*
 		 * Switch to the next RO group once we drain the FIFO.
@@ -262,14 +257,9 @@ octrnm_rng(size_t nbytes, void *vsc)
 		    sizeof sc->sc_sample, NBBY*sizeof(sc->sc_sample)/BPB);
 		needed -= MIN(needed, MAX(1, NBBY*sizeof(sc->sc_sample)/BPB));
 
-		/* Now's a good time to yield if need.  */
-		if (__predict_false(preempt_needed())) {
-			mutex_exit(&sc->sc_lock);
-			preempt();
-			mutex_enter(&sc->sc_lock);
-		}
+		/* Now's a good time to yield.  */
+		preempt_point();
 	}
-	mutex_exit(&sc->sc_lock);
 
 	/* Zero the sample.  */
 	explicit_memset(sc->sc_sample, 0, sizeof sc->sc_sample);

Index: src/sys/arch/mips/ingenic/ingenic_rng.c
diff -u src/sys/arch/mips/ingenic/ingenic_rng.c:1.6 src/sys/arch/mips/ingenic/ingenic_rng.c:1.7
--- src/sys/arch/mips/ingenic/ingenic_rng.c:1.6	Sat Mar 19 11:37:05 2022
+++ src/sys/arch/mips/ingenic/ingenic_rng.c	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: ingenic_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $ */
+/*	$NetBSD: ingenic_rng.c,v 1.7 2022/03/19 11:55:03 riastradh Exp $ */
 
 /*-
  * Copyright (c) 2015 Michael McConville
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ingenic_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ingenic_rng.c,v 1.7 2022/03/19 11:55:03 riastradh Exp $");
 
 /*
  * adapted from Jared McNeill's amlogic_rng.c
@@ -59,7 +59,6 @@ struct ingenic_rng_softc {
 	bus_space_tag_t		sc_bst;
 	bus_space_handle_t	sc_bsh;
 
-	kmutex_t		sc_lock;
 	krndsource_t		sc_rndsource;
 };
 
@@ -94,8 +93,6 @@ ingenic_rng_attach(device_t parent, devi
 		return;
 	}
 
-	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
 	aprint_naive(": Ingenic random number generator\n");
 	aprint_normal(": Ingenic random number generator\n");
 
@@ -110,7 +107,6 @@ ingenic_rng_get(size_t bytes_wanted, voi
 	struct ingenic_rng_softc * const sc = priv;
 	uint32_t data;
 
-	mutex_enter(&sc->sc_lock);
 	while (bytes_wanted) {
 		data = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 0);
 		delay(1);
@@ -119,5 +115,4 @@ ingenic_rng_get(size_t bytes_wanted, voi
 		bytes_wanted -= MIN(bytes_wanted, sizeof(data));
 	}
 	explicit_memset(&data, 0, sizeof(data));
-	mutex_exit(&sc->sc_lock);
 }

Index: src/sys/dev/ic/amdccp.c
diff -u src/sys/dev/ic/amdccp.c:1.4 src/sys/dev/ic/amdccp.c:1.5
--- src/sys/dev/ic/amdccp.c:1.4	Sat Mar 19 11:37:06 2022
+++ src/sys/dev/ic/amdccp.c	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: amdccp.c,v 1.4 2022/03/19 11:37:06 riastradh Exp $ */
+/* $NetBSD: amdccp.c,v 1.5 2022/03/19 11:55:03 riastradh Exp $ */
 
 /*
  * Copyright (c) 2018 Jonathan A. Kollasch
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: amdccp.c,v 1.4 2022/03/19 11:37:06 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amdccp.c,v 1.5 2022/03/19 11:55:03 riastradh Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -45,7 +45,6 @@ void
 amdccp_common_attach(struct amdccp_softc *sc)
 {
 
-	mutex_init(&sc->sc_rndlock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
 	rndsource_setcb(&sc->sc_rndsource, amdccp_rnd_callback, sc);
 	rnd_attach_source(&sc->sc_rndsource, device_xname(sc->sc_dev),
 	    RND_TYPE_RNG, RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB);
@@ -74,7 +73,6 @@ amdccp_rnd_callback(size_t bytes_wanted,
 	uint32_t buf[128];
 	size_t cnt;
 
-	mutex_enter(&sc->sc_rndlock);
 	while (bytes_wanted) {
 		const size_t nbytes = MIN(bytes_wanted, sizeof(buf));
 		const size_t nwords = howmany(nbytes, sizeof(buf[0]));
@@ -95,5 +93,4 @@ amdccp_rnd_callback(size_t bytes_wanted,
 		bytes_wanted -= MIN(bytes_wanted, cntby);
 	}
 	explicit_memset(buf, 0, sizeof(buf));
-	mutex_exit(&sc->sc_rndlock);
 }

Index: src/sys/dev/ic/amdccpvar.h
diff -u src/sys/dev/ic/amdccpvar.h:1.1 src/sys/dev/ic/amdccpvar.h:1.2
--- src/sys/dev/ic/amdccpvar.h:1.1	Fri Oct 19 21:09:10 2018
+++ src/sys/dev/ic/amdccpvar.h	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: amdccpvar.h,v 1.1 2018/10/19 21:09:10 jakllsch Exp $ */
+/* $NetBSD: amdccpvar.h,v 1.2 2022/03/19 11:55:03 riastradh Exp $ */
 
 /*
  * Copyright (c) 2018 Jonathan A. Kollasch
@@ -38,7 +38,6 @@ struct amdccp_softc {
 	bus_space_tag_t sc_bst;
 	bus_space_handle_t sc_bsh;
 
-	kmutex_t sc_rndlock;
 	krndsource_t sc_rndsource;
 };
 
Index: src/sys/dev/ic/rng200var.h
diff -u src/sys/dev/ic/rng200var.h:1.1 src/sys/dev/ic/rng200var.h:1.2
--- src/sys/dev/ic/rng200var.h:1.1	Sun Sep  1 14:44:14 2019
+++ src/sys/dev/ic/rng200var.h	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: rng200var.h,v 1.1 2019/09/01 14:44:14 mlelstv Exp $	*/
+/*	$NetBSD: rng200var.h,v 1.2 2022/03/19 11:55:03 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -41,7 +41,6 @@ struct rng200_softc	{
 	bus_space_tag_t		sc_bst;
 	bus_space_handle_t	sc_bsh;
 
-	kmutex_t		sc_lock;
 	krndsource_t		sc_rndsource;
 	const char		*sc_name;
 };

Index: src/sys/dev/ic/rng200.c
diff -u src/sys/dev/ic/rng200.c:1.3 src/sys/dev/ic/rng200.c:1.4
--- src/sys/dev/ic/rng200.c:1.3	Sat Mar 19 11:37:06 2022
+++ src/sys/dev/ic/rng200.c	Sat Mar 19 11:55:03 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: rng200.c,v 1.3 2022/03/19 11:37:06 riastradh Exp $	*/
+/*	$NetBSD: rng200.c,v 1.4 2022/03/19 11:55:03 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -79,7 +79,6 @@ rng200_get(size_t bytes_wanted, void *pr
 	uint32_t w, data;
 	unsigned count;
 
-	mutex_enter(&sc->sc_lock);
 	while (bytes_wanted) {
 
 		w = READ4(sc, RNG200_STATUS);
@@ -98,15 +97,12 @@ rng200_get(size_t bytes_wanted, void *pr
 		bytes_wanted -= MIN(bytes_wanted, sizeof(data));
 	}
 	explicit_memset(&data, 0, sizeof(data));
-	mutex_exit(&sc->sc_lock);
 }
 
 void
 rng200_attach(struct rng200_softc *sc)
 {
 
-	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL);
-
 	rndsource_setcb(&sc->sc_rndsource, rng200_get, sc);
 	rnd_attach_source(&sc->sc_rndsource, sc->sc_name,
 		RND_TYPE_RNG, RND_FLAG_COLLECT_VALUE|RND_FLAG_HASCB);
@@ -117,6 +113,5 @@ rng200_detach(struct rng200_softc *sc)
 {
 
 	rnd_detach_source(&sc->sc_rndsource);
-	mutex_destroy(&sc->sc_lock);
 }
 

Reply via email to