From: Mark Kettenis Subject: Re: sys/qwz: use BUS_DMA_WAITOK in qwz_dmamem_alloc() like qwx To: Kirill A. Korinsky Cc: tech@openbsd.org Date: Mon, 25 May 2026 10:16:57 +0200 > Date: Mon, 25 May 2026 00:21:21 +0200 > From: Kirill A. Korinsky > > 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? ok kettenis@ > 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 > >