Index | Thread | Search

From:
Marcus Glocker <marcus@nazgul.ch>
Subject:
Re: sys/qwz: use BUS_DMA_WAITOK in qwz_dmamem_alloc() like qwx
To:
"Kirill A. Korinsky" <kirill@korins.ky>
Cc:
tech@openbsd.org
Date:
Mon, 25 May 2026 06:06:02 +0200

Download raw body.

Thread
On Mon, May 25, 2026 at 12:21:21AM +0200, Kirill A. Korinsky wrote:

> tech@,
> 
> I had investigated errors:
> 
> qwz0: failed to setup rxd tid queue for tid 15: 12
> qwz0: failed to setup dp for peer b6:fb:e4:9b:48:af on vdev 0 (12)
> 
> and 12 here is ENOMEM, and that invstigation, with comparing agains qwx,
> revealed that qwz uses BUS_DMA_NOWAIT when qwx uses BUS_DMA_WAITOK which
> was a fix by kettenis@ at qwx.c,v 1.99 and 1.101.
> 
> Ok?

Good catch!  Saw that issue on the Samsung as well.

ok mglocker@
 
> Index: sys/dev/ic/qwz.c
> ===================================================================
> RCS file: /home/cvs/src/sys/dev/ic/qwz.c,v
> diff -u -p -r1.34 qwz.c
> --- sys/dev/ic/qwz.c	23 May 2026 12:27:41 -0000	1.34
> +++ sys/dev/ic/qwz.c	24 May 2026 21:36:27 -0000
> @@ -24649,25 +24649,23 @@ qwz_dmamem_alloc(bus_dma_tag_t dmat, bus
>  	struct qwz_dmamem *adm;
>  	int nsegs;
>  
> -	adm = malloc(sizeof(*adm), M_DEVBUF, M_NOWAIT | M_ZERO);
> -	if (adm == NULL)
> -		return NULL;
> +	adm = malloc(sizeof(*adm), M_DEVBUF, M_WAITOK | M_ZERO);
>  	adm->size = size;
>  
>  	if (bus_dmamap_create(dmat, size, 1, size, 0,
> -	    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &adm->map) != 0)
> +	    BUS_DMA_WAITOK | BUS_DMA_ALLOCNOW, &adm->map) != 0)
>  		goto admfree;
>  
>  	if (bus_dmamem_alloc_range(dmat, size, align, 0, &adm->seg, 1,
> -	    &nsegs, BUS_DMA_NOWAIT | BUS_DMA_ZERO, 0, 0xffffffff) != 0)
> +	    &nsegs, BUS_DMA_WAITOK | BUS_DMA_ZERO, 0, 0xffffffff) != 0)
>  		goto destroy;
>  
>  	if (bus_dmamem_map(dmat, &adm->seg, nsegs, size,
> -	    &adm->kva, BUS_DMA_NOWAIT | BUS_DMA_COHERENT) != 0)
> +	    &adm->kva, BUS_DMA_WAITOK | BUS_DMA_COHERENT) != 0)
>  		goto free;
>  
>  	if (bus_dmamap_load_raw(dmat, adm->map, &adm->seg, nsegs, size,
> -	    BUS_DMA_NOWAIT) != 0)
> +	    BUS_DMA_WAITOK) != 0)
>  		goto unmap;
>  
>  	bzero(adm->kva, size);
> @@ -24689,6 +24687,7 @@ admfree:
>  void
>  qwz_dmamem_free(bus_dma_tag_t dmat, struct qwz_dmamem *adm)
>  {
> +	bus_dmamap_unload(dmat, adm->map);
>  	bus_dmamem_unmap(dmat, adm->kva, adm->size);
>  	bus_dmamem_free(dmat, &adm->seg, 1);
>  	bus_dmamap_destroy(dmat, adm->map);
> 
> -- 
> wbr, Kirill
>