Date: Mon, 14 Apr 2003 17:54:58 +0900 From: Hidetoshi Shimokawa <simokawa@sat.t.u-tokyo.ac.jp> To: Jake Burkholder <jake@locore.ca> Cc: cvs-src@FreeBSD.org Subject: Re: cvs commit: src/sys/i386/i386 busdma_machdep.c Message-ID: <ybsr8851msd.wl@ett.sat.t.u-tokyo.ac.jp> In-Reply-To: <20030414073329.GC97094@locore.ca> References: <200304140419.h3E4Jgwi070671@repoman.freebsd.org> <20030414073329.GC97094@locore.ca>
next in thread | previous in thread | raw e-mail | index | archive | help
At Mon, 14 Apr 2003 03:33:29 -0400, Jake Burkholder wrote: > > Apparently, On Sun, Apr 13, 2003 at 09:19:42PM -0700, > Hidetoshi Shimokawa said words to the effect of; > > > simokawa 2003/04/13 21:19:42 PDT > > > > FreeBSD src repository > > > > Modified files: > > sys/i386/i386 busdma_machdep.c > > Log: > > * Use _bus_dmamap_load_buffer() and respect maxsegsz in bus_dmamap_load(). > > Ignoring maxsegsz may lead to fatal data corruption for some devices. > > ex. SBP-2/FireWire > > Hmm. _bus_dmamap_load_buffer doesn't handle delayed loads due to lack > of resources like bus_dmamap_load does (did). I think you will need to > respect BUS_DMA_WAITOK/BUS_DMA_NOWAIT in the flags argument to > _bus_dmamap_load_buffer, and pass BUS_DMA_WAITOK in bus_dmamap_load and > BUS_DMA_NOWAIT in other cases. If _bus_dmamap_load_buffer runs out of > resources it should return EINPROGRESS and queue the request if > BUS_DMA_WAITOK is specified, or return ENOMEM if BUS_DMA_NOWAIT is specified. You are right. How about this patch? /\ Hidetoshi Shimokawa \/ simokawa@sat.t.u-tokyo.ac.jp PGP public key: http://www.sat.t.u-tokyo.ac.jp/~simokawa/pgp.html Index: busdma_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/busdma_machdep.c,v retrieving revision 1.41 diff -u -r1.41 busdma_machdep.c --- busdma_machdep.c 14 Apr 2003 04:19:42 -0000 1.41 +++ busdma_machdep.c 14 Apr 2003 08:52:48 -0000 @@ -464,9 +464,22 @@ /* Reserve Necessary Bounce Pages */ if (map->pagesneeded != 0) { mtx_lock(&bounce_lock); - if (reserve_bounce_pages(dmat, map, 0) != 0) { - mtx_unlock(&bounce_lock); - return (ENOMEM); + if (flags & BUS_DMA_NOWAIT) { + if (reserve_bounce_pages(dmat, map, 0) != 0) { + mtx_unlock(&bounce_lock); + return (ENOMEM); + } + } else { + if (reserve_bounce_pages(dmat, map, 1) != 0) { + /* Queue us for resources */ + map->dmat = dmat; + map->buf = buf; + map->buflen = buflen; + STAILQ_INSERT_TAIL(&bounce_map_waitinglist, + map, links); + mtx_unlock(&bounce_lock); + return (EINPROGRESS); + } } mtx_unlock(&bounce_lock); } @@ -556,9 +569,16 @@ bus_addr_t lastaddr = 0; int error, nsegs = 0; + flags |= BUS_DMA_WAITOK; + map->callback = callback; + map->callback_arg = callback_arg; + error = _bus_dmamap_load_buffer(dmat, map, dm_segments, buf, buflen, NULL, flags, &lastaddr, &nsegs, 1); + if (error == EINPROGRESS) + return error; + if (error) (*callback)(callback_arg, dm_segments, 0, error); else @@ -587,6 +607,7 @@ KASSERT(m0->m_flags & M_PKTHDR, ("bus_dmamap_load_mbuf: no packet header")); + flags |= BUS_DMA_NOWAIT; nsegs = 0; error = 0; if (m0->m_pkthdr.len <= dmat->maxsize) { @@ -638,6 +659,7 @@ struct iovec *iov; struct thread *td = NULL; + flags |= BUS_DMA_NOWAIT; resid = uio->uio_resid; iov = uio->uio_iov;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ybsr8851msd.wl>