Module Name:    src
Committed By:   yamaguchi
Date:           Thu Jan  9 02:55:42 UTC 2020

Modified Files:
        src/sys/dev/pci: if_ixl.c

Log Message:
ixl(4) supports in-chip statistic counters per VSI


To generate a diff of this commit:
cvs rdiff -u -r1.17 -r1.18 src/sys/dev/pci/if_ixl.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/if_ixl.c
diff -u src/sys/dev/pci/if_ixl.c:1.17 src/sys/dev/pci/if_ixl.c:1.18
--- src/sys/dev/pci/if_ixl.c:1.17	Thu Jan  9 02:43:45 2020
+++ src/sys/dev/pci/if_ixl.c	Thu Jan  9 02:55:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ixl.c,v 1.17 2020/01/09 02:43:45 yamaguchi Exp $	*/
+/*	$NetBSD: if_ixl.c,v 1.18 2020/01/09 02:55:41 yamaguchi Exp $	*/
 
 /*
  * Copyright (c) 2013-2015, Intel Corporation
@@ -559,6 +559,26 @@ struct ixl_stats_counters {
 	uint64_t	 isc_link_xoff_rx_offset;
 	struct evcnt	 isc_link_xoff_tx;
 	uint64_t	 isc_link_xoff_tx_offset;
+	struct evcnt	 isc_vsi_rx_discards;
+	uint64_t	 isc_vsi_rx_discards_offset;
+	struct evcnt	 isc_vsi_rx_bytes;
+	uint64_t	 isc_vsi_rx_bytes_offset;
+	struct evcnt	 isc_vsi_rx_unicast;
+	uint64_t	 isc_vsi_rx_unicast_offset;
+	struct evcnt	 isc_vsi_rx_multicast;
+	uint64_t	 isc_vsi_rx_multicast_offset;
+	struct evcnt	 isc_vsi_rx_broadcast;
+	uint64_t	 isc_vsi_rx_broadcast_offset;
+	struct evcnt	 isc_vsi_tx_errors;
+	uint64_t	 isc_vsi_tx_errors_offset;
+	struct evcnt	 isc_vsi_tx_bytes;
+	uint64_t	 isc_vsi_tx_bytes_offset;
+	struct evcnt	 isc_vsi_tx_unicast;
+	uint64_t	 isc_vsi_tx_unicast_offset;
+	struct evcnt	 isc_vsi_tx_multicast;
+	uint64_t	 isc_vsi_tx_multicast_offset;
+	struct evcnt	 isc_vsi_tx_broadcast;
+	uint64_t	 isc_vsi_tx_broadcast_offset;
 };
 
 /*
@@ -623,6 +643,7 @@ struct ixl_softc {
 	uint16_t		 sc_uplink_seid;	/* le */
 	uint16_t		 sc_downlink_seid;	/* le */
 	uint16_t		 sc_vsi_number;		/* le */
+	uint16_t		 sc_vsi_stat_counter_idx;
 	uint16_t		 sc_seid;
 	unsigned int		 sc_base_queue;
 
@@ -4168,6 +4189,7 @@ ixl_get_vsi(struct ixl_softc *sc)
 	struct ixl_aq_desc iaq;
 	struct ixl_aq_vsi_param *param;
 	struct ixl_aq_vsi_reply *reply;
+	struct ixl_aq_vsi_data *data;
 	int rv;
 
 	/* grumble, vsi info isn't "known" at compile time */
@@ -4207,6 +4229,8 @@ ixl_get_vsi(struct ixl_softc *sc)
 
 	reply = (struct ixl_aq_vsi_reply *)iaq.iaq_param;
 	sc->sc_vsi_number = reply->vsi_number;
+	data = IXL_DMA_KVA(vsi);
+	sc->sc_vsi_stat_counter_idx = le16toh(data->stat_counter_idx);
 
 	return 0;
 }
@@ -5639,6 +5663,17 @@ ixl_setup_stats(struct ixl_softc *sc)
 	evcnt_attach_dynamic(&isc->isc_rx_broadcast, EVCNT_TYPE_MISC,
 	    NULL, device_xname(sc->sc_dev), "Rx broadcast / port");
 
