Received: by 2002:ab2:6c55:0:b0:1fd:c486:4f03 with SMTP id v21csp689036lqp; Wed, 12 Jun 2024 13:10:20 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVMzaEg12safWCWUnWqyqxdMXM0AA/brmYgFEimyKrWDClro6wub/KzxKxS79YwoJ0RFjgg1H/p8ptXOfYhNK6Sv5zQYxJxYP3g3pyiPQ== X-Google-Smtp-Source: AGHT+IG1OrXh7c8BieDO9nFWAaJ7zPk5zvrlOuOSe+CGs9CYAYgvy0lsfcaeUJVMqBwOsDNSuQdB X-Received: by 2002:a50:a40a:0:b0:57c:a701:2311 with SMTP id 4fb4d7f45d1cf-57caaacbaf7mr1788271a12.26.1718223020799; Wed, 12 Jun 2024 13:10:20 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1718223020; cv=pass; d=google.com; s=arc-20160816; b=CF4Ws5Deen9lO9aWu6HLruQdnLk89h6QP/vptY2xRArbkjrZawOweTczWlLpHaFoT+ YQZCaCqHN+me5agKyHiBow6/77innoO8ZmtDkC7eThUX+bU+EsfH4jkF2hXlJ2iAIJJe 06k+v/KTGi020BGkTWeFNnTJta7PYMuZGnPjoDILmMwVruACaPE3Kx6/yljrEgqOv+2r J5olJNfc8CLMOffRO4U/FnG9cvp9O5728T7z/ztpHTJ5Zl25mYQXtuJFNMKl/o4r8VIf OaDh1GDKtJvZDWDUo+S5nx/rtgH2G7v1O6iBBRBbV8XjbfqjBnZmbl4oWuwzG3wyF8Rp N+2Q== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=0s8R7PiKG7ygOhXdI8mYQIM9Nw0ZpcuydO4wtHx1EMs=; fh=bPDTtYyfkdS/ipwvAY91NNV0CslyP5AFY3j1GUy4Ez4=; b=0ThsiY/M6rMWJoFXb1fPyco+fdA4Z+eipPbEmkFM+r+FWCUOf0LzvS8W/2xIdtxu+U ycbrS271/aK3U9nWuDIM/quwIvSaJkum21gcfYMSon2yzYcKuv6lRMFapk1ZZlmay6mA xCzVirXJ5nYZxq0cInpxuXYzPWVwTzCqSms5mh6rPX0YiIdH9BfLTZ7c+Uew4fIK0JIj IzIyVM9dvi+BththuxrXhhjfP7A8bsFkLJa5qYuhyK6NABTr2SVGVUVZHh+5oK4bawZr zCVD56PVRm5CC/IkwfQGBkQp2W01T16usgL4QPnQwbUcaIIflA9iPH8U9Oayxvw+/hGO T50Q==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@fastly.com header.s=google header.b=UsfHvtpL; arc=pass (i=1 spf=pass spfdomain=fastly.com dkim=pass dkdomain=fastly.com dmarc=pass fromdomain=fastly.com); spf=pass (google.com: domain of linux-kernel+bounces-212193-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-212193-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=fastly.com Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id 4fb4d7f45d1cf-57c73a283c9si4491517a12.308.2024.06.12.13.10.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Jun 2024 13:10:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-212193-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@fastly.com header.s=google header.b=UsfHvtpL; arc=pass (i=1 spf=pass spfdomain=fastly.com dkim=pass dkdomain=fastly.com dmarc=pass fromdomain=fastly.com); spf=pass (google.com: domain of linux-kernel+bounces-212193-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-212193-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=fastly.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 5C3731F24D6E for ; Wed, 12 Jun 2024 20:10:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 36E0286277; Wed, 12 Jun 2024 20:09:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b="UsfHvtpL" Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7902784DE9 for ; Wed, 12 Jun 2024 20:09:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718222975; cv=none; b=lgRwNwVAtp6EnfT8IwRMwHCVNn56DhNPUbbt6Uf8WJS8MLxK7xYKAwN/amxDuz54qYJacBGnxNa6RPb/N8aA5UVvGpiJ1tcIuwX2eQpw2VCypvr4sD4FxtwXcS1nip1YB3kWWpRsFXoNDwaLreDcWvRRwWJvKdDPkB99zA63/9o= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718222975; c=relaxed/simple; bh=jF2I4eWVfCTC/mgwsHEU1ahkjsFYbbCMnQ/zLeO8He4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=owXbE0x1T8S3FS93vB7nuARlTU3lmSyEARsUEZ+DJJup/vbNKM+wSdNV2I4BYXhFSB7odSQgWemqwfeLNQQYuqjSZAPh1crJIoZNbdeSyp209tCNiyJ+nLArOU6YtIv1r3DJ/uF38aJ0Vdu/mBJpQuCIjC4WRQnZb7n3Ee+9qXk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com; spf=pass smtp.mailfrom=fastly.com; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b=UsfHvtpL; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=fastly.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fastly.com Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-1f717ee193fso2421705ad.0 for ; Wed, 12 Jun 2024 13:09:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1718222973; x=1718827773; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0s8R7PiKG7ygOhXdI8mYQIM9Nw0ZpcuydO4wtHx1EMs=; b=UsfHvtpLFxcnz6Eg7k9HqLBR2W9wJddrq0qRVGl+/pFoD4gFyeL16BorqUOgk+advY o4MKvWS9tnNwds5F4CoWROlvBGysb79w2F709ZszgFh01jH8kpHH+aR/cuN95Cb5IgPz kF3z36z8NkiA115cExOQFBWxqge6nbaiwQK6Q= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1718222973; x=1718827773; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0s8R7PiKG7ygOhXdI8mYQIM9Nw0ZpcuydO4wtHx1EMs=; b=k0s6mvzU4un988tbuBtL1nbusjHIJfTGh5Kq1ypQ9O9eXk7kEoQlyFAjbm5MKTd8S7 /1G//aelmMj8dhlSu0nsjPN36vokTyRhjESF3k5scW/q9zOOQb3rVG7DNU26AMzpbDDT oQ33pBNqdv6P/dHc05GiHL63lgLqgzj7g+bRhaH9zaAqE/X9iTC8v8Kcy5TraQmGZkOG v67AtAMl+FjksilRdYbvy9ty2AxUrYMbnkcSM6dckGxi4ZDzGQtZqFp2/xrBTJB3xh/u Vbn8cYFG2pVbdM5C/85oC3bK3MB7+O1h6KF28hUEiWIG7qHuLFae1IHDPJikrYS4hDa6 aEJg== X-Forwarded-Encrypted: i=1; AJvYcCVIM4ws36HGR3BvNlxZ8utuZRYG5q0LjJyRPA0Q9rVnplvu2FUHmQRx1d8GAL+8M922w/vWkzo709FvdezrJCzYv5XxgDnEn+LxXqZ8 X-Gm-Message-State: AOJu0Yy064TaGp6NLLKcJu8Jf4w4bziGiBJsUDjob4s3t3wqxlVscdf3 1Mcv/2Kq2m05x3ed5JfBJJrTCnTJlXB/omr/F67T0acHxvHLOf3n0qrLZn98dc70OwVY9nUTaCL E X-Received: by 2002:a17:903:1c9:b0:1f7:123e:2c6f with SMTP id d9443c01a7336-1f83b6788eemr35571165ad.37.1718222972808; Wed, 12 Jun 2024 13:09:32 -0700 (PDT) Received: from localhost.localdomain ([2620:11a:c019:0:65e:3115:2f58:c5fd]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1f6ee3d5a17sm91506805ad.146.2024.06.12.13.09.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Jun 2024 13:09:32 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: nalramli@fastly.com, Joe Damato , Saeed Mahameed , Tariq Toukan , Leon Romanovsky , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , linux-rdma@vger.kernel.org (open list:MELLANOX MLX5 core VPI driver) Subject: [net-next v5 2/2] net/mlx5e: Add per queue netdev-genl stats Date: Wed, 12 Jun 2024 20:08:57 +0000 Message-Id: <20240612200900.246492-3-jdamato@fastly.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240612200900.246492-1-jdamato@fastly.com> References: <20240612200900.246492-1-jdamato@fastly.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit ./cli.py --spec netlink/specs/netdev.yaml \ --dump qstats-get --json '{"scope": "queue"}' ...snip {'ifindex': 7, 'queue-id': 62, 'queue-type': 'rx', 'rx-alloc-fail': 0, 'rx-bytes': 105965251, 'rx-packets': 179790}, {'ifindex': 7, 'queue-id': 0, 'queue-type': 'tx', 'tx-bytes': 9402665, 'tx-packets': 17551}, ...snip Also tested with the script tools/testing/selftests/drivers/net/stats.py in several scenarios to ensure stats tallying was correct: - on boot (default queue counts) - adjusting queue count up or down (ethtool -L eth0 combined ...) The tools/testing/selftests/drivers/net/stats.py brings the device up, so to test with the device down, I did the following: $ ip link show eth4 7: eth4: mtu 9000 qdisc mq state DOWN [..snip..] [..snip..] $ cat /proc/net/dev | grep eth4 eth4: 235710489 434811 [..snip rx..] 2878744 21227 [..snip tx..] $ ./cli.py --spec ../../../Documentation/netlink/specs/netdev.yaml \ --dump qstats-get --json '{"ifindex": 7}' [{'ifindex': 7, 'rx-alloc-fail': 0, 'rx-bytes': 235710489, 'rx-packets': 434811, 'tx-bytes': 2878744, 'tx-packets': 21227}] Compare the values in /proc/net/dev match the output of cli for the same device, even while the device is down. Note that while the device is down, per queue stats output nothing (because the device is down there are no queues): $ ./cli.py --spec ../../../Documentation/netlink/specs/netdev.yaml \ --dump qstats-get --json '{"scope": "queue", "ifindex": 7}' [] Signed-off-by: Joe Damato --- .../net/ethernet/mellanox/mlx5/core/en_main.c | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index c548e2fdc58f..d3f38b4b18eb 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -5299,6 +5300,136 @@ static bool mlx5e_tunnel_any_tx_proto_supported(struct mlx5_core_dev *mdev) return (mlx5_vxlan_allowed(mdev->vxlan) || mlx5_geneve_tx_allowed(mdev)); } +static void mlx5e_get_queue_stats_rx(struct net_device *dev, int i, + struct netdev_queue_stats_rx *stats) +{ + struct mlx5e_priv *priv = netdev_priv(dev); + struct mlx5e_channel_stats *channel_stats; + struct mlx5e_rq_stats *xskrq_stats; + struct mlx5e_rq_stats *rq_stats; + + ASSERT_RTNL(); + if (mlx5e_is_uplink_rep(priv)) + return; + + channel_stats = priv->channel_stats[i]; + xskrq_stats = &channel_stats->xskrq; + rq_stats = &channel_stats->rq; + + stats->packets = rq_stats->packets + xskrq_stats->packets; + stats->bytes = rq_stats->bytes + xskrq_stats->bytes; + stats->alloc_fail = rq_stats->buff_alloc_err + + xskrq_stats->buff_alloc_err; +} + +static void mlx5e_get_queue_stats_tx(struct net_device *dev, int i, + struct netdev_queue_stats_tx *stats) +{ + struct mlx5e_priv *priv = netdev_priv(dev); + struct mlx5e_sq_stats *sq_stats; + + ASSERT_RTNL(); + /* no special case needed for ptp htb etc since txq2sq_stats is kept up + * to date for active sq_stats, otherwise get_base_stats takes care of + * inactive sqs. + */ + sq_stats = priv->txq2sq_stats[i]; + stats->packets = sq_stats->packets; + stats->bytes = sq_stats->bytes; +} + +static void mlx5e_get_base_stats(struct net_device *dev, + struct netdev_queue_stats_rx *rx, + struct netdev_queue_stats_tx *tx) +{ + struct mlx5e_priv *priv = netdev_priv(dev); + struct mlx5e_ptp *ptp_channel; + int i, tc; + + ASSERT_RTNL(); + if (!mlx5e_is_uplink_rep(priv)) { + rx->packets = 0; + rx->bytes = 0; + rx->alloc_fail = 0; + + for (i = priv->channels.params.num_channels; i < priv->stats_nch; i++) { + struct netdev_queue_stats_rx rx_i = {0}; + + mlx5e_get_queue_stats_rx(dev, i, &rx_i); + + rx->packets += rx_i.packets; + rx->bytes += rx_i.bytes; + rx->alloc_fail += rx_i.alloc_fail; + } + + /* always report PTP RX stats from base as there is no + * corresponding channel to report them under in + * mlx5e_get_queue_stats_rx. + */ + if (priv->rx_ptp_opened) { + struct mlx5e_rq_stats *rq_stats = &priv->ptp_stats.rq; + + rx->packets += rq_stats->packets; + rx->bytes += rq_stats->bytes; + } + } + + tx->packets = 0; + tx->bytes = 0; + + for (i = 0; i < priv->stats_nch; i++) { + struct mlx5e_channel_stats *channel_stats = priv->channel_stats[i]; + + /* handle two cases: + * + * 1. channels which are active. In this case, + * report only deactivated TCs on these channels. + * + * 2. channels which were deactivated + * (i > priv->channels.params.num_channels) + * must have all of their TCs [0 .. priv->max_opened_tc) + * examined because deactivated channels will not be in the + * range of [0..real_num_tx_queues) and will not have their + * stats reported by mlx5e_get_queue_stats_tx. + */ + if (i < priv->channels.params.num_channels) + tc = mlx5e_get_dcb_num_tc(&priv->channels.params); + else + tc = 0; + + for (; tc < priv->max_opened_tc; tc++) { + struct mlx5e_sq_stats *sq_stats = &channel_stats->sq[tc]; + + tx->packets += sq_stats->packets; + tx->bytes += sq_stats->bytes; + } + } + + /* if PTP TX was opened at some point and has since either: + * - been shutdown and set to NULL, or + * - simply disabled (bit unset) + * + * report stats directly from the ptp_stats structures as these queues + * are now unavailable and there is no txq index to retrieve these + * stats via calls to mlx5e_get_queue_stats_tx. + */ + ptp_channel = priv->channels.ptp; + if (priv->tx_ptp_opened && (!ptp_channel || !test_bit(MLX5E_PTP_STATE_TX, ptp_channel->state))) { + for (tc = 0; tc < priv->max_opened_tc; tc++) { + struct mlx5e_sq_stats *sq_stats = &priv->ptp_stats.sq[tc]; + + tx->packets += sq_stats->packets; + tx->bytes += sq_stats->bytes; + } + } +} + +static const struct netdev_stat_ops mlx5e_stat_ops = { + .get_queue_stats_rx = mlx5e_get_queue_stats_rx, + .get_queue_stats_tx = mlx5e_get_queue_stats_tx, + .get_base_stats = mlx5e_get_base_stats, +}; + static void mlx5e_build_nic_netdev(struct net_device *netdev) { struct mlx5e_priv *priv = netdev_priv(netdev); @@ -5316,6 +5447,7 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev) netdev->watchdog_timeo = 15 * HZ; + netdev->stat_ops = &mlx5e_stat_ops; netdev->ethtool_ops = &mlx5e_ethtool_ops; netdev->vlan_features |= NETIF_F_SG; -- 2.25.1