Index | Thread | Search

From:
Mike Larkin <mlarkin@nested.page>
Subject:
Re: qwx: avoid dmamap_create in interrupt context
To:
tech@openbsd.org
Date:
Thu, 28 May 2026 11:07:36 -0700

Download raw body.

Thread
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) {
>