+	evcnt_attach_dynamic(&isc->isc_vsi_rx_bytes, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Rx bytes / vsi");
+	evcnt_attach_dynamic(&isc->isc_vsi_rx_discards, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Rx discard / vsi");
+	evcnt_attach_dynamic(&isc->isc_vsi_rx_unicast, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Rx unicast / vsi");
+	evcnt_attach_dynamic(&isc->isc_vsi_rx_multicast, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Rx multicast / vsi");
+	evcnt_attach_dynamic(&isc->isc_vsi_rx_broadcast, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Rx broadcast / vsi");
+
 	evcnt_attach_dynamic(&isc->isc_tx_size_64, EVCNT_TYPE_MISC,
 	    NULL, device_xname(sc->sc_dev), "Tx size 64");
 	evcnt_attach_dynamic(&isc->isc_tx_size_127, EVCNT_TYPE_MISC,
@@ -5666,6 +5701,17 @@ ixl_setup_stats(struct ixl_softc *sc)
 	evcnt_attach_dynamic(&isc->isc_tx_broadcast, EVCNT_TYPE_MISC,
 	    NULL, device_xname(sc->sc_dev), "Tx broadcast / port");
 
+	evcnt_attach_dynamic(&isc->isc_vsi_tx_bytes, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Tx bytes / vsi");
+	evcnt_attach_dynamic(&isc->isc_vsi_tx_errors, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Tx errors / vsi");
+	evcnt_attach_dynamic(&isc->isc_vsi_tx_unicast, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Tx unicast / vsi");
+	evcnt_attach_dynamic(&isc->isc_vsi_tx_multicast, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Tx multicast / vsi");
+	evcnt_attach_dynamic(&isc->isc_vsi_tx_broadcast, EVCNT_TYPE_MISC,
+	    NULL, device_xname(sc->sc_dev), "Tx broadcast / vsi");
+
 	sc->sc_stats_intval = IXL_STATS_INTERVAL_MSEC;
 	callout_init(&sc->sc_stats_callout, CALLOUT_MPSAFE);
 	callout_setfunc(&sc->sc_stats_callout, ixl_stats_callout, sc);
@@ -5737,6 +5783,16 @@ ixl_teardown_stats(struct ixl_softc *sc)
 	evcnt_detach(&isc->isc_tx_size_1023);
 	evcnt_detach(&isc->isc_tx_size_1522);
 	evcnt_detach(&isc->isc_tx_size_big);
+	evcnt_detach(&isc->isc_vsi_rx_discards);
+	evcnt_detach(&isc->isc_vsi_rx_bytes);
+	evcnt_detach(&isc->isc_vsi_rx_unicast);
+	evcnt_detach(&isc->isc_vsi_rx_multicast);
+	evcnt_detach(&isc->isc_vsi_rx_broadcast);
+	evcnt_detach(&isc->isc_vsi_tx_errors);
+	evcnt_detach(&isc->isc_vsi_tx_bytes);
+	evcnt_detach(&isc->isc_vsi_tx_unicast);
+	evcnt_detach(&isc->isc_vsi_tx_multicast);
+	evcnt_detach(&isc->isc_vsi_tx_broadcast);
 
 	evcnt_detach(&sc->sc_event_atq);
 	evcnt_detach(&sc->sc_event_link);
@@ -5980,6 +6036,66 @@ ixl_stats_update(void *xsc)
 	    0, I40E_GLPRT_RJC(sc->sc_port),
 	    &isc->isc_rx_jabber_offset, isc->isc_has_offset);
 	atomic_add_64(&isc->isc_rx_jabber.ev_count, delta);
+
+	/* VSI rx counters */
+	delta = ixl_stat_delta(sc,
+	    0, I40E_GLV_RDPC(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_rx_discards_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_rx_discards.ev_count, delta);
+
+	delta = ixl_stat_delta(sc,
+	    I40E_GLV_GORCH(sc->sc_vsi_stat_counter_idx),
+	    I40E_GLV_GORCL(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_rx_bytes_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_rx_bytes.ev_count, delta);
+
+	delta = ixl_stat_delta(sc,
+	    I40E_GLV_UPRCH(sc->sc_vsi_stat_counter_idx),
+	    I40E_GLV_UPRCL(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_rx_unicast_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_rx_unicast.ev_count, delta);
+
+	delta = ixl_stat_delta(sc,
+	    I40E_GLV_MPRCH(sc->sc_vsi_stat_counter_idx),
+	    I40E_GLV_MPRCL(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_rx_multicast_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_rx_multicast.ev_count, delta);
+
+	delta = ixl_stat_delta(sc,
+	    I40E_GLV_BPRCH(sc->sc_vsi_stat_counter_idx),
+	    I40E_GLV_BPRCL(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_rx_broadcast_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_rx_broadcast.ev_count, delta);
+
+	/* VSI tx counters */
+	delta = ixl_stat_delta(sc,
+	    0, I40E_GLV_TEPC(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_tx_errors_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_tx_errors.ev_count, delta);
+
+	delta = ixl_stat_delta(sc,
+	    I40E_GLV_GOTCH(sc->sc_vsi_stat_counter_idx),
+	    I40E_GLV_GOTCL(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_tx_bytes_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_tx_bytes.ev_count, delta);
+
+	delta = ixl_stat_delta(sc,
+	    I40E_GLV_UPTCH(sc->sc_vsi_stat_counter_idx),
+	    I40E_GLV_UPTCL(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_tx_unicast_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_tx_unicast.ev_count, delta);
+
+	delta = ixl_stat_delta(sc,
+	    I40E_GLV_MPTCH(sc->sc_vsi_stat_counter_idx),
+	    I40E_GLV_MPTCL(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_tx_multicast_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_tx_multicast.ev_count, delta);
+
+	delta = ixl_stat_delta(sc,
+	    I40E_GLV_BPTCH(sc->sc_vsi_stat_counter_idx),
+	    I40E_GLV_BPTCL(sc->sc_vsi_stat_counter_idx),
+	    &isc->isc_vsi_tx_broadcast_offset, isc->isc_has_offset);
+	atomic_add_64(&isc->isc_vsi_tx_broadcast.ev_count, delta);
 }
 
 static int

Reply via email to