Module Name:    src
Committed By:   jmcneill
Date:           Sun Nov 29 23:38:47 UTC 2015

Modified Files:
        src/sys/dev/sdmmc: sdmmc.c sdmmc_mem.c sdmmcvar.h

Log Message:
Add some event counters to track transfer sizes.


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/sys/dev/sdmmc/sdmmc.c
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/sdmmc/sdmmc_mem.c
cvs rdiff -u -r1.20 -r1.21 src/sys/dev/sdmmc/sdmmcvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/sdmmc/sdmmc.c
diff -u src/sys/dev/sdmmc/sdmmc.c:1.31 src/sys/dev/sdmmc/sdmmc.c:1.32
--- src/sys/dev/sdmmc/sdmmc.c:1.31	Sun Aug  9 13:18:46 2015
+++ src/sys/dev/sdmmc/sdmmc.c	Sun Nov 29 23:38:47 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sdmmc.c,v 1.31 2015/08/09 13:18:46 mlelstv Exp $	*/
+/*	$NetBSD: sdmmc.c,v 1.32 2015/11/29 23:38:47 jmcneill Exp $	*/
 /*	$OpenBSD: sdmmc.c,v 1.18 2009/01/09 10:58:38 jsg Exp $	*/
 
 /*
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.31 2015/08/09 13:18:46 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.32 2015/11/29 23:38:47 jmcneill Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_sdmmc.h"
@@ -154,6 +154,29 @@ sdmmc_attach(device_t parent, device_t s
 	mutex_init(&sc->sc_intr_task_mtx, MUTEX_DEFAULT, IPL_SDMMC);
 	cv_init(&sc->sc_tskq_cv, "mmctaskq");
 
+	evcnt_attach_dynamic(&sc->sc_ev_xfer, EVCNT_TYPE_MISC, NULL,
+	    device_xname(self), "xfer");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_aligned[0], EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer 512");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_aligned[1], EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer 1024");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_aligned[2], EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer 2048");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_aligned[3], EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer 4096");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_aligned[4], EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer 8192");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_aligned[5], EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer 16384");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_aligned[6], EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer 32768");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_aligned[7], EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer 65536");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_unaligned, EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer unaligned");
+	evcnt_attach_dynamic(&sc->sc_ev_xfer_error, EVCNT_TYPE_MISC,
+	    &sc->sc_ev_xfer, device_xname(self), "xfer error");
+
 	if (ISSET(sc->sc_caps, SMC_CAPS_POLL_CARD_DET)) {
 		callout_init(&sc->sc_card_detect_ch, 0);
 		callout_reset(&sc->sc_card_detect_ch, hz,
@@ -178,7 +201,7 @@ static int
 sdmmc_detach(device_t self, int flags)
 {
 	struct sdmmc_softc *sc = device_private(self);
-	int error;
+	int error, i;
 
 	mutex_enter(&sc->sc_tskq_mtx);
 	sc->sc_dying = 1;
@@ -209,6 +232,12 @@ sdmmc_detach(device_t self, int flags)
 	mutex_destroy(&sc->sc_tskq_mtx);
 	mutex_destroy(&sc->sc_mtx);
 
+	evcnt_detach(&sc->sc_ev_xfer_error);
+	evcnt_detach(&sc->sc_ev_xfer_unaligned);
+	for (i = 0; i < __arraycount(sc->sc_ev_xfer_aligned); i++)
+		evcnt_detach(&sc->sc_ev_xfer_aligned[i]);
+	evcnt_detach(&sc->sc_ev_xfer);
+
 	return 0;
 }
 

Index: src/sys/dev/sdmmc/sdmmc_mem.c
diff -u src/sys/dev/sdmmc/sdmmc_mem.c:1.48 src/sys/dev/sdmmc/sdmmc_mem.c:1.49
--- src/sys/dev/sdmmc/sdmmc_mem.c:1.48	Thu Oct 29 22:37:15 2015
+++ src/sys/dev/sdmmc/sdmmc_mem.c	Sun Nov 29 23:38:47 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sdmmc_mem.c,v 1.48 2015/10/29 22:37:15 jmcneill Exp $	*/
+/*	$NetBSD: sdmmc_mem.c,v 1.49 2015/11/29 23:38:47 jmcneill Exp $	*/
 /*	$OpenBSD: sdmmc_mem.c,v 1.10 2009/01/09 10:55:22 jsg Exp $	*/
 
 /*
@@ -45,7 +45,7 @@
 /* Routines for SD/MMC memory cards. */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.48 2015/10/29 22:37:15 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,v 1.49 2015/11/29 23:38:47 jmcneill Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_sdmmc.h"
