Index: if.c =================================================================== RCS file: /cvs/src/sys/net/if.c,v retrieving revision 1.523 diff -u -p -r1.523 if.c --- if.c 4 Nov 2017 16:58:46 -0000 1.523 +++ if.c 14 Nov 2017 00:22:13 -0000 @@ -2276,30 +2276,14 @@ void if_getdata(struct ifnet *ifp, struct if_data *data) { unsigned int i; - struct ifqueue *ifq; - uint64_t opackets = 0; - uint64_t obytes = 0; - uint64_t omcasts = 0; - uint64_t oqdrops = 0; + + *data = ifp->if_data; for (i = 0; i < ifp->if_nifqs; i++) { - ifq = ifp->if_ifqs[i]; + struct ifqueue *ifq = ifp->if_ifqs[i]; - mtx_enter(&ifq->ifq_mtx); - opackets += ifq->ifq_packets; - obytes += ifq->ifq_bytes; - oqdrops += ifq->ifq_qdrops; - omcasts += ifq->ifq_mcasts; - mtx_leave(&ifq->ifq_mtx); - /* ifq->ifq_errors */ + ifq_add_data(ifq, data); } - - *data = ifp->if_data; - data->ifi_opackets += opackets; - data->ifi_obytes += obytes; - data->ifi_oqdrops += oqdrops; - data->ifi_omcasts += omcasts; - /* ifp->if_data.ifi_oerrors */ } /* Index: ifq.c =================================================================== RCS file: /cvs/src/sys/net/ifq.c,v retrieving revision 1.13 diff -u -p -r1.13 ifq.c --- ifq.c 14 Nov 2017 00:00:35 -0000 1.13 +++ ifq.c 14 Nov 2017 00:22:13 -0000 @@ -289,6 +289,18 @@ ifq_destroy(struct ifqueue *ifq) ml_purge(&ml); } +void +ifq_add_data(struct ifqueue *ifq, struct if_data *data) +{ + mtx_enter(&ifq->ifq_mtx); + data->ifi_opackets += ifq->ifq_packets; + data->ifi_obytes += ifq->ifq_bytes; + data->ifi_oqdrops += ifq->ifq_qdrops; + data->ifi_omcasts += ifq->ifq_mcasts; + /* ifp->if_data.ifi_oerrors */ + mtx_leave(&ifq->ifq_mtx); +} + int ifq_enqueue(struct ifqueue *ifq, struct mbuf *m) { Index: ifq.h =================================================================== RCS file: /cvs/src/sys/net/ifq.h,v retrieving revision 1.14 diff -u -p -r1.14 ifq.h --- ifq.h 14 Nov 2017 00:00:35 -0000 1.14 +++ ifq.h 14 Nov 2017 00:22:13 -0000 @@ -379,6 +379,7 @@ struct ifq_ops { void ifq_init(struct ifqueue *, struct ifnet *, unsigned int); void ifq_attach(struct ifqueue *, const struct ifq_ops *, void *); void ifq_destroy(struct ifqueue *); +void ifq_add_data(struct ifqueue *, struct if_data *); int ifq_enqueue(struct ifqueue *, struct mbuf *); void ifq_start(struct ifqueue *); struct mbuf *ifq_deq_begin(struct ifqueue *);