From: Mike Larkin Subject: Re: qwx: avoid dmamap_create in interrupt context To: tech@openbsd.org Date: Thu, 28 May 2026 11:07:36 -0700 On Thu, May 28, 2026 at 06:09:33PM +0200, Stefan Sperling wrote: > Avoid calling bus_dmamap_create() in interrupt context. > Fixes splasserts found in my dmesg. > > These maps are destroyed when the interface is put down so it seems > the cleanup path for these maps is already correct. > > ok? > had these splasserts to investigate on my list also, so thanks. ok mlarkin > M sys/dev/ic/qwx.c | 12+ 14- > > 1 file changed, 12 insertions(+), 14 deletions(-) > > commit - 0011eb694ed868029b1350be16b78dba35476655 > commit + a9d9214d750de25ef4b76cd274a323488ce6822e > blob - 553e2b8dd4ac76e3e225558ee38039a9f5de4c00 > blob + 8e1d89bce62598a9f5bc82ea2f5ce06f8a477963 > --- sys/dev/ic/qwx.c > +++ sys/dev/ic/qwx.c > @@ -15278,12 +15278,7 @@ qwx_dp_rxbufs_replenish(struct qwx_softc *sc, int mac_ > goto fail_free_mbuf; > > rx_data = &rx_ring->rx_data[idx]; > - if (rx_data->map == NULL) { > - ret = bus_dmamap_create(sc->sc_dmat, size, 1, > - size, 0, BUS_DMA_NOWAIT, &rx_data->map); > - if (ret) > - goto fail_free_mbuf; > - } > + KASSERT(rx_data->map); > > ret = bus_dmamap_load_mbuf(sc->sc_dmat, rx_data->map, m, > BUS_DMA_READ | BUS_DMA_NOWAIT); > @@ -15333,7 +15328,7 @@ qwx_dp_rxdma_ring_buf_setup(struct qwx_softc *sc, > struct dp_rxdma_ring *rx_ring, uint32_t ringtype) > { > struct qwx_pdev_dp *dp = &sc->pdev_dp; > - int num_entries; > + int num_entries, i; > > num_entries = rx_ring->refill_buf_ring.size / > qwx_hal_srng_get_entrysize(sc, ringtype); > @@ -15344,6 +15339,14 @@ qwx_dp_rxdma_ring_buf_setup(struct qwx_softc *sc, > if (rx_ring->rx_data == NULL) > return ENOMEM; > > + for (i = 0; i < num_entries; i++) { > + struct qwx_rx_data *rx_data = &rx_ring->rx_data[i]; > + > + if (bus_dmamap_create(sc->sc_dmat, DP_RX_BUFFER_SIZE, 1, > + DP_RX_BUFFER_SIZE, 0, BUS_DMA_NOWAIT, &rx_data->map)) > + return ENOMEM; > + } > + > rx_ring->bufs_max = num_entries; > memset(rx_ring->freemap, 0xff, sizeof(rx_ring->freemap)); > > @@ -17674,13 +17677,8 @@ qwx_dp_rx_alloc_mon_status_buf(struct qwx_softc *sc, > if (rx_data->m != NULL) > goto fail_free_mbuf; > > - if (rx_data->map == NULL) { > - ret = bus_dmamap_create(sc->sc_dmat, size, 1, > - size, 0, BUS_DMA_NOWAIT, &rx_data->map); > - if (ret) > - goto fail_free_mbuf; > - } > - > + KASSERT(rx_data->map); > + > ret = bus_dmamap_load_mbuf(sc->sc_dmat, rx_data->map, m, > BUS_DMA_READ | BUS_DMA_NOWAIT); > if (ret) { >