Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 27 Sep 2014 20:54:58 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r272227 - head/sys/dev/ixl
Message-ID:  <201409272054.s8RKswiw073529@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Sat Sep 27 20:54:57 2014
New Revision: 272227
URL: http://svnweb.freebsd.org/changeset/base/272227

Log:
  Convert driver to if_get_counter method.
  
  Submitted by:	rstone
  Reviewed by:	Eric Joyner <ricera10 gmail.com>

Modified:
  head/sys/dev/ixl/if_ixl.c
  head/sys/dev/ixl/if_ixlv.c
  head/sys/dev/ixl/ixl.h
  head/sys/dev/ixl/ixl_txrx.c
  head/sys/dev/ixl/ixlvc.c

Modified: head/sys/dev/ixl/if_ixl.c
==============================================================================
--- head/sys/dev/ixl/if_ixl.c	Sat Sep 27 20:43:01 2014	(r272226)
+++ head/sys/dev/ixl/if_ixl.c	Sat Sep 27 20:54:57 2014	(r272227)
@@ -2275,6 +2275,10 @@ ixl_setup_interface(device_t dev, struct
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
 	ifp->if_ioctl = ixl_ioctl;
 
+#if __FreeBSD_version >= 1100000
+	if_setgetcounterfn(ifp, ixl_get_counter);
+#endif
+
 	ifp->if_transmit = ixl_mq_start;
 
 	ifp->if_qflush = ixl_qflush;
@@ -3700,7 +3704,6 @@ ixl_update_stats_counters(struct ixl_pf 
 {
 	struct i40e_hw	*hw = &pf->hw;
 	struct ixl_vsi *vsi = &pf->vsi;
-	struct ifnet	*ifp = vsi->ifp;
 
 	struct i40e_hw_port_stats *nsd = &pf->stats;
 	struct i40e_hw_port_stats *osd = &pf->stats_offsets;
@@ -3893,7 +3896,7 @@ ixl_update_stats_counters(struct ixl_pf 
 
 	/* OS statistics */
 	// ERJ - these are per-port, update all vsis?
-	ifp->if_ierrors = nsd->crc_errors + nsd->illegal_bytes;
+	IXL_SET_IERRORS(vsi, nsd->crc_errors + nsd->illegal_bytes);
 }
 
 /*
@@ -4027,13 +4030,16 @@ void ixl_update_eth_stats(struct ixl_vsi
 {
 	struct ixl_pf *pf = (struct ixl_pf *)vsi->back;
 	struct i40e_hw *hw = &pf->hw;
-	struct ifnet *ifp = vsi->ifp;
 	struct i40e_eth_stats *es;
 	struct i40e_eth_stats *oes;
+	int i;
+	uint64_t tx_discards;
+	struct i40e_hw_port_stats *nsd;
 	u16 stat_idx = vsi->info.stat_counter_idx;
 
 	es = &vsi->eth_stats;
 	oes = &vsi->eth_stats_offsets;
+	nsd = &pf->stats;
 
 	/* Gather up the stats that the hw collects */
 	ixl_stat_update32(hw, I40E_GLV_TEPC(stat_idx),
@@ -4078,22 +4084,27 @@ void ixl_update_eth_stats(struct ixl_vsi
 			   &oes->tx_broadcast, &es->tx_broadcast);
 	vsi->stat_offsets_loaded = true;
 
+	tx_discards = es->tx_discards + nsd->tx_dropped_link_down;
+	for (i = 0; i < vsi->num_queues; i++)
+		tx_discards += vsi->queues[i].txr.br->br_drops;
+
 	/* Update ifnet stats */
-	ifp->if_ipackets = es->rx_unicast +
+	IXL_SET_IPACKETS(vsi, es->rx_unicast +
 	                   es->rx_multicast +
-			   es->rx_broadcast;
-	ifp->if_opackets = es->tx_unicast +
+			   es->rx_broadcast);
+	IXL_SET_OPACKETS(vsi, es->tx_unicast +
 	                   es->tx_multicast +
-			   es->tx_broadcast;
-	ifp->if_ibytes = es->rx_bytes;
-	ifp->if_obytes = es->tx_bytes;
-	ifp->if_imcasts = es->rx_multicast;
-	ifp->if_omcasts = es->tx_multicast;
-
-	ifp->if_oerrors = es->tx_errors;
-	ifp->if_iqdrops = es->rx_discards;
-	ifp->if_noproto = es->rx_unknown_protocol;
-	ifp->if_collisions = 0;
+			   es->tx_broadcast);
+	IXL_SET_IBYTES(vsi, es->rx_bytes);
+	IXL_SET_OBYTES(vsi, es->tx_bytes);
+	IXL_SET_IMCASTS(vsi, es->rx_multicast);
+	IXL_SET_OMCASTS(vsi, es->tx_multicast);
+
+	IXL_SET_OERRORS(vsi, es->tx_errors);
+	IXL_SET_IQDROPS(vsi, es->rx_discards + nsd->eth.rx_discards);
+	IXL_SET_OQDROPS(vsi, tx_discards);
+	IXL_SET_NOPROTO(vsi, es->rx_unknown_protocol);
+	IXL_SET_COLLISIONS(vsi, 0);
 }
 
 /**

Modified: head/sys/dev/ixl/if_ixlv.c
==============================================================================
--- head/sys/dev/ixl/if_ixlv.c	Sat Sep 27 20:43:01 2014	(r272226)
+++ head/sys/dev/ixl/if_ixlv.c	Sat Sep 27 20:54:57 2014	(r272227)
@@ -1355,6 +1355,10 @@ ixlv_setup_interface(device_t dev, struc
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
 	ifp->if_ioctl = ixlv_ioctl;
 
+#if __FreeBSD_version >= 1100000
+	if_setgetcounterfn(ifp, ixl_get_counter);
+#endif
+
 	ifp->if_transmit = ixl_mq_start;
 
 	ifp->if_qflush = ixl_qflush;

Modified: head/sys/dev/ixl/ixl.h
==============================================================================
--- head/sys/dev/ixl/ixl.h	Sat Sep 27 20:43:01 2014	(r272226)
+++ head/sys/dev/ixl/ixl.h	Sat Sep 27 20:54:57 2014	(r272227)
@@ -264,6 +264,35 @@
 #define IXL_RX_UNLOCK(_sc)              mtx_unlock(&(_sc)->mtx)
 #define IXL_RX_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->mtx)
 
+#if __FreeBSD_version >= 1100000
+#define IXL_SET_IPACKETS(vsi, count)	(vsi)->ipackets = (count)
+#define IXL_SET_IERRORS(vsi, count)	(vsi)->ierrors = (count)
+#define IXL_SET_OPACKETS(vsi, count)	(vsi)->opackets = (count)
+#define IXL_SET_OERRORS(vsi, count)	(vsi)->oerrors = (count)
+#define IXL_SET_COLLISIONS(vsi, count)	/* Do nothing; collisions is always 0. */
+#define IXL_SET_IBYTES(vsi, count)	(vsi)->ibytes = (count)
+#define IXL_SET_OBYTES(vsi, count)	(vsi)->obytes = (count)
+#define IXL_SET_IMCASTS(vsi, count)	(vsi)->imcasts = (count)
+#define IXL_SET_OMCASTS(vsi, count)	(vsi)->omcasts = (count)
+#define IXL_SET_IQDROPS(vsi, count)	(vsi)->iqdrops = (count)
+#define IXL_SET_OQDROPS(vsi, count)	(vsi)->iqdrops = (count)
+#define IXL_SET_NOPROTO(vsi, count)	(vsi)->noproto = (count)
+#else
+#define IXL_SET_IPACKETS(vsi, count)	(vsi)->ifp->if_ipackets = (count)
+#define IXL_SET_IERRORS(vsi, count)	(vsi)->ifp->if_ierrors = (count)
+#define IXL_SET_OPACKETS(vsi, count)	(vsi)->ifp->if_opackets = (count)
+#define IXL_SET_OERRORS(vsi, count)	(vsi)->ifp->if_oerrors = (count)
+#define IXL_SET_COLLISIONS(vsi, count)	(vsi)->ifp->if_collisions = (count)
+#define IXL_SET_IBYTES(vsi, count)	(vsi)->ifp->if_ibytes = (count)
+#define IXL_SET_OBYTES(vsi, count)	(vsi)->ifp->if_obytes = (count)
+#define IXL_SET_IMCASTS(vsi, count)	(vsi)->ifp->if_imcasts = (count)
+#define IXL_SET_OMCASTS(vsi, count)	(vsi)->ifp->if_omcasts = (count)
+#define IXL_SET_IQDROPS(vsi, count)	(vsi)->ifp->if_iqdrops = (count)
+#define IXL_SET_OQDROPS(vsi, odrops)	(vsi)->ifp->if_snd.ifq_drops = (odrops)
+#define IXL_SET_NOPROTO(vsi, count)	(vsi)->noproto = (count)
+#endif
+
+
 /*
  *****************************************************************************
  * vendor_info_array
@@ -447,6 +476,17 @@ struct ixl_vsi {
 	struct i40e_eth_stats	eth_stats;
 	struct i40e_eth_stats	eth_stats_offsets;
 	bool 			stat_offsets_loaded;
+	u64			ipackets;
+	u64			ierrors;
+	u64			opackets;
+	u64			oerrors;
+	u64			ibytes;
+	u64			obytes;
+	u64			imcasts;
+	u64			omcasts;
+	u64			iqdrops;
+	u64			oqdrops;
+	u64			noproto;
 
 	/* Driver statistics */
 	u64			hw_filters_del;
@@ -554,5 +594,8 @@ void	ixl_free_que_rx(struct ixl_queue *)
 #ifdef IXL_FDIR
 void	ixl_atr(struct ixl_queue *, struct tcphdr *, int);
 #endif
+#if __FreeBSD_version >= 1100000
+uint64_t ixl_get_counter(if_t ifp, ift_counter cnt);
+#endif
 
 #endif /* _IXL_H_ */

Modified: head/sys/dev/ixl/ixl_txrx.c
==============================================================================
--- head/sys/dev/ixl/ixl_txrx.c	Sat Sep 27 20:43:01 2014	(r272226)
+++ head/sys/dev/ixl/ixl_txrx.c	Sat Sep 27 20:54:57 2014	(r272227)
@@ -783,8 +783,6 @@ ixl_get_tx_head(struct ixl_queue *que)
 bool
 ixl_txeof(struct ixl_queue *que)
 {
-	struct ixl_vsi		*vsi = que->vsi;
-	struct ifnet		*ifp = vsi->ifp;
 	struct tx_ring		*txr = &que->txr;
 	u32			first, last, head, done, processed;
 	struct ixl_tx_buf	*buf;
@@ -857,7 +855,6 @@ ixl_txeof(struct ixl_queue *que)
 			tx_desc = &txr->base[first];
 		}
 		++txr->packets;
-		++ifp->if_opackets;
 		/* See if there is more work now */
 		last = buf->eop_index;
 		if (last != -1) {
@@ -1420,7 +1417,6 @@ ixl_rxeof(struct ixl_queue *que, int cou
 		** error results.
 		*/
                 if (eop && (error & (1 << I40E_RX_DESC_ERROR_RXE_SHIFT))) {
-			ifp->if_ierrors++;
 			rxr->discarded++;
 			ixl_rx_discard(rxr, i);
 			goto next_desc;
@@ -1529,7 +1525,6 @@ ixl_rxeof(struct ixl_queue *que, int cou
 		if (eop) {
 			sendmp->m_pkthdr.rcvif = ifp;
 			/* gather stats */
-			ifp->if_ipackets++;
 			rxr->rx_packets++;
 			rxr->rx_bytes += sendmp->m_pkthdr.len;
 			/* capture data for dynamic ITR adjustment */
@@ -1625,3 +1620,43 @@ ixl_rx_checksum(struct mbuf * mp, u32 st
 	}
 	return;
 }
+
+#if __FreeBSD_version >= 1100000
+uint64_t
+ixl_get_counter(if_t ifp, ift_counter cnt)
+{
+	struct ixl_vsi *vsi;
+
+	vsi = if_getsoftc(ifp);
+
+	switch (cnt) {
+	case IFCOUNTER_IPACKETS:
+		return (vsi->ipackets);
+	case IFCOUNTER_IERRORS:
+		return (vsi->ierrors);
+	case IFCOUNTER_OPACKETS:
+		return (vsi->opackets);
+	case IFCOUNTER_OERRORS:
+		return (vsi->oerrors);
+	case IFCOUNTER_COLLISIONS:
+		/* Collisions are by standard impossible in 40G/10G Ethernet */
+		return (0);
+	case IFCOUNTER_IBYTES:
+		return (vsi->ibytes);
+	case IFCOUNTER_OBYTES:
+		return (vsi->obytes);
+	case IFCOUNTER_IMCASTS:
+		return (vsi->imcasts);
+	case IFCOUNTER_OMCASTS:
+		return (vsi->omcasts);
+	case IFCOUNTER_IQDROPS:
+		return (vsi->iqdrops);
+	case IFCOUNTER_OQDROPS:
+		return (vsi->oqdrops);
+	case IFCOUNTER_NOPROTO:
+		return (vsi->noproto);
+	default:
+		return (if_get_counter_default(ifp, cnt));
+	}
+}
+#endif

Modified: head/sys/dev/ixl/ixlvc.c
==============================================================================
--- head/sys/dev/ixl/ixlvc.c	Sat Sep 27 20:43:01 2014	(r272226)
+++ head/sys/dev/ixl/ixlvc.c	Sat Sep 27 20:54:57 2014	(r272227)
@@ -837,22 +837,33 @@ ixlv_request_stats(struct ixlv_sc *sc)
 void
 ixlv_update_stats_counters(struct ixlv_sc *sc, struct i40e_eth_stats *es)
 {
-	struct ifnet *ifp = sc->vsi.ifp;
+	struct ixl_vsi *vsi;
+	uint64_t tx_discards;
+	int i;
+
+	vsi = &sc->vsi;
+
+	tx_discards = es->tx_discards;
+	for (i = 0; i < sc->vsi.num_queues; i++)
+		tx_discards += sc->vsi.queues[i].txr.br->br_drops;
 
-	ifp->if_ipackets = es->rx_unicast +
+	/* Update ifnet stats */
+	IXL_SET_IPACKETS(vsi, es->rx_unicast +
 	                   es->rx_multicast +
-			   es->rx_broadcast;
-	ifp->if_opackets = es->tx_unicast +
+			   es->rx_broadcast);
+	IXL_SET_OPACKETS(vsi, es->tx_unicast +
 	                   es->tx_multicast +
-			   es->tx_broadcast;
-	ifp->if_ibytes = es->rx_bytes;
-	ifp->if_obytes = es->tx_bytes;
-	ifp->if_imcasts = es->rx_multicast;
-	ifp->if_omcasts = es->tx_multicast;
-
-	ifp->if_oerrors = es->tx_errors;
-	ifp->if_iqdrops = es->rx_discards;
-	ifp->if_noproto = es->rx_unknown_protocol;
+			   es->tx_broadcast);
+	IXL_SET_IBYTES(vsi, es->rx_bytes);
+	IXL_SET_OBYTES(vsi, es->tx_bytes);
+	IXL_SET_IMCASTS(vsi, es->rx_multicast);
+	IXL_SET_OMCASTS(vsi, es->tx_multicast);
+
+	IXL_SET_OERRORS(vsi, es->tx_errors);
+	IXL_SET_IQDROPS(vsi, es->rx_discards);
+	IXL_SET_OQDROPS(vsi, tx_discards);
+	IXL_SET_NOPROTO(vsi, es->rx_unknown_protocol);
+	IXL_SET_COLLISIONS(vsi, 0);
 
 	sc->vsi.eth_stats = *es;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409272054.s8RKswiw073529>