diff options
| author | riastradh <riastradh@NetBSD.org> | 2022-03-19 11:55:03 +0000 |
|---|---|---|
| committer | riastradh <riastradh@NetBSD.org> | 2022-03-19 11:55:03 +0000 |
| commit | fa5a7cd4feae6182b6f5f4e96eb094546fa352ea (patch) | |
| tree | d5a343a59180b85a9efeeb5f727cbe5b8c1f3502 | |
| parent | b2f23986bc461ea1f2c7b9f45d032fc63b597ba3 (diff) | |
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.)
| -rw-r--r-- | sys/arch/arm/broadcom/bcm2835_rng.c | 8 | ||||
| -rw-r--r-- | sys/arch/arm/omap/am335x_trng.c | 9 | ||||
| -rw-r--r-- | sys/arch/arm/ti/ti_rng.c | 9 | ||||
| -rw-r--r-- | sys/arch/mips/cavium/dev/octeon_rnm.c | 18 | ||||
| -rw-r--r-- | sys/arch/mips/ingenic/ingenic_rng.c | 9 | ||||
| -rw-r--r-- | sys/dev/ic/amdccp.c | 7 | ||||
| -rw-r--r-- | sys/dev/ic/amdccpvar.h | 3 | ||||
| -rw-r--r-- | sys/dev/ic/rng200.c | 7 | ||||
| -rw-r--r-- | sys/dev/ic/rng200var.h | 3 |
9 files changed, 17 insertions, 56 deletions
diff --git a/sys/arch/arm/broadcom/bcm2835_rng.c b/sys/arch/arm/broadcom/bcm2835_rng.c index 04061c76731..c759ce04908 100644 --- a/sys/arch/arm/broadcom/bcm2835_rng.c +++ b/sys/arch/arm/broadcom/bcm2835_rng.c @@ -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 self, void *aux) 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 *arg) 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 *arg) bytes_wanted -= MIN(bytes_wanted, (cnt * 4)); } explicit_memset(buf, 0, sizeof(buf)); - mutex_exit(&sc->sc_lock); } diff --git a/sys/arch/arm/omap/am335x_trng.c b/sys/arch/arm/omap/am335x_trng.c index ebfb3a4d967..76d99a34d07 100644 --- a/sys/arch/arm/omap/am335x_trng.c +++ b/sys/arch/arm/omap/am335x_trng.c @@ -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 <jmcneill@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 self, void *aux) 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 *priv) 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 *priv) bytes_wanted -= MIN(bytes_wanted, sizeof(buf)); } explicit_memset(buf, 0, sizeof(buf)); - mutex_exit(&sc->sc_lock); } diff --git a/sys/arch/arm/ti/ti_rng.c b/sys/arch/arm/ti/ti_rng.c index a0a59bc4a09..4270ab64490 100644 --- a/sys/arch/arm/ti/ti_rng.c +++ b/sys/arch/arm/ti/ti_rng.c @@ -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 <jmcneill@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 self, void *aux) 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, void *priv) 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, void *priv) bytes_wanted -= MIN(bytes_wanted, sizeof(buf)); } explicit_memset(buf, 0, sizeof(buf)); - mutex_exit(&sc->sc_lock); } diff --git a/sys/arch/mips/cavium/dev/octeon_rnm.c b/sys/arch/mips/cavium/dev/octeon_rnm.c index c5736edbcb5..f0ef235fe03 100644 --- a/sys/arch/mips/cavium/dev/octeon_rnm.c +++ b/sys/arch/mips/cavium/dev/octeon_rnm.c @@ -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 self, void *aux) 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); diff --git a/sys/arch/mips/ingenic/ingenic_rng.c b/sys/arch/mips/ingenic/ingenic_rng.c index 9f4d1ba01f3..791b45fea89 100644 --- a/sys/arch/mips/ingenic/ingenic_rng.c +++ b/sys/arch/mips/ingenic/ingenic_rng.c @@ -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, device_t self, void *aux) 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, void *priv) 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, void *priv) bytes_wanted -= MIN(bytes_wanted, sizeof(data)); } explicit_memset(&data, 0, sizeof(data)); - mutex_exit(&sc->sc_lock); } diff --git a/sys/dev/ic/amdccp.c b/sys/dev/ic/amdccp.c index 6d3071c40b3..702fd5b2277 100644 --- a/sys/dev/ic/amdccp.c +++ b/sys/dev/ic/amdccp.c @@ -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, void *priv) 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, void *priv) bytes_wanted -= MIN(bytes_wanted, cntby); } explicit_memset(buf, 0, sizeof(buf)); - mutex_exit(&sc->sc_rndlock); } diff --git a/sys/dev/ic/amdccpvar.h b/sys/dev/ic/amdccpvar.h index 92698f94a9a..e95a56eac81 100644 --- a/sys/dev/ic/amdccpvar.h +++ b/sys/dev/ic/amdccpvar.h @@ -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; }; diff --git a/sys/dev/ic/rng200.c b/sys/dev/ic/rng200.c index f16e26f8f63..692f0480c3d 100644 --- a/sys/dev/ic/rng200.c +++ b/sys/dev/ic/rng200.c @@ -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 *priv) 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 *priv) 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); } diff --git a/sys/dev/ic/rng200var.h b/sys/dev/ic/rng200var.h index fe00d799ee5..3fc770e3eaf 100644 --- a/sys/dev/ic/rng200var.h +++ b/sys/dev/ic/rng200var.h @@ -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; }; |