@@ -56,6 +56,8 @@ __KERNEL_RCSID(0, "$NetBSD: sdmmc_mem.c,
 #include <sys/malloc.h>
 #include <sys/systm.h>
 #include <sys/device.h>
+#include <sys/bitops.h>
+#include <sys/evcnt.h>
 
 #include <dev/sdmmc/sdmmcchip.h>
 #include <dev/sdmmc/sdmmcreg.h>
@@ -1595,9 +1597,20 @@ sdmmc_mem_read_block_subr(struct sdmmc_f
 	if (ISSET(sc->sc_caps, SMC_CAPS_DMA))
 		cmd.c_dmamap = dmap;
 
+	sc->sc_ev_xfer.ev_count++;
+
 	error = sdmmc_mmc_command(sc, &cmd);
-	if (error)
+	if (error) {
+		sc->sc_ev_xfer_error.ev_count++;
 		goto out;
+	}
+
+	const u_int counter = __builtin_ctz(cmd.c_datalen);
+	if (counter >= 9 && counter <= 16) {
+		sc->sc_ev_xfer_aligned[counter - 9].ev_count++;
+	} else {
+		sc->sc_ev_xfer_unaligned.ev_count++;
+	}
 
 	if (!ISSET(sc->sc_caps, SMC_CAPS_AUTO_STOP)) {
 		if (cmd.c_opcode == MMC_READ_BLOCK_MULTIPLE) {
@@ -1809,9 +1822,20 @@ sdmmc_mem_write_block_subr(struct sdmmc_
 	if (ISSET(sc->sc_caps, SMC_CAPS_DMA))
 		cmd.c_dmamap = dmap;
 
+	sc->sc_ev_xfer.ev_count++;
+
 	error = sdmmc_mmc_command(sc, &cmd);
-	if (error)
+	if (error) {
+		sc->sc_ev_xfer_error.ev_count++;
 		goto out;
+	}
+
+	const u_int counter = __builtin_ctz(cmd.c_datalen);
+	if (counter >= 9 && counter <= 16) {
+		sc->sc_ev_xfer_aligned[counter - 9].ev_count++;
+	} else {
+		sc->sc_ev_xfer_unaligned.ev_count++;
+	}
 
 	if (!ISSET(sc->sc_caps, SMC_CAPS_AUTO_STOP)) {
 		if (cmd.c_opcode == MMC_WRITE_BLOCK_MULTIPLE) {

Index: src/sys/dev/sdmmc/sdmmcvar.h
diff -u src/sys/dev/sdmmc/sdmmcvar.h:1.20 src/sys/dev/sdmmc/sdmmcvar.h:1.21
--- src/sys/dev/sdmmc/sdmmcvar.h:1.20	Tue Oct  6 14:32:51 2015
+++ src/sys/dev/sdmmc/sdmmcvar.h	Sun Nov 29 23:38:47 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sdmmcvar.h,v 1.20 2015/10/06 14:32:51 mlelstv Exp $	*/
+/*	$NetBSD: sdmmcvar.h,v 1.21 2015/11/29 23:38:47 jmcneill Exp $	*/
 /*	$OpenBSD: sdmmcvar.h,v 1.13 2009/01/09 10:55:22 jsg Exp $	*/
 
 /*
@@ -27,6 +27,7 @@
 #include <sys/queue.h>
 #include <sys/mutex.h>
 #include <sys/callout.h>
+#include <sys/evcnt.h>
 
 #include <sys/bus.h>
 
@@ -266,6 +267,12 @@ struct sdmmc_softc {
 	const char *sc_transfer_mode;	/* current transfer mode */
 
 	callout_t sc_card_detect_ch;	/* polling card insert/remove */
+
+	/* event counters */
+	struct evcnt sc_ev_xfer;	/* xfer count */
+	struct evcnt sc_ev_xfer_aligned[8]; /* aligned xfer counts */
+	struct evcnt sc_ev_xfer_unaligned; /* unaligned xfer count */
+	struct evcnt sc_ev_xfer_error;	/* error xfer count */
 };
 
 /*

Reply via email to