Module Name: src Committed By: riastradh Date: Sat Mar 19 11:37:06 UTC 2022
Modified Files: src/sys/arch/arm/broadcom: bcm2835_rng.c src/sys/arch/arm/omap: am335x_trng.c src/sys/arch/arm/rockchip: rk_v1crypto.c src/sys/arch/arm/sunxi: sun8i_crypto.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 rng200.c src/sys/dev/pci: amdpm.c viornd.c src/sys/dev/usb: ualea.c Log Message: rnd(9): Adjust IPL of locks used by rndsource callbacks. These no longer ever run from hard interrupt context or with a spin lock held, so there is no longer any need to have them at IPL_VM to block hard interrupts. Instead, lower them to IPL_SOFTSERIAL. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/broadcom/bcm2835_rng.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/omap/am335x_trng.c cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/rockchip/rk_v1crypto.c cvs rdiff -u -r1.29 -r1.30 src/sys/arch/arm/sunxi/sun8i_crypto.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/ti/ti_rng.c cvs rdiff -u -r1.13 -r1.14 src/sys/arch/mips/cavium/dev/octeon_rnm.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/mips/ingenic/ingenic_rng.c cvs rdiff -u -r1.3 -r1.4 src/sys/dev/ic/amdccp.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/rng200.c cvs rdiff -u -r1.42 -r1.43 src/sys/dev/pci/amdpm.c cvs rdiff -u -r1.14 -r1.15 src/sys/dev/pci/viornd.c cvs rdiff -u -r1.15 -r1.16 src/sys/dev/usb/ualea.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.15 src/sys/arch/arm/broadcom/bcm2835_rng.c:1.16 --- src/sys/arch/arm/broadcom/bcm2835_rng.c:1.15 Wed Jan 27 03:10:19 2021 +++ src/sys/arch/arm/broadcom/bcm2835_rng.c Sat Mar 19 11:37:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: bcm2835_rng.c,v 1.15 2021/01/27 03:10:19 thorpej Exp $ */ +/* $NetBSD: bcm2835_rng.c,v 1.16 2022/03/19 11:37:05 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.15 2021/01/27 03:10:19 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bcm2835_rng.c,v 1.16 2022/03/19 11:37:05 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -121,7 +121,7 @@ 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_VM); + 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 +134,7 @@ bcmrng_get(size_t bytes_wanted, void *ar uint32_t status, cnt; uint32_t buf[RNG_DATA_MAX]; /* 1k on the stack */ - mutex_spin_enter(&sc->sc_lock); + 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 +148,5 @@ bcmrng_get(size_t bytes_wanted, void *ar bytes_wanted -= MIN(bytes_wanted, (cnt * 4)); } explicit_memset(buf, 0, sizeof(buf)); - mutex_spin_exit(&sc->sc_lock); + 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.3 src/sys/arch/arm/omap/am335x_trng.c:1.4 --- src/sys/arch/arm/omap/am335x_trng.c:1.3 Thu Apr 30 03:40:52 2020 +++ src/sys/arch/arm/omap/am335x_trng.c Sat Mar 19 11:37:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: am335x_trng.c,v 1.3 2020/04/30 03:40:52 riastradh Exp $ */ +/* $NetBSD: am335x_trng.c,v 1.4 2022/03/19 11:37:05 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.3 2020/04/30 03:40:52 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: am335x_trng.c,v 1.4 2022/03/19 11:37:05 riastradh Exp $"); #include "opt_omap.h" @@ -99,7 +99,7 @@ trng_attach(device_t parent, device_t se return; } - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL); prcm_module_enable(&rng_module); Index: src/sys/arch/arm/rockchip/rk_v1crypto.c diff -u src/sys/arch/arm/rockchip/rk_v1crypto.c:1.7 src/sys/arch/arm/rockchip/rk_v1crypto.c:1.8 --- src/sys/arch/arm/rockchip/rk_v1crypto.c:1.7 Wed Jan 27 03:10:19 2021 +++ src/sys/arch/arm/rockchip/rk_v1crypto.c Sat Mar 19 11:37:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: rk_v1crypto.c,v 1.7 2021/01/27 03:10:19 thorpej Exp $ */ +/* $NetBSD: rk_v1crypto.c,v 1.8 2022/03/19 11:37:05 riastradh Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: rk_v1crypto.c,v 1.7 2021/01/27 03:10:19 thorpej Exp $"); +__KERNEL_RCSID(1, "$NetBSD: rk_v1crypto.c,v 1.8 2022/03/19 11:37:05 riastradh Exp $"); #include <sys/types.h> @@ -128,7 +128,7 @@ rk_v1crypto_attach(device_t parent, devi sc->sc_dev = self; sc->sc_bst = faa->faa_bst; - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL); /* Get and map device registers. */ if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) { Index: src/sys/arch/arm/sunxi/sun8i_crypto.c diff -u src/sys/arch/arm/sunxi/sun8i_crypto.c:1.29 src/sys/arch/arm/sunxi/sun8i_crypto.c:1.30 --- src/sys/arch/arm/sunxi/sun8i_crypto.c:1.29 Fri Mar 18 23:36:57 2022 +++ src/sys/arch/arm/sunxi/sun8i_crypto.c Sat Mar 19 11:37:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: sun8i_crypto.c,v 1.29 2022/03/18 23:36:57 riastradh Exp $ */ +/* $NetBSD: sun8i_crypto.c,v 1.30 2022/03/19 11:37:05 riastradh Exp $ */ /*- * Copyright (c) 2019 The NetBSD Foundation, Inc. @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: sun8i_crypto.c,v 1.29 2022/03/18 23:36:57 riastradh Exp $"); +__KERNEL_RCSID(1, "$NetBSD: sun8i_crypto.c,v 1.30 2022/03/19 11:37:05 riastradh Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -390,10 +390,10 @@ sun8i_crypto_attach(device_t parent, dev sc->sc_dmat = faa->faa_dmat; sc->sc_bst = faa->faa_bst; sc->sc_taskpool = pool_cache_init(sizeof(struct sun8i_crypto_task), - 0, 0, 0, "sun8icry", NULL, IPL_VM, + 0, 0, 0, "sun8icry", NULL, IPL_SOFTSERIAL, &sun8i_crypto_task_ctor, &sun8i_crypto_task_dtor, sc); sc->sc_cfg = of_compatible_lookup(phandle, compat_data)->data; - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL); mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_VM); callout_init(&sc->sc_timeout, CALLOUT_MPSAFE); callout_setfunc(&sc->sc_timeout, &sun8i_crypto_timeout, sc); Index: src/sys/arch/arm/ti/ti_rng.c diff -u src/sys/arch/arm/ti/ti_rng.c:1.5 src/sys/arch/arm/ti/ti_rng.c:1.6 --- src/sys/arch/arm/ti/ti_rng.c:1.5 Wed Jan 27 03:10:20 2021 +++ src/sys/arch/arm/ti/ti_rng.c Sat Mar 19 11:37:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ti_rng.c,v 1.5 2021/01/27 03:10:20 thorpej Exp $ */ +/* $NetBSD: ti_rng.c,v 1.6 2022/03/19 11:37:05 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.5 2021/01/27 03:10:20 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ti_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -101,7 +101,7 @@ ti_rng_attach(device_t parent, device_t return; } - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL); if ((RD4(sc, TRNG_CONTROL_REG) & TRNG_CONTROL_ENABLE) == 0) { WR4(sc, TRNG_CONFIG_REG, Index: src/sys/arch/mips/cavium/dev/octeon_rnm.c diff -u src/sys/arch/mips/cavium/dev/octeon_rnm.c:1.13 src/sys/arch/mips/cavium/dev/octeon_rnm.c:1.14 --- src/sys/arch/mips/cavium/dev/octeon_rnm.c:1.13 Tue Dec 28 13:22:43 2021 +++ src/sys/arch/mips/cavium/dev/octeon_rnm.c Sat Mar 19 11:37:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: octeon_rnm.c,v 1.13 2021/12/28 13:22:43 riastradh Exp $ */ +/* $NetBSD: octeon_rnm.c,v 1.14 2022/03/19 11:37:05 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.13 2021/12/28 13:22:43 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: octeon_rnm.c,v 1.14 2022/03/19 11:37:05 riastradh Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -185,7 +185,7 @@ octrnm_attach(device_t parent, device_t } /* Create a mutex to serialize access to the FIFO. */ - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL); /* * Reset the core, enable the RNG engine without entropy, wait Index: src/sys/arch/mips/ingenic/ingenic_rng.c diff -u src/sys/arch/mips/ingenic/ingenic_rng.c:1.5 src/sys/arch/mips/ingenic/ingenic_rng.c:1.6 --- src/sys/arch/mips/ingenic/ingenic_rng.c:1.5 Thu Apr 30 03:40:53 2020 +++ src/sys/arch/mips/ingenic/ingenic_rng.c Sat Mar 19 11:37:05 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ingenic_rng.c,v 1.5 2020/04/30 03:40:53 riastradh Exp $ */ +/* $NetBSD: ingenic_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $ */ /*- * Copyright (c) 2015 Michael McConville @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ingenic_rng.c,v 1.5 2020/04/30 03:40:53 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ingenic_rng.c,v 1.6 2022/03/19 11:37:05 riastradh Exp $"); /* * adapted from Jared McNeill's amlogic_rng.c @@ -94,7 +94,7 @@ ingenic_rng_attach(device_t parent, devi return; } - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM); + 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 +110,7 @@ ingenic_rng_get(size_t bytes_wanted, voi struct ingenic_rng_softc * const sc = priv; uint32_t data; - mutex_spin_enter(&sc->sc_lock); + mutex_enter(&sc->sc_lock); while (bytes_wanted) { data = bus_space_read_4(sc->sc_bst, sc->sc_bsh, 0); delay(1); @@ -119,5 +119,5 @@ ingenic_rng_get(size_t bytes_wanted, voi bytes_wanted -= MIN(bytes_wanted, sizeof(data)); } explicit_memset(&data, 0, sizeof(data)); - mutex_spin_exit(&sc->sc_lock); + mutex_exit(&sc->sc_lock); } Index: src/sys/dev/ic/amdccp.c diff -u src/sys/dev/ic/amdccp.c:1.3 src/sys/dev/ic/amdccp.c:1.4 --- src/sys/dev/ic/amdccp.c:1.3 Mon Aug 23 23:55:43 2021 +++ src/sys/dev/ic/amdccp.c Sat Mar 19 11:37:06 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: amdccp.c,v 1.3 2021/08/23 23:55:43 mrg Exp $ */ +/* $NetBSD: amdccp.c,v 1.4 2022/03/19 11:37:06 riastradh Exp $ */ /* * Copyright (c) 2018 Jonathan A. Kollasch @@ -28,7 +28,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amdccp.c,v 1.3 2021/08/23 23:55:43 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amdccp.c,v 1.4 2022/03/19 11:37:06 riastradh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -44,7 +44,8 @@ static void amdccp_rnd_callback(size_t, void amdccp_common_attach(struct amdccp_softc *sc) { - mutex_init(&sc->sc_rndlock, MUTEX_DEFAULT, IPL_VM); + + 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); Index: src/sys/dev/ic/rng200.c diff -u src/sys/dev/ic/rng200.c:1.2 src/sys/dev/ic/rng200.c:1.3 --- src/sys/dev/ic/rng200.c:1.2 Thu Apr 30 03:40:53 2020 +++ src/sys/dev/ic/rng200.c Sat Mar 19 11:37:06 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: rng200.c,v 1.2 2020/04/30 03:40:53 riastradh Exp $ */ +/* $NetBSD: rng200.c,v 1.3 2022/03/19 11:37:06 riastradh Exp $ */ /* * Copyright (c) 2019 The NetBSD Foundation, Inc. @@ -79,7 +79,7 @@ rng200_get(size_t bytes_wanted, void *pr uint32_t w, data; unsigned count; - mutex_spin_enter(&sc->sc_lock); + mutex_enter(&sc->sc_lock); while (bytes_wanted) { w = READ4(sc, RNG200_STATUS); @@ -98,14 +98,14 @@ rng200_get(size_t bytes_wanted, void *pr bytes_wanted -= MIN(bytes_wanted, sizeof(data)); } explicit_memset(&data, 0, sizeof(data)); - mutex_spin_exit(&sc->sc_lock); + mutex_exit(&sc->sc_lock); } void rng200_attach(struct rng200_softc *sc) { - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_VM); + 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, Index: src/sys/dev/pci/amdpm.c diff -u src/sys/dev/pci/amdpm.c:1.42 src/sys/dev/pci/amdpm.c:1.43 --- src/sys/dev/pci/amdpm.c:1.42 Sat May 30 10:27:29 2020 +++ src/sys/dev/pci/amdpm.c Sat Mar 19 11:37:06 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: amdpm.c,v 1.42 2020/05/30 10:27:29 jdolecek Exp $ */ +/* $NetBSD: amdpm.c,v 1.43 2022/03/19 11:37:06 riastradh Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amdpm.c,v 1.42 2020/05/30 10:27:29 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amdpm.c,v 1.43 2022/03/19 11:37:06 riastradh Exp $"); #include "opt_amdpm.h" @@ -159,8 +159,7 @@ amdpm_attach(device_t parent, device_t s AMDPM_TMR, ((confreg & AMDPM_TMR32) ? ACPIPMT_32BIT : 0)); } - /* XXX this mutex is IPL_VM because it can be taken by rnd_getmore() */ - mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_VM); + mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_SOFTSERIAL); /* try to attach devices on the smbus */ if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_AMD_PBC8111_ACPI || Index: src/sys/dev/pci/viornd.c diff -u src/sys/dev/pci/viornd.c:1.14 src/sys/dev/pci/viornd.c:1.15 --- src/sys/dev/pci/viornd.c:1.14 Wed Jan 20 19:46:48 2021 +++ src/sys/dev/pci/viornd.c Sat Mar 19 11:37:06 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: viornd.c,v 1.14 2021/01/20 19:46:48 reinoud Exp $ */ +/* $NetBSD: viornd.c,v 1.15 2022/03/19 11:37:06 riastradh Exp $ */ /* $OpenBSD: viornd.c,v 1.1 2014/01/21 21:14:58 sf Exp $ */ /* @@ -139,9 +139,9 @@ viornd_attach(device_t parent, device_t sc->sc_dev = self; sc->sc_virtio = vsc; - mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_VM); + mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_SOFTSERIAL); - error = bus_dmamem_alloc(virtio_dmat(vsc), + error = bus_dmamem_alloc(virtio_dmat(vsc), VIRTIO_PAGE_SIZE, 0, 0, segs, 1, &nsegs, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW); if (error) { @@ -247,6 +247,6 @@ viornd_vq_done(struct virtqueue *vq) out: virtio_dequeue_commit(vsc, vq, slot); mutex_exit(&sc->sc_mutex); - + return 1; } Index: src/sys/dev/usb/ualea.c diff -u src/sys/dev/usb/ualea.c:1.15 src/sys/dev/usb/ualea.c:1.16 --- src/sys/dev/usb/ualea.c:1.15 Thu Mar 3 06:06:52 2022 +++ src/sys/dev/usb/ualea.c Sat Mar 19 11:37:06 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ualea.c,v 1.15 2022/03/03 06:06:52 riastradh Exp $ */ +/* $NetBSD: ualea.c,v 1.16 2022/03/19 11:37:06 riastradh Exp $ */ /*- * Copyright (c) 2017 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ualea.c,v 1.15 2022/03/03 06:06:52 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ualea.c,v 1.16 2022/03/19 11:37:06 riastradh Exp $"); #include <sys/types.h> #include <sys/atomic.h> @@ -104,7 +104,7 @@ ualea_attach(device_t parent, device_t s /* Initialize the softc. */ sc->sc_dev = self; - mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB); + mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTSERIAL); /* Get endpoint descriptor 0. Make sure it's bulk-in. */ ed = usbd_interface2endpoint_descriptor(uiaa->uiaa_iface, 0);