Module Name: src
Committed By: knakahara
Date: Fri Aug 30 05:03:32 UTC 2019
Modified Files:
src/sys/arch/x86/pci: if_vmx.c
Log Message:
vmxnet3_softc.vmx_stats should not count globally. pointed out by [email protected]
divide vmxnet3_softc.vmx_stats to each vmxnet3_txqueue and vmxnet3_rxqueue,
furthermore make them evcnt.
To generate a diff of this commit:
cvs rdiff -u -r1.48 -r1.49 src/sys/arch/x86/pci/if_vmx.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/x86/pci/if_vmx.c
diff -u src/sys/arch/x86/pci/if_vmx.c:1.48 src/sys/arch/x86/pci/if_vmx.c:1.49
--- src/sys/arch/x86/pci/if_vmx.c:1.48 Mon Aug 19 05:25:38 2019
+++ src/sys/arch/x86/pci/if_vmx.c Fri Aug 30 05:03:32 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vmx.c,v 1.48 2019/08/19 05:25:38 knakahara Exp $ */
+/* $NetBSD: if_vmx.c,v 1.49 2019/08/30 05:03:32 knakahara Exp $ */
/* $OpenBSD: if_vmx.c,v 1.16 2014/01/22 06:04:17 brad Exp $ */
/*
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.48 2019/08/19 05:25:38 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.49 2019/08/30 05:03:32 knakahara Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
@@ -207,6 +207,8 @@ struct vmxnet3_txqueue {
struct evcnt vxtxq_pcqdrop;
struct evcnt vxtxq_transmitdef;
struct evcnt vxtxq_watchdogto;
+ struct evcnt vxtxq_defragged;
+ struct evcnt vxtxq_defrag_failed;
};
struct vmxnet3_rxq_stats {
@@ -230,6 +232,8 @@ struct vmxnet3_rxqueue {
struct evcnt vxrxq_intr;
struct evcnt vxrxq_defer;
struct evcnt vxrxq_deferreq;
+ struct evcnt vxrxq_mgetcl_failed;
+ struct evcnt vxrxq_mbuf_load_failed;
};
struct vmxnet3_queue {
@@ -244,13 +248,6 @@ struct vmxnet3_queue {
struct work vxq_wq_cookie;
};
-struct vmxnet3_statistics {
- uint32_t vmst_defragged;
- uint32_t vmst_defrag_failed;
- uint32_t vmst_mgetcl_failed;
- uint32_t vmst_mbuf_load_failed;
-};
-
struct vmxnet3_softc {
device_t vmx_dev;
struct ethercom vmx_ethercom;
@@ -281,7 +278,6 @@ struct vmxnet3_softc {
int vmx_nrxdescs;
int vmx_max_rxsegs;
- struct vmxnet3_statistics vmx_stats;
struct evcnt vmx_event_intr;
struct evcnt vmx_event_link;
struct evcnt vmx_event_txqerror;
@@ -395,7 +391,8 @@ int vmxnet3_setup_interface(struct vmxne
void vmxnet3_evintr(struct vmxnet3_softc *);
bool vmxnet3_txq_eof(struct vmxnet3_txqueue *, u_int);
-int vmxnet3_newbuf(struct vmxnet3_softc *, struct vmxnet3_rxring *);
+int vmxnet3_newbuf(struct vmxnet3_softc *, struct vmxnet3_rxqueue *,
+ struct vmxnet3_rxring *);
void vmxnet3_rxq_eof_discard(struct vmxnet3_rxqueue *,
struct vmxnet3_rxring *, int);
void vmxnet3_rxq_discard_chain(struct vmxnet3_rxqueue *);
@@ -1971,6 +1968,10 @@ vmxnet3_setup_stats(struct vmxnet3_softc
NULL, txq->vxtxq_name, "Deferred transmit");
evcnt_attach_dynamic(&txq->vxtxq_watchdogto, EVCNT_TYPE_MISC,
NULL, txq->vxtxq_name, "Watchdog timeount");
+ evcnt_attach_dynamic(&txq->vxtxq_defragged, EVCNT_TYPE_MISC,
+ NULL, txq->vxtxq_name, "m_defrag sucessed");
+ evcnt_attach_dynamic(&txq->vxtxq_defrag_failed, EVCNT_TYPE_MISC,
+ NULL, txq->vxtxq_name, "m_defrag failed");
}
for (i = 0; i < sc->vmx_nrxqueues; i++) {
@@ -1982,6 +1983,10 @@ vmxnet3_setup_stats(struct vmxnet3_softc
NULL, rxq->vxrxq_name, "Handled queue in softint/workqueue");
evcnt_attach_dynamic(&rxq->vxrxq_deferreq, EVCNT_TYPE_MISC,
NULL, rxq->vxrxq_name, "Requested in softint/workqueue");
+ evcnt_attach_dynamic(&rxq->vxrxq_mgetcl_failed, EVCNT_TYPE_MISC,
+ NULL, rxq->vxrxq_name, "MCLGET failed");
+ evcnt_attach_dynamic(&rxq->vxrxq_mbuf_load_failed, EVCNT_TYPE_MISC,
+ NULL, rxq->vxrxq_name, "bus_dmamap_load_mbuf failed");
}
evcnt_attach_dynamic(&sc->vmx_event_intr, EVCNT_TYPE_INTR,
@@ -2017,6 +2022,8 @@ vmxnet3_teardown_stats(struct vmxnet3_so
evcnt_detach(&txq->vxtxq_pcqdrop);
evcnt_detach(&txq->vxtxq_transmitdef);
evcnt_detach(&txq->vxtxq_watchdogto);
+ evcnt_detach(&txq->vxtxq_defragged);
+ evcnt_detach(&txq->vxtxq_defrag_failed);
}
for (i = 0; i < sc->vmx_nrxqueues; i++) {
@@ -2025,6 +2032,8 @@ vmxnet3_teardown_stats(struct vmxnet3_so
evcnt_detach(&rxq->vxrxq_intr);
evcnt_detach(&rxq->vxrxq_defer);
evcnt_detach(&rxq->vxrxq_deferreq);
+ evcnt_detach(&rxq->vxrxq_mgetcl_failed);
+ evcnt_detach(&rxq->vxrxq_mbuf_load_failed);
}
evcnt_detach(&sc->vmx_event_intr);
@@ -2154,7 +2163,8 @@ vmxnet3_txq_eof(struct vmxnet3_txqueue *
}
int
-vmxnet3_newbuf(struct vmxnet3_softc *sc, struct vmxnet3_rxring *rxr)
+vmxnet3_newbuf(struct vmxnet3_softc *sc, struct vmxnet3_rxqueue *rxq,
+ struct vmxnet3_rxring *rxr)
{
struct mbuf *m;
struct vmxnet3_rxdesc *rxd;
@@ -2180,7 +2190,7 @@ vmxnet3_newbuf(struct vmxnet3_softc *sc,
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
- sc->vmx_stats.vmst_mgetcl_failed++;
+ rxq->vxrxq_mgetcl_failed.ev_count++;
m_freem(m);
return (ENOBUFS);
}
@@ -2191,7 +2201,7 @@ vmxnet3_newbuf(struct vmxnet3_softc *sc,
error = bus_dmamap_load_mbuf(sc->vmx_dmat, dmap, m, BUS_DMA_NOWAIT);
if (error) {
m_freem(m);
- sc->vmx_stats.vmst_mbuf_load_failed++;
+ rxq->vxrxq_mbuf_load_failed.ev_count++;
return (error);
}
@@ -2403,7 +2413,7 @@ vmxnet3_rxq_eof(struct vmxnet3_rxqueue *
goto nextp;
}
- if (vmxnet3_newbuf(sc, rxr) != 0) {
+ if (vmxnet3_newbuf(sc, rxq, rxr) != 0) {
rxq->vxrxq_stats.vmrxs_iqdrops++;
vmxnet3_rxq_eof_discard(rxq, rxr, idx);
if (!rxcd->eop)
@@ -2422,7 +2432,7 @@ vmxnet3_rxq_eof(struct vmxnet3_rxqueue *
/* frame not started? */
KASSERT(m_head != NULL);
- if (vmxnet3_newbuf(sc, rxr) != 0) {
+ if (vmxnet3_newbuf(sc, rxq, rxr) != 0) {
rxq->vxrxq_stats.vmrxs_iqdrops++;
vmxnet3_rxq_eof_discard(rxq, rxr, idx);
if (!rxcd->eop)
@@ -2784,7 +2794,7 @@ vmxnet3_rxinit(struct vmxnet3_softc *sc,
rxr->vxrxr_ndesc * sizeof(struct vmxnet3_rxdesc));
for (idx = 0; idx < rxr->vxrxr_ndesc; idx++) {
- error = vmxnet3_newbuf(sc, rxr);
+ error = vmxnet3_newbuf(sc, rxq, rxr);
if (error)
return (error);
}
@@ -3018,9 +3028,9 @@ vmxnet3_txq_load_mbuf(struct vmxnet3_txq
if (error) {
m_freem(*m0);
*m0 = NULL;
- txq->vxtxq_sc->vmx_stats.vmst_defrag_failed++;
+ txq->vxtxq_defrag_failed.ev_count++;
} else
- txq->vxtxq_sc->vmx_stats.vmst_defragged++;
+ txq->vxtxq_defragged.ev_count++;
return (error);
}