diff options
| author | msaitoh <msaitoh@NetBSD.org> | 2018-03-09 06:27:53 +0000 |
|---|---|---|
| committer | msaitoh <msaitoh@NetBSD.org> | 2018-03-09 06:27:53 +0000 |
| commit | 656d807cf211c5e2399c8deee6b609b901ca58a4 (patch) | |
| tree | aac8e8e90b28a5de38a7f30294cec4a61da76e98 /sys/dev/pci | |
| parent | 8e009927e2b3787879ca29924bc85829b23cfb8c (diff) | |
Make some event counters MP safe. Now all of the event counters are
MP safe.
Diffstat (limited to 'sys/dev/pci')
| -rw-r--r-- | sys/dev/pci/ixgbe/ix_txrx.c | 16 | ||||
| -rw-r--r-- | sys/dev/pci/ixgbe/ixgbe.c | 43 | ||||
| -rw-r--r-- | sys/dev/pci/ixgbe/ixgbe.h | 20 | ||||
| -rw-r--r-- | sys/dev/pci/ixgbe/ixv.c | 31 |
4 files changed, 91 insertions, 19 deletions
diff --git a/sys/dev/pci/ixgbe/ix_txrx.c b/sys/dev/pci/ixgbe/ix_txrx.c index 3635b37f5c3..d9e1515f18b 100644 --- a/sys/dev/pci/ixgbe/ix_txrx.c +++ b/sys/dev/pci/ixgbe/ix_txrx.c @@ -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; } } diff --git a/sys/dev/pci/ixgbe/ixgbe.c b/sys/dev/pci/ixgbe/ixgbe.c index 28b841c224d..fd7f7ca3681 100644 --- a/sys/dev/pci/ixgbe/ixgbe.c +++ b/sys/dev/pci/ixgbe/ixgbe.c @@ -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 *adapter) 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 *adapter) #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, diff --git a/sys/dev/pci/ixgbe/ixgbe.h b/sys/dev/pci/ixgbe/ixgbe.h index dc94df90aab..7e84c34fd27 100644 --- a/sys/dev/pci/ixgbe/ixgbe.h +++ b/sys/dev/pci/ixgbe/ixgbe.h @@ -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; diff --git a/sys/dev/pci/ixgbe/ixv.c b/sys/dev/pci/ixgbe/ixv.c index 78c69e89693..7a257bcf5d5 100644 --- a/sys/dev/pci/ixgbe/ixv.c +++ b/sys/dev/pci/ixgbe/ixv.c @@ -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); |
