Module Name: src
Committed By: matt
Date: Tue Jan 12 06:38:20 UTC 2010
Modified Files:
src/sys/arch/mips/mips [matt-nb5-mips64]: bus_dma.c
Log Message:
Add some evcnts for bounce buffers
To generate a diff of this commit:
cvs rdiff -u -r1.22.16.10 -r1.22.16.11 src/sys/arch/mips/mips/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/mips/mips/bus_dma.c
diff -u src/sys/arch/mips/mips/bus_dma.c:1.22.16.10 src/sys/arch/mips/mips/bus_dma.c:1.22.16.11
--- src/sys/arch/mips/mips/bus_dma.c:1.22.16.10 Tue Jan 12 05:52:09 2010
+++ src/sys/arch/mips/mips/bus_dma.c Tue Jan 12 06:38:20 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: bus_dma.c,v 1.22.16.10 2010/01/12 05:52:09 matt Exp $ */
+/* $NetBSD: bus_dma.c,v 1.22.16.11 2010/01/12 06:38:20 matt Exp $ */
/*-
* Copyright (c) 1997, 1998, 2001 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.22.16.10 2010/01/12 05:52:09 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.22.16.11 2010/01/12 06:38:20 matt Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -41,6 +41,7 @@
#include <sys/malloc.h>
#include <sys/proc.h>
#include <sys/mbuf.h>
+#include <sys/evcnt.h>
#include <uvm/uvm_extern.h>
@@ -58,6 +59,40 @@
const struct mips_bus_dmamem_ops mips_bus_dmamem_ops = _BUS_DMAMEM_OPS_INITIALIZER;
const struct mips_bus_dmatag_ops mips_bus_dmatag_ops = _BUS_DMATAG_OPS_INITIALIZER;
+static struct evcnt bus_dma_creates =
+ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "creates");
+static struct evcnt bus_dma_bounced_creates =
+ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "bounced creates");
+static struct evcnt bus_dma_loads =
+ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "loads");
+static struct evcnt bus_dma_bounced_loads =
+ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "bounced loads");
+static struct evcnt bus_dma_read_bounces =
+ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "read bounces");
+static struct evcnt bus_dma_write_bounces =
+ 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_unloads =
+ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "unloads");
+static struct evcnt bus_dma_bounced_destroys =
+ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "bounced destroys");
+static struct evcnt bus_dma_destroys =
+ EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "destroys");
+
+EVCNT_ATTACH_STATIC(bus_dma_creates);
+EVCNT_ATTACH_STATIC(bus_dma_bounced_creates);
+EVCNT_ATTACH_STATIC(bus_dma_loads);
+EVCNT_ATTACH_STATIC(bus_dma_bounced_loads);
+EVCNT_ATTACH_STATIC(bus_dma_read_bounces);
+EVCNT_ATTACH_STATIC(bus_dma_write_bounces);
+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);
+
+#define STAT_INCR(x) (bus_dma_ ## x.ev_count++)
+
paddr_t kvtophys(vaddr_t); /* XXX */
/*
@@ -211,6 +246,7 @@
if (error)
return (error);
+ STAT_INCR(bounced_loads);
map->dm_mapsize = buflen;
map->dm_nsegs = seg + 1;
map->_dm_vmspace = vm;
@@ -222,7 +258,7 @@
/* ...so _bus_dmamap_sync() knows we're bouncing */
cookie->id_flags |= _BUS_DMA_IS_BOUNCING;
- return (error);
+ return 0;
}
#endif /* _MIPS_NEED_BUS_DMA_BOUNCE */
@@ -292,8 +328,10 @@
if (map->_dm_bounce_thresh != 0)
cookieflags |= _BUS_DMA_MIGHT_NEED_BOUNCE;
- if ((cookieflags & _BUS_DMA_MIGHT_NEED_BOUNCE) == 0)
+ if ((cookieflags & _BUS_DMA_MIGHT_NEED_BOUNCE) == 0) {
+ STAT_INCR(creates);
return 0;
+ }
cookiesize = sizeof(struct mips_bus_dma_cookie) +
(sizeof(bus_dma_segment_t) * map->_dm_segcnt);
@@ -308,11 +346,14 @@
cookie = (struct mips_bus_dma_cookie *)cookiestore;
cookie->id_flags = cookieflags;
map->_dm_cookie = cookie;
+ STAT_INCR(bounced_creates);
error = _bus_dma_alloc_bouncebuf(t, map, size, flags);
out:
if (error)
_bus_dmamap_destroy(t, map);
+#else
+ STAT_INCR(creates);
#endif /* _MIPS_NEED_BUS_DMA_BOUNCE */
return (error);
@@ -333,12 +374,18 @@
* Free any bounce pages this map might hold.
*/
if (cookie != NULL) {
+ if (cookie->id_flags & _BUS_DMA_IS_BOUNCING)
+ STAT_INCR(bounced_unloads);
+ map->dm_nsegs = 0;
if (cookie->id_flags & _BUS_DMA_HAS_BOUNCE)
_bus_dma_free_bouncebuf(t, map);
+ STAT_INCR(bounced_destroys);
free(cookie, M_DMAMAP);
- }
+ } else
#endif
-
+ STAT_INCR(destroys);
+ if (map->dm_nsegs > 0)
+ STAT_INCR(unloads);
free(map, M_DMAMAP);
}
@@ -356,6 +403,19 @@
int seg, error;
struct vmspace *vm;
+ if (map->dm_nsegs > 0) {
+#ifdef _MIPS_NEED_BUS_DMA_BOUNCE
+ struct mips_bus_dma_cookie *cookie = map->_dm_cookie;
+ if (cookie != NULL) {
+ if (cookie->id_flags & _BUS_DMA_IS_BOUNCING) {
+ STAT_INCR(bounced_unloads);
+ cookie->id_flags &= ~_BUS_DMA_IS_BOUNCING;
+ }
+ cookie->id_buftype = _BUS_DMA_BUFTYPE_INVALID;
+ } else
+#endif
+ STAT_INCR(unloads);
+ }
/*
* Make sure that on error condition we return "no valid mappings".
*/
@@ -380,6 +440,8 @@
map->dm_nsegs = seg + 1;
map->_dm_vmspace = vm;
+ STAT_INCR(loads);
+
/*
* For linear buffers, we support marking the mapping
* as COHERENT.
@@ -419,6 +481,19 @@
struct mbuf *m;
struct vmspace * vm = vmspace_kernel();
+ if (map->dm_nsegs > 0) {
+#ifdef _MIPS_NEED_BUS_DMA_BOUNCE
+ struct mips_bus_dma_cookie *cookie = map->_dm_cookie;
+ if (cookie != NULL) {
+ if (cookie->id_flags & _BUS_DMA_IS_BOUNCING) {
+ STAT_INCR(bounced_unloads);
+ cookie->id_flags &= ~_BUS_DMA_IS_BOUNCING;
+ }
+ cookie->id_buftype = _BUS_DMA_BUFTYPE_INVALID;
+ } else
+#endif
+ STAT_INCR(unloads);
+ }
/*
* Make sure that on error condition we return "no valid mappings."
*/
@@ -478,6 +553,19 @@
struct iovec *iov;
void *addr;
+ if (map->dm_nsegs > 0) {
+#ifdef _MIPS_NEED_BUS_DMA_BOUNCE
+ struct mips_bus_dma_cookie * const cookie = map->_dm_cookie;
+ if (cookie != NULL) {
+ if (cookie->id_flags & _BUS_DMA_IS_BOUNCING) {
+ STAT_INCR(bounced_unloads);
+ cookie->id_flags &= ~_BUS_DMA_IS_BOUNCING;
+ }
+ cookie->id_buftype = _BUS_DMA_BUFTYPE_INVALID;
+ } else
+#endif
+ STAT_INCR(unloads);
+ }
/*
* Make sure that on error condition we return "no valid mappings."
*/
@@ -544,19 +632,20 @@
void
_bus_dmamap_unload(bus_dma_tag_t t, bus_dmamap_t map)
{
+ if (map->dm_nsegs > 0) {
#ifdef _MIPS_NEED_BUS_DMA_BOUNCE
- struct mips_bus_dma_cookie *cookie = map->_dm_cookie;
-
- /*
- * If we have bounce pages, free them, unless they're
- * reserved for our exclusive use.
- */
- if (cookie != NULL) {
- cookie->id_flags &= ~_BUS_DMA_IS_BOUNCING;
- cookie->id_buftype = _BUS_DMA_BUFTYPE_INVALID;
- }
+ struct mips_bus_dma_cookie *cookie = map->_dm_cookie;
+ if (cookie != NULL) {
+ if (cookie->id_flags & _BUS_DMA_IS_BOUNCING) {
+ cookie->id_flags &= ~_BUS_DMA_IS_BOUNCING;
+ STAT_INCR(bounced_unloads);
+ }
+ cookie->id_buftype = _BUS_DMA_BUFTYPE_INVALID;
+ } else
#endif
+ STAT_INCR(unloads);
+ }
/*
* No resources to free; just mark the mappings as
* invalid.
@@ -617,6 +706,7 @@
struct mips_bus_dma_cookie * const cookie = map->_dm_cookie;
if (cookie != NULL && (cookie->id_flags & _BUS_DMA_IS_BOUNCING)
&& (ops & BUS_DMASYNC_PREWRITE)) {
+ STAT_INCR(write_bounces);
/*
* Copy the caller's buffer to the bounce buffer.
*/
@@ -743,6 +833,7 @@
|| (cookie->id_flags & _BUS_DMA_IS_BOUNCING) == 0)
return;
+ STAT_INCR(read_bounces);
/*
* Copy the bounce buffer to the caller's buffer.
*/
@@ -799,6 +890,7 @@
#endif
}
#endif /* _MIPS_NEED_BUS_DMA_BOUNCE */
+ ;
}
/*