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;
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to