Download raw body.
qwx: avoid dmamap_create in interrupt context
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) {
>
qwx: avoid dmamap_create in interrupt context