Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
sys/qwz: use BUS_DMA_WAITOK in qwz_dmamem_alloc() like qwx
To:
OpenBSD tech <tech@openbsd.org>
Date:
Mon, 25 May 2026 00:21:21 +0200

Download raw body.

Thread
  • Kirill A. Korinsky:

    sys/qwz: use BUS_DMA_WAITOK in qwz_dmamem_alloc() like qwx

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?

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