From b83f28b91190b6fe558dc1fb440beb33210624a8 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Sun, 18 Jan 2009 11:56:03 +0800 Subject: [PATCH] busdma(9): Add bus_dmamap_load_mbuf_defrag() This function is mainly used to avoid code duplication in various (should be many) NIC driver code. --- sys/kern/subr_busdma.c | 27 +++++++++++++++++++++++++++ sys/sys/bus_dma.h | 11 +++++++++++ 2 files changed, 38 insertions(+) diff --git a/sys/kern/subr_busdma.c b/sys/kern/subr_busdma.c index e5cee385f7..a9bb313b12 100644 --- a/sys/kern/subr_busdma.c +++ b/sys/kern/subr_busdma.c @@ -35,6 +35,7 @@ #include #include #include +#include static void _bus_dmamem_coherent_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) @@ -91,3 +92,29 @@ bus_dmamem_coherent(bus_dma_tag_t parent, } return 0; } + +int +bus_dmamap_load_mbuf_defrag(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf **m_head, + bus_dma_segment_t *segs, int maxsegs, + int *nsegs, int flags) +{ + struct mbuf *m = *m_head; + int error; + + error = bus_dmamap_load_mbuf_segment(dmat, map, m, + segs, maxsegs, nsegs, flags); + if (error == EFBIG) { + struct mbuf *m_new; + + m_new = m_defrag(m, MB_DONTWAIT); + if (m_new == NULL) + return ENOBUFS; + else + *m_head = m = m_new; + + error = bus_dmamap_load_mbuf_segment(dmat, map, m, + segs, maxsegs, nsegs, BUS_DMA_NOWAIT); + } + return error; +} diff --git a/sys/sys/bus_dma.h b/sys/sys/bus_dma.h index b1b3c03c25..b4fe07d0e2 100644 --- a/sys/sys/bus_dma.h +++ b/sys/sys/bus_dma.h @@ -256,6 +256,17 @@ bus_dmamap_load_mbuf_segment(bus_dma_tag_t dmat, bus_dmamap_t map, bus_dma_segment_t *segs, int maxsegs, int *nsegs, int flags); +/* + * Like bus_dmamap_load_mbuf_segment, but it will call m_defrag() + * and try reloading if low level code indicates too many fragments + * in the '*mbuf'; 'mbuf' will be updated under this situation. + */ +int +bus_dmamap_load_mbuf_defrag(bus_dma_tag_t dmat, bus_dmamap_t map, + struct mbuf **mbuf, + bus_dma_segment_t *segs, int maxsegs, + int *nsegs, int flags); + /* * Convenient function to create coherent busdma memory */ -- 2.41.0