Index: ifq.c =================================================================== RCS file: /cvs/src/sys/net/ifq.c,v retrieving revision 1.46 diff -u -p -r1.46 ifq.c --- ifq.c 30 Apr 2022 21:13:57 -0000 1.46 +++ ifq.c 14 Oct 2022 02:37:17 -0000 @@ -577,14 +583,41 @@ ifq_mfreeml(struct ifqueue *ifq, struct #if NKSTAT > 0 struct ifiq_kstat_data { + struct kstat_kv kd_histogram[IFIQ_HISTOGRAM_BUCKETS]; struct kstat_kv kd_packets; struct kstat_kv kd_bytes; struct kstat_kv kd_qdrops; struct kstat_kv kd_errors; struct kstat_kv kd_qlen; + + struct kstat_kv kd_enqueues; + struct kstat_kv kd_dequeues; }; static const struct ifiq_kstat_data ifiq_kstat_tpl = { + { + KSTAT_KV_UNIT_INITIALIZER("pkts1", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts2", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts4", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts8", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts16", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts32", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts64", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts128", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts256", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + KSTAT_KV_UNIT_INITIALIZER("pkts512", + KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), + }, + KSTAT_KV_UNIT_INITIALIZER("packets", KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), KSTAT_KV_UNIT_INITIALIZER("bytes", @@ -595,6 +628,9 @@ static const struct ifiq_kstat_data ifiq KSTAT_KV_T_COUNTER64, KSTAT_KV_U_PACKETS), KSTAT_KV_UNIT_INITIALIZER("qlen", KSTAT_KV_T_UINT32, KSTAT_KV_U_PACKETS), + + KSTAT_KV_INITIALIZER("enqueues", KSTAT_KV_T_COUNTER64), + KSTAT_KV_INITIALIZER("dequeues", KSTAT_KV_T_COUNTER64), }; int @@ -602,14 +638,20 @@ ifiq_kstat_copy(struct kstat *ks, void * { struct ifiqueue *ifiq = ks->ks_softc; struct ifiq_kstat_data *kd = dst; + size_t i; *kd = ifiq_kstat_tpl; + for (i = 0; i < IFIQ_HISTOGRAM_BUCKETS; i++) + kstat_kv_u64(&kd->kd_histogram[i]) = ifiq->ifiq_histogram[i]; kstat_kv_u64(&kd->kd_packets) = ifiq->ifiq_packets; kstat_kv_u64(&kd->kd_bytes) = ifiq->ifiq_bytes; kstat_kv_u64(&kd->kd_qdrops) = ifiq->ifiq_qdrops; kstat_kv_u64(&kd->kd_errors) = ifiq->ifiq_errors; kstat_kv_u32(&kd->kd_qlen) = ml_len(&ifiq->ifiq_ml); + kstat_kv_u64(&kd->kd_enqueues) = ifiq->ifiq_enqueues; + kstat_kv_u64(&kd->kd_dequeues) = ifiq->ifiq_dequeues; + return (0); } #endif @@ -674,6 +716,7 @@ ifiq_input(struct ifiqueue *ifiq, struct uint64_t packets; uint64_t bytes = 0; unsigned int len; + unsigned int bucket; #if NBPFILTER > 0 caddr_t if_bpf; #endif @@ -687,6 +730,10 @@ ifiq_input(struct ifiqueue *ifiq, struct bytes += m->m_pkthdr.len; } packets = ml_len(ml); + bucket = fls(packets); + if (bucket > IFIQ_HISTOGRAM_BUCKETS) + bucket = IFIQ_HISTOGRAM_BUCKETS; + bucket--; #if NBPFILTER > 0 if_bpf = ifp->if_bpf; @@ -704,6 +751,7 @@ ifiq_input(struct ifiqueue *ifiq, struct if (ml_empty(ml)) { mtx_enter(&ifiq->ifiq_mtx); + ifiq->ifiq_histogram[bucket]++; ifiq->ifiq_packets += packets; ifiq->ifiq_bytes += bytes; mtx_leave(&ifiq->ifiq_mtx); @@ -714,6 +762,7 @@ ifiq_input(struct ifiqueue *ifiq, struct #endif mtx_enter(&ifiq->ifiq_mtx); + ifiq->ifiq_histogram[bucket]++; ifiq->ifiq_packets += packets; ifiq->ifiq_bytes += bytes; @@ -721,8 +770,10 @@ ifiq_input(struct ifiqueue *ifiq, struct if (__predict_true(!ISSET(ifp->if_xflags, IFXF_MONITOR))) { if (len > ifiq_maxlen_drop) ifiq->ifiq_qdrops += ml_len(ml); - else + else { + ifiq->ifiq_enqueues++; ml_enlist(&ifiq->ifiq_ml, ml); + } } mtx_leave(&ifiq->ifiq_mtx); @@ -766,6 +817,7 @@ ifiq_process(void *arg) return; mtx_enter(&ifiq->ifiq_mtx); + ifiq->ifiq_dequeues++; ml = ifiq->ifiq_ml; ml_init(&ifiq->ifiq_ml); mtx_leave(&ifiq->ifiq_mtx); Index: ifq.h =================================================================== RCS file: /cvs/src/sys/net/ifq.h,v retrieving revision 1.34 diff -u -p -r1.34 ifq.h --- ifq.h 28 Jan 2022 07:11:15 -0000 1.34 +++ ifq.h 14 Oct 2022 02:37:17 -0000 @@ -72,6 +72,8 @@ struct ifqueue { unsigned int ifq_idx; }; +#define IFIQ_HISTOGRAM_BUCKETS 10 + struct ifiqueue { struct ifnet *ifiq_if; struct taskq *ifiq_softnet; @@ -88,6 +90,9 @@ struct ifiqueue { unsigned int ifiq_pressure; /* counters */ + uint64_t ifiq_enqueues; + uint64_t ifiq_dequeues; + uint64_t ifiq_histogram[IFIQ_HISTOGRAM_BUCKETS]; uint64_t ifiq_packets; uint64_t ifiq_bytes; uint64_t ifiq_qdrops;