Received: by 2002:ab2:6309:0:b0:1fb:d597:ff75 with SMTP id s9csp622607lqt; Thu, 6 Jun 2024 13:12:20 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVAcs40WttGAGnnxBUaJ1VHkMZPhwvF3Zb5A7kkNHOVrqUZlwvxPVfuWMEBoujYaw/mY0+jhguL2IoY7h3Pv7Sz1DV6e7yx551NdJCb/g== X-Google-Smtp-Source: AGHT+IH9gRAijF+L7CxBqFwpWLLuGTuOK5G8EX5BV2bA3eggr2tv9EdvOu0bpv0XwnPVPpO6I2a+ X-Received: by 2002:a05:6602:6d15:b0:7e8:f36d:5303 with SMTP id ca18e2360f4ac-7eb5724cbacmr97531039f.14.1717704740432; Thu, 06 Jun 2024 13:12:20 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1717704740; cv=pass; d=google.com; s=arc-20160816; b=UbXvQ8LRMX5/b9ucZU7f39PIMfhmWmcWJ+Y64+qG0QV6AONGMpFNNoba2FJPs82o88 XQvr8qlErjsyTHWSYDrkZD0Bf6MaYRBbCWgwRtaJ7UWX5eEmPLADaQ1yvLzYOvlrGlKK Uc8OFMDRAXyQX8E2mmnzbWfPaLJcNA9GbU0Uxwinh7Vw5OFQaSddpDIMz/GwiylPsQOZ 2FNmObd54dlGyMZMClE0tubMx3TobkUF+FGsvLainb9UO+va2JNu8Ny6N9NbL2Z172h2 Pg8/Z5i5W/L7iqJNuAivU+plMOsP3x1N59ZEo00HsZ3/JSFD1t2LacAUUQwE3pU5sbA2 v1fw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:date:message-id:dkim-signature; bh=1LJQFg/Vv0IZjVCz3OUaJiIKWxnWbPka2Jcv2GW049s=; fh=88tkL0pmhDTmmcVOt2CgvnOvO57CtMr4Kc6tZ5jU2cc=; b=H6O0x+VcOx3RM2jfQcH7qOsU/XrgLGEXMg71Rd7nuHc2+4qjTFx2UpRDvOWLK6SLR1 3vpaqvbo5cB/2d1GJFQp5xUhKOkpvsS7rf5cV5oA6rPSc/XLIYgPbSxf653FvRzB7i8p eR/pla57VMtoGVVRZIAo/r3Wq47UL0OnS9GJSJqBbSvL5WqGOZrRH8HI9xfR2dIFhKjP TMfk3RitfiSgxLzY0RNdVV0HJp2CykUaYsVqUTXscjHdzP9bziDxY2G1qinIutml+vY6 Gx8VL3z/TRcPiwXgZLogi1sI64pZ1C6AqcRQa6zFfP/NbyepTJMEY9zpiYJ7gDPtCjZ2 sEDQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=fxIPsn9H; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-204971-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-204971-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id 41be03b00d2f7-6de27605e61si939424a12.528.2024.06.06.13.12.20 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Jun 2024 13:12:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-204971-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=fxIPsn9H; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-204971-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-204971-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.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 sv.mirrors.kernel.org (Postfix) with ESMTPS id 0490C286A8A for ; Thu, 6 Jun 2024 20:12:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 396B873518; Thu, 6 Jun 2024 20:12:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fxIPsn9H" Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 4DB9D71748; Thu, 6 Jun 2024 20:12:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717704724; cv=none; b=b+sVntm9MrfpnGZi0LvXxT9gW4K7XMVQ4u7GboEQ433BQZgyQ/WTLtMYEkDvxYYQ9yAv0E5ECUlWna4lzimOMO52vWaK+bPWPXa4ZiLJJjCG9sB3Xo0G/PaxAwUNnb9R8b9l30Eo65xaBtlVOA+ZUYZsqO09c+wwosUd3l+k+VY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717704724; c=relaxed/simple; bh=gscOM63wGs7S2B9f+4AZ3j9Bc83/QlUHl2jQPm0jH2g=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=QGuPXLg0Dkbr5cTnvfbF15riukDrpw5/0xM11lxdtbRhbFSNIG9+TKqc+lfH7bnZyUFH9K7gAWAym2rIHMy6eTqBZtAilbnmVzun/5vJFJCn6A8IlM0Ir44eOb/belk4fF7RYuU9SPIKqeXG9+Wsl7ihP12rtCkh0L9RncnlhF8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fxIPsn9H; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-42159283989so16987695e9.3; Thu, 06 Jun 2024 13:12:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1717704721; x=1718309521; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=1LJQFg/Vv0IZjVCz3OUaJiIKWxnWbPka2Jcv2GW049s=; b=fxIPsn9HfrcDxMpwgr0cQcwclaewm8fJVKnrbVyMVZ4g4y95DGlxsFQ7PcmE/g0+ER DczGwTX0uJecnG4lyu8E6IQIDJcm5+c1JsWgKmV+kN9rky3xhd62Mv6oPvAj6+2N6m8Q cG/IVIheldGVq3rkt1GPgozSxYH3wfVoIjSBNDkEUOXTncqYRjah459Fkphx7Bi/5bRE r6jxiO8nVwY3voUOVopXLgFGWkNf+c1MUGpFh9z+WBP6gvX29OeTCW9HhGA+aSWS4sHg rpSJVQFg5qJ62e9khPJ+iUFFsLxLjXHGKAUvxk8Kjbcp1jV5A+9/zww2Vqm93HgxCuzG RqaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717704721; x=1718309521; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=1LJQFg/Vv0IZjVCz3OUaJiIKWxnWbPka2Jcv2GW049s=; b=ObAkpIhmERy33QxD1wKbRUywK1wCxTD9E2ZGae5mdeyO8r877wdlv8OontAfE8rXBk O/GWf1xoYV7YctgNx3z/vsMG0VwhPo2HoUihqGl18q7h0WQ+GoNzB8gmT+Wmlf7dc7Xo jRcLryTrTQMik3blWe1ZOCEp19cI2DULCPY2JTo6lxfVtt3WeiniE1KaLbcWyxuAuNx/ QTCmoUe0B3fQfhC6FdnA6qXzFmZKmOJ2JlpWInz9AKak6j0skqdyzCGghLwOI4RYJoUQ YMnYyDgDMzOK0Rn+csM6M2MWiuCF0u1kfXTZutGap/7aphsV2jj8vjdEDo5TwARh2lDd zXQg== X-Forwarded-Encrypted: i=1; AJvYcCX1+PPPIfVdH82Ccnk+QZ9lZz7CrOAFjK1QOu5Wh5xMyeWGvPpG8QicAHm5neqJcBkK12RpTlwADmvBTcFDd8JsZuUPGGb2o0t90ZTxXF9fl2dBE1nFhp1JdKQ0nTuy7SmCZ1oua2zMvvjt0cmvROYCLpa/alvuOEe6p8WLUi2naQ== X-Gm-Message-State: AOJu0YxrG6bpxn5fTcnuiMeIPqcdD/iO6YXoRZB5Jsd1yTgjC52yLQtW oErf54J0+ylt+lFJPyILbaTCm4pO3w2Mee6UGGjVVsKvDcU5FyhP X-Received: by 2002:a05:600c:3508:b0:421:3d5c:8cbf with SMTP id 5b1f17b1804b1-42164a2b159mr6581235e9.32.1717704720417; Thu, 06 Jun 2024 13:12:00 -0700 (PDT) Received: from [172.27.33.107] ([193.47.165.251]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-421581020d2sm66488045e9.11.2024.06.06.13.11.58 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 06 Jun 2024 13:12:00 -0700 (PDT) Message-ID: <11b9c844-a56e-427f-aab3-3e223d41b165@gmail.com> Date: Thu, 6 Jun 2024 23:11:57 +0300 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [RFC net-next v4 2/2] net/mlx5e: Add per queue netdev-genl stats To: Joe Damato , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: nalramli@fastly.com, Saeed Mahameed , Leon Romanovsky , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , "open list:MELLANOX MLX5 core VPI driver" , Tariq Toukan References: <20240604004629.299699-1-jdamato@fastly.com> <20240604004629.299699-3-jdamato@fastly.com> Content-Language: en-US From: Tariq Toukan In-Reply-To: <20240604004629.299699-3-jdamato@fastly.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 04/06/2024 3:46, Joe Damato wrote: > ./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): This part is not true anymore. > > $ ./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 | 138 ++++++++++++++++++ > 1 file changed, 138 insertions(+) > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c > index d03fd1c98eb6..76d64bbcf250 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 > @@ -5279,6 +5280,142 @@ 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; > + > + /* ptp was ever opened, is currently open, and channel index matches i > + * then export stats > + */ > + if (priv->rx_ptp_opened && priv->channels.ptp) { > + if (test_bit(MLX5E_PTP_STATE_RX, priv->channels.ptp->state) && > + priv->channels.ptp->rq.ix == i) { PTP RQ index is naively assigned to zero: rq->ix = MLX5E_PTP_CHANNEL_IX; but this isn't to be used as the stats index. Today, the PTP-RQ has no matcing rxq in the kernel level. i.e. turning PTP-RQ on won't add a kernel-level RXQ to the real_num_rx_queues. Maybe we better do. If not, and the current state is kept, the best we can do is let the PTP-RQ naively contribute its queue-stat to channel 0. > + rq_stats = &priv->ptp_stats.rq; > + stats->packets = rq_stats->packets; > + stats->bytes = rq_stats->bytes; > + stats->alloc_fail = rq_stats->buff_alloc_err; > + 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); > + 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; > + } > + > + if (priv->rx_ptp_opened) { > + /* if PTP was opened, but is not currently open, then > + * report the stats here. otherwise, > + * mlx5e_get_queue_stats_rx will get it > + */ We shouldn't care if the RQ is currently open. The stats are always there. This applies to all RQs and SQs. > + if (priv->channels.ptp && > + !test_bit(MLX5E_PTP_STATE_RX, priv->channels.ptp->state)) { > + 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]; > + > + /* while iterating through all channels [0, stats_nch], there > + * are two cases to handle: > + * > + * 1. the channel is available, so sum only the unavailable TCs > + * [mlx5e_get_dcb_num_tc, max_opened_tc). > + * > + * 2. the channel is unavailable, so sum all TCs [0, max_opened_tc). > + */ Even if the channel is not available, mlx5e_get_queue_stats_tx() accesses and returns its stats. Here you need to only cover SQs that have no mapping in range [0..real_num_tx_queues - 1]. > + 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 (priv->tx_ptp_opened) { > + /* only report PTP TCs if it was opened but is now closed */ > + if (priv->channels.ptp && !test_bit(MLX5E_PTP_STATE_TX, priv->channels.ptp->state)) { > + for (tc = 0; tc < priv->channels.ptp->num_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); > @@ -5296,6 +5433,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;