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 hikaru@n.o 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); }