Module Name: src Committed By: mrg Date: Sun Feb 6 22:21:25 UTC 2022
Modified Files: src/sys/arch/arm/arm32: bus_dma.c Log Message: if we have to bounce a buffer, clear our anything already setup in the map before trying again. riastradh@ noticed that a map had two types of mbuf types, and this seems to avoid it as seen on eqos(4) on quartz64. add a couple more event counts for bus dma events. ok @skrll @raistradh @jmcneill XXX: pullup-8 and pullup-9 probably. To generate a diff of this commit: cvs rdiff -u -r1.134 -r1.135 src/sys/arch/arm/arm32/bus_dma.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/arm32/bus_dma.c diff -u src/sys/arch/arm/arm32/bus_dma.c:1.134 src/sys/arch/arm/arm32/bus_dma.c:1.135 --- src/sys/arch/arm/arm32/bus_dma.c:1.134 Mon Dec 20 13:58:58 2021 +++ src/sys/arch/arm/arm32/bus_dma.c Sun Feb 6 22:21:25 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_dma.c,v 1.134 2021/12/20 13:58:58 skrll Exp $ */ +/* $NetBSD: bus_dma.c,v 1.135 2022/02/06 22:21:25 mrg Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2020 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ #include "opt_cputypes.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.134 2021/12/20 13:58:58 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.135 2022/02/06 22:21:25 mrg Exp $"); #include <sys/param.h> @@ -71,6 +71,8 @@ static struct evcnt bus_dma_write_bounce EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "write bounces"); static struct evcnt bus_dma_bounced_unloads = EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "bounced unloads"); +static struct evcnt bus_dma_bounced_mbuf_loads = + EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "bounced mbuf loads"); static struct evcnt bus_dma_unloads = EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "unloads"); static struct evcnt bus_dma_bounced_destroys = @@ -93,6 +95,8 @@ static struct evcnt bus_dma_sync_postrea EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "sync postreadwrite"); static struct evcnt bus_dma_sync_postwrite = EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "sync postwrite"); +static struct evcnt bus_dma_inrange_fail = + EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "inrange check failed"); static struct evcnt bus_dma_sync_coherent_prereadwrite = EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "sync coherent prereadwrite"); @@ -118,6 +122,7 @@ EVCNT_ATTACH_STATIC(bus_dma_unloads); EVCNT_ATTACH_STATIC(bus_dma_bounced_unloads); EVCNT_ATTACH_STATIC(bus_dma_destroys); EVCNT_ATTACH_STATIC(bus_dma_bounced_destroys); +EVCNT_ATTACH_STATIC(bus_dma_bounced_mbuf_loads); EVCNT_ATTACH_STATIC(bus_dma_sync_prereadwrite); EVCNT_ATTACH_STATIC(bus_dma_sync_preread_begin); EVCNT_ATTACH_STATIC(bus_dma_sync_preread); @@ -126,6 +131,7 @@ EVCNT_ATTACH_STATIC(bus_dma_sync_prewrit EVCNT_ATTACH_STATIC(bus_dma_sync_postread); EVCNT_ATTACH_STATIC(bus_dma_sync_postreadwrite); EVCNT_ATTACH_STATIC(bus_dma_sync_postwrite); +EVCNT_ATTACH_STATIC(bus_dma_inrange_fail); EVCNT_ATTACH_STATIC(bus_dma_sync_coherent_prereadwrite); EVCNT_ATTACH_STATIC(bus_dma_sync_coherent_preread); @@ -210,8 +216,10 @@ _bus_dmamap_load_paddr(bus_dma_tag_t t, /* XXX cache last result? */ const struct arm32_dma_range * const dr = _bus_dma_paddr_inrange(t->_ranges, t->_nranges, paddr); - if (dr == NULL) + if (dr == NULL) { + STAT_INCR(inrange_fail); return EINVAL; + } /* * If this region is coherent, mark the segment as coherent. @@ -305,6 +313,15 @@ _bus_dma_load_bouncebuf(bus_dma_tag_t t, } /* + * Since we're trying again, clear the previous attempt. + */ + map->dm_mapsize = 0; + map->dm_nsegs = 0; + map->_dm_buftype = _BUS_DMA_BUFTYPE_INVALID; + /* _bus_dmamap_load_buffer() clears this if we're not... */ + map->_dm_flags |= _BUS_DMAMAP_COHERENT; + + /* * Cache a pointer to the caller's buffer and load the DMA map * with the bounce buffer. */ @@ -698,6 +715,7 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b if (cookie != NULL && (cookie->id_flags & _BUS_DMA_MIGHT_NEED_BOUNCE)) { error = _bus_dma_load_bouncebuf(t, map, m0, m0->m_pkthdr.len, _BUS_DMA_BUFTYPE_MBUF, flags); + STAT_INCR(bounced_mbuf_loads); } #endif return error;