Module Name: src Committed By: msaitoh Date: Fri Mar 9 06:27:54 UTC 2018
Modified Files: src/sys/dev/pci/ixgbe: ix_txrx.c ixgbe.c ixgbe.h ixv.c Log Message: Make some event counters MP safe. Now all of the event counters are MP safe. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/sys/dev/pci/ixgbe/ix_txrx.c \ src/sys/dev/pci/ixgbe/ixgbe.h cvs rdiff -u -r1.133 -r1.134 src/sys/dev/pci/ixgbe/ixgbe.c cvs rdiff -u -r1.86 -r1.87 src/sys/dev/pci/ixgbe/ixv.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/dev/pci/ixgbe/ix_txrx.c diff -u src/sys/dev/pci/ixgbe/ix_txrx.c:1.34 src/sys/dev/pci/ixgbe/ix_txrx.c:1.35 --- src/sys/dev/pci/ixgbe/ix_txrx.c:1.34 Fri Mar 2 10:19:20 2018 +++ src/sys/dev/pci/ixgbe/ix_txrx.c Fri Mar 9 06:27:53 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ix_txrx.c,v 1.34 2018/03/02 10:19:20 knakahara Exp $ */ +/* $NetBSD: ix_txrx.c,v 1.35 2018/03/09 06:27:53 msaitoh Exp $ */ /****************************************************************************** @@ -392,10 +392,10 @@ retry: switch (error) { case EAGAIN: - adapter->eagain_tx_dma_setup.ev_count++; + txr->q_eagain_tx_dma_setup++; return EAGAIN; case ENOMEM: - adapter->enomem_tx_dma_setup.ev_count++; + txr->q_enomem_tx_dma_setup++; return EAGAIN; case EFBIG: /* Try it again? - one try */ @@ -405,23 +405,23 @@ retry: * XXX: m_defrag will choke on * non-MCLBYTES-sized clusters */ - adapter->efbig_tx_dma_setup.ev_count++; + txr->q_efbig_tx_dma_setup++; m = m_defrag(m_head, M_NOWAIT); if (m == NULL) { - adapter->mbuf_defrag_failed.ev_count++; + txr->q_mbuf_defrag_failed++; return ENOBUFS; } m_head = m; goto retry; } else { - adapter->efbig2_tx_dma_setup.ev_count++; + txr->q_efbig2_tx_dma_setup++; return error; } case EINVAL: - adapter->einval_tx_dma_setup.ev_count++; + txr->q_einval_tx_dma_setup++; return error; default: - adapter->other_tx_dma_setup.ev_count++; + txr->q_other_tx_dma_setup++; return error; } } Index: src/sys/dev/pci/ixgbe/ixgbe.h diff -u src/sys/dev/pci/ixgbe/ixgbe.h:1.34 src/sys/dev/pci/ixgbe/ixgbe.h:1.35 --- src/sys/dev/pci/ixgbe/ixgbe.h:1.34 Wed Mar 7 03:29:10 2018 +++ src/sys/dev/pci/ixgbe/ixgbe.h Fri Mar 9 06:27:53 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ixgbe.h,v 1.34 2018/03/07 03:29:10 msaitoh Exp $ */ +/* $NetBSD: ixgbe.h,v 1.35 2018/03/09 06:27:53 msaitoh Exp $ */ /****************************************************************************** SPDX-License-Identifier: BSD-3-Clause @@ -334,9 +334,10 @@ struct ix_queue { struct rx_ring *rxr; struct work wq_cookie; void *que_si; - struct evcnt irqs; - struct evcnt handleq; - struct evcnt req; + /* Per queue event conters */ + struct evcnt irqs; /* Hardware interrupt */ + struct evcnt handleq; /* software_interrupt */ + struct evcnt req; /* deferred */ char namebuf[32]; char evnamebuf[32]; @@ -378,6 +379,15 @@ struct tx_ring { struct evcnt no_desc_avail; struct evcnt total_packets; struct evcnt pcq_drops; + /* Per queue conters. The adapter total is in struct adapter */ + u64 q_efbig_tx_dma_setup; + u64 q_mbuf_defrag_failed; + u64 q_efbig2_tx_dma_setup; + u64 q_einval_tx_dma_setup; + u64 q_other_tx_dma_setup; + u64 q_eagain_tx_dma_setup; + u64 q_enomem_tx_dma_setup; + u64 q_tso_err; }; @@ -558,8 +568,8 @@ struct adapter { void (*stop_locked)(void *); /* Misc stats maintained by the driver */ - struct evcnt mbuf_defrag_failed; struct evcnt efbig_tx_dma_setup; + struct evcnt mbuf_defrag_failed; struct evcnt efbig2_tx_dma_setup; struct evcnt einval_tx_dma_setup; struct evcnt other_tx_dma_setup; Index: src/sys/dev/pci/ixgbe/ixgbe.c diff -u src/sys/dev/pci/ixgbe/ixgbe.c:1.133 src/sys/dev/pci/ixgbe/ixgbe.c:1.134 --- src/sys/dev/pci/ixgbe/ixgbe.c:1.133 Thu Mar 8 02:41:27 2018 +++ src/sys/dev/pci/ixgbe/ixgbe.c Fri Mar 9 06:27:53 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ixgbe.c,v 1.133 2018/03/08 02:41:27 knakahara Exp $ */ +/* $NetBSD: ixgbe.c,v 1.134 2018/03/09 06:27:53 msaitoh Exp $ */ /****************************************************************************** @@ -1980,8 +1980,8 @@ ixgbe_clear_evcnt(struct adapter *adapte adapter->other_tx_dma_setup.ev_count = 0; adapter->eagain_tx_dma_setup.ev_count = 0; adapter->enomem_tx_dma_setup.ev_count = 0; - adapter->watchdog_events.ev_count = 0; adapter->tso_err.ev_count = 0; + adapter->watchdog_events.ev_count = 0; adapter->link_irq.ev_count = 0; txr = adapter->tx_rings; @@ -1995,6 +1995,14 @@ ixgbe_clear_evcnt(struct adapter *adapte #ifndef IXGBE_LEGACY_TX txr->pcq_drops.ev_count = 0; #endif + txr->q_efbig_tx_dma_setup = 0; + txr->q_mbuf_defrag_failed = 0; + txr->q_efbig2_tx_dma_setup = 0; + txr->q_einval_tx_dma_setup = 0; + txr->q_other_tx_dma_setup = 0; + txr->q_eagain_tx_dma_setup = 0; + txr->q_enomem_tx_dma_setup = 0; + txr->q_tso_err = 0; if (i < __arraycount(stats->mpc)) { stats->mpc[i].ev_count = 0; @@ -4190,7 +4198,9 @@ ixgbe_local_timer1(void *arg) device_t dev = adapter->dev; struct ix_queue *que = adapter->queues; u64 queues = 0; + u64 v0, v1, v2, v3, v4, v5, v6, v7; int hung = 0; + int i; KASSERT(mutex_owned(&adapter->core_mtx)); @@ -4202,12 +4212,37 @@ ixgbe_local_timer1(void *arg) ixgbe_update_link_status(adapter); ixgbe_update_stats_counters(adapter); + /* Update some event counters */ + v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0; + que = adapter->queues; + for (i = 0; i < adapter->num_queues; i++, que++) { + struct tx_ring *txr = que->txr; + + v0 += txr->q_efbig_tx_dma_setup; + v1 += txr->q_mbuf_defrag_failed; + v2 += txr->q_efbig2_tx_dma_setup; + v3 += txr->q_einval_tx_dma_setup; + v4 += txr->q_other_tx_dma_setup; + v5 += txr->q_eagain_tx_dma_setup; + v6 += txr->q_enomem_tx_dma_setup; + v7 += txr->q_tso_err; + } + adapter->efbig_tx_dma_setup.ev_count = v0; + adapter->mbuf_defrag_failed.ev_count = v1; + adapter->efbig2_tx_dma_setup.ev_count = v2; + adapter->einval_tx_dma_setup.ev_count = v3; + adapter->other_tx_dma_setup.ev_count = v4; + adapter->eagain_tx_dma_setup.ev_count = v5; + adapter->enomem_tx_dma_setup.ev_count = v6; + adapter->tso_err.ev_count = v7; + /* * Check the TX queues status * - mark hung queues so we don't schedule on them * - watchdog only if all queues show hung */ - for (int i = 0; i < adapter->num_queues; i++, que++) { + que = adapter->queues; + for (i = 0; i < adapter->num_queues; i++, que++) { /* Keep track of queues with work for soft irq */ if (que->txr->busy) queues |= ((u64)1 << que->me); @@ -4239,7 +4274,7 @@ ixgbe_local_timer1(void *arg) goto watchdog; else if (queues != 0) { /* Force an IRQ on queues with work */ que = adapter->queues; - for (int i = 0; i < adapter->num_queues; i++, que++) { + for (i = 0; i < adapter->num_queues; i++, que++) { mutex_enter(&que->im_mtx); if (que->im_nest == 0) ixgbe_rearm_queues(adapter, Index: src/sys/dev/pci/ixgbe/ixv.c diff -u src/sys/dev/pci/ixgbe/ixv.c:1.86 src/sys/dev/pci/ixgbe/ixv.c:1.87 --- src/sys/dev/pci/ixgbe/ixv.c:1.86 Wed Mar 7 08:01:32 2018 +++ src/sys/dev/pci/ixgbe/ixv.c Fri Mar 9 06:27:53 2018 @@ -1,4 +1,4 @@ -/*$NetBSD: ixv.c,v 1.86 2018/03/07 08:01:32 msaitoh Exp $*/ +/*$NetBSD: ixv.c,v 1.87 2018/03/09 06:27:53 msaitoh Exp $*/ /****************************************************************************** @@ -1194,7 +1194,9 @@ ixv_local_timer_locked(void *arg) device_t dev = adapter->dev; struct ix_queue *que = adapter->queues; u64 queues = 0; + u64 v0, v1, v2, v3, v4, v5, v6, v7; int hung = 0; + int i; KASSERT(mutex_owned(&adapter->core_mtx)); @@ -1203,12 +1205,37 @@ ixv_local_timer_locked(void *arg) /* Stats Update */ ixv_update_stats(adapter); + /* Update some event counters */ + v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0; + que = adapter->queues; + for (i = 0; i < adapter->num_queues; i++, que++) { + struct tx_ring *txr = que->txr; + + v0 += txr->q_efbig_tx_dma_setup; + v1 += txr->q_mbuf_defrag_failed; + v2 += txr->q_efbig2_tx_dma_setup; + v3 += txr->q_einval_tx_dma_setup; + v4 += txr->q_other_tx_dma_setup; + v5 += txr->q_eagain_tx_dma_setup; + v6 += txr->q_enomem_tx_dma_setup; + v7 += txr->q_tso_err; + } + adapter->efbig_tx_dma_setup.ev_count = v0; + adapter->mbuf_defrag_failed.ev_count = v1; + adapter->efbig2_tx_dma_setup.ev_count = v2; + adapter->einval_tx_dma_setup.ev_count = v3; + adapter->other_tx_dma_setup.ev_count = v4; + adapter->eagain_tx_dma_setup.ev_count = v5; + adapter->enomem_tx_dma_setup.ev_count = v6; + adapter->tso_err.ev_count = v7; + /* * Check the TX queues status * - mark hung queues so we don't schedule on them * - watchdog only if all queues show hung */ - for (int i = 0; i < adapter->num_queues; i++, que++) { + que = adapter->queues; + for (i = 0; i < adapter->num_queues; i++, que++) { /* Keep track of queues with work for soft irq */ if (que->txr->busy) queues |= ((u64)1 << que->me);