On Sat, May 11, 2024 at 4:20 AM Daniel Jurgens <danielj@xxxxxxxxxx> wrote: > > TX queue stop and wake are counted by some drivers. > Support reporting these via netdev-genl queue stats. > > Signed-off-by: Daniel Jurgens <danielj@xxxxxxxxxx> > Reviewed-by: Jiri Pirko <jiri@xxxxxxxxxx> Good to see this finally :) Reviewed-by: Jason Xing <kerneljasonxing@xxxxxxxxx> > --- > Documentation/netlink/specs/netdev.yaml | 14 ++++++++++++++ > include/net/netdev_queues.h | 3 +++ > include/uapi/linux/netdev.h | 2 ++ > net/core/netdev-genl.c | 4 +++- > tools/include/uapi/linux/netdev.h | 2 ++ > 5 files changed, 24 insertions(+), 1 deletion(-) > > diff --git a/Documentation/netlink/specs/netdev.yaml b/Documentation/netlink/specs/netdev.yaml > index 2be4b3714d17..11a32373365a 100644 > --- a/Documentation/netlink/specs/netdev.yaml > +++ b/Documentation/netlink/specs/netdev.yaml > @@ -439,6 +439,20 @@ attribute-sets: > Number of the packets dropped by the device due to the transmit > packets bitrate exceeding the device rate limit. > type: uint > + - > + name: tx-stop > + doc: | > + Number of times driver paused accepting new tx packets > + from the stack to this queue, because the queue was full. > + Note that if BQL is supported and enabled on the device > + the networking stack will avoid queuing a lot of data at once. > + type: uint > + - > + name: tx-wake > + doc: | > + Number of times driver re-started accepting send > + requests to this queue from the stack. > + type: uint > > operations: > list: > diff --git a/include/net/netdev_queues.h b/include/net/netdev_queues.h > index e7b84f018cee..a8a7e48dfa6c 100644 > --- a/include/net/netdev_queues.h > +++ b/include/net/netdev_queues.h > @@ -41,6 +41,9 @@ struct netdev_queue_stats_tx { > u64 hw_gso_wire_bytes; > > u64 hw_drop_ratelimits; > + > + u64 stop; > + u64 wake; > }; > > /** > diff --git a/include/uapi/linux/netdev.h b/include/uapi/linux/netdev.h > index cf24f1d9adf8..a8188202413e 100644 > --- a/include/uapi/linux/netdev.h > +++ b/include/uapi/linux/netdev.h > @@ -165,6 +165,8 @@ enum { > NETDEV_A_QSTATS_TX_HW_GSO_WIRE_PACKETS, > NETDEV_A_QSTATS_TX_HW_GSO_WIRE_BYTES, > NETDEV_A_QSTATS_TX_HW_DROP_RATELIMITS, > + NETDEV_A_QSTATS_TX_STOP, > + NETDEV_A_QSTATS_TX_WAKE, > > __NETDEV_A_QSTATS_MAX, > NETDEV_A_QSTATS_MAX = (__NETDEV_A_QSTATS_MAX - 1) > diff --git a/net/core/netdev-genl.c b/net/core/netdev-genl.c > index 4b5054087309..1f6ae6379e0f 100644 > --- a/net/core/netdev-genl.c > +++ b/net/core/netdev-genl.c > @@ -517,7 +517,9 @@ netdev_nl_stats_write_tx(struct sk_buff *rsp, struct netdev_queue_stats_tx *tx) > netdev_stat_put(rsp, NETDEV_A_QSTATS_TX_HW_GSO_BYTES, tx->hw_gso_bytes) || > netdev_stat_put(rsp, NETDEV_A_QSTATS_TX_HW_GSO_WIRE_PACKETS, tx->hw_gso_wire_packets) || > netdev_stat_put(rsp, NETDEV_A_QSTATS_TX_HW_GSO_WIRE_BYTES, tx->hw_gso_wire_bytes) || > - netdev_stat_put(rsp, NETDEV_A_QSTATS_TX_HW_DROP_RATELIMITS, tx->hw_drop_ratelimits)) > + netdev_stat_put(rsp, NETDEV_A_QSTATS_TX_HW_DROP_RATELIMITS, tx->hw_drop_ratelimits) || > + netdev_stat_put(rsp, NETDEV_A_QSTATS_TX_STOP, tx->stop) || > + netdev_stat_put(rsp, NETDEV_A_QSTATS_TX_WAKE, tx->wake)) > return -EMSGSIZE; > return 0; > } > diff --git a/tools/include/uapi/linux/netdev.h b/tools/include/uapi/linux/netdev.h > index cf24f1d9adf8..a8188202413e 100644 > --- a/tools/include/uapi/linux/netdev.h > +++ b/tools/include/uapi/linux/netdev.h > @@ -165,6 +165,8 @@ enum { > NETDEV_A_QSTATS_TX_HW_GSO_WIRE_PACKETS, > NETDEV_A_QSTATS_TX_HW_GSO_WIRE_BYTES, > NETDEV_A_QSTATS_TX_HW_DROP_RATELIMITS, > + NETDEV_A_QSTATS_TX_STOP, > + NETDEV_A_QSTATS_TX_WAKE, > > __NETDEV_A_QSTATS_MAX, > NETDEV_A_QSTATS_MAX = (__NETDEV_A_QSTATS_MAX - 1) > -- > 2.45.0 > >