From patchwork Tue Jun 4 00:46:25 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Damato X-Patchwork-Id: 13684514 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 A7F581FA5 for ; Tue, 4 Jun 2024 00:46:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717462010; cv=none; b=fvis40ogyt1XwnzWaKG/h5iv78woVUCtuObS6ea+lc6sJWR6ZQZmH2W5if3WBB2aUT8HDND8h+AaetVp2iGMMF5zdDAlck3uAFUaruUNIKHI/8QTu6M9Bpga2l7xV649EpGMok+4mZVh9b8Ol8ujryFuxG/WsOKzcIzZ1QoY9Io= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717462010; c=relaxed/simple; bh=vifrwv8yYRKvsytmY8Yg4L+M9MnG70MF7+heh32UiaU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=FUr4qzRoVg1PJqWhtJcsKKZRHa1N9BZzxZsAg506/f6FfQXsULg0fRr7EC/M/7IQ/NDS0wTn6K6u54GKFkRbz3BObyVOU3dFuqZb5y5erdHsQrgrBjdoYPfc6ekJie948mxShxEkK2ZtM2Mf/tKlXdRkpgbWe78wSVMRk54THw8= 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=tu3N44vG; arc=none smtp.client-ip=209.85.210.169 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b="tu3N44vG" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-70245b22365so2857346b3a.1 for ; Mon, 03 Jun 2024 17:46:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1717462007; x=1718066807; 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=26yx+OPnR88JIyyXlG7s80Xixo/lv0hmlHAIk2iBWII=; b=tu3N44vGker/sOFaYpTK3RAqvNT7N+dLjmUzDhY6NABFg8eCedMxGwper18EPk0I0n LhtHmzBX2P8PrLcrD7groBkikyTyhtvfLFetPjSv9S/eY/zSIddERl2U4ymQ/Z4VI9Wx MF3MlSOnbPEO/COSWTFZJa3ao1Ldj06ZjgXJA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717462007; x=1718066807; 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=26yx+OPnR88JIyyXlG7s80Xixo/lv0hmlHAIk2iBWII=; b=XLxvmp8y67cNgqjKaOm3cDht7uIlu7CfN7e7DiM3N5iPMnXqaozJdgUCHHstsWuIjx AMpVOK0LqLo9haLRlRaOZGi1Nm/GjouAbaA+swE2EiKWf/O0bJYBUtlJA8jQ0ZSJnoHu LghgfFUbS70AxUap3XjxzRcbDuoIrUTJjorB4Ir4bMFKKk+UeyCas+HUwbXHIrxQgWDD 7o6MBcEV+uLHgOc93XQISFq1FwJ8sOKBitdeiHS2xKz3ddQMG1Yrd8xznFjTSZq+kIiV 7l0/8x0li+U4BKx3YwZEj84gk8AMWcU0Kv7vSCEyclxOpbxf5payXfbwKtb1G+L9jyrC DLgQ== X-Gm-Message-State: AOJu0Ywr+8OQ9PYoMThUBPmxrLLuWW6MajATuEiX9z5Va9ElmttqYTV7 trSds7ypxdO4Lr1qpuQqQthVZc+01uDazosza4zl5Xb/d6W++RctnMYnxD9aHQ9IRi0vY9yUzeC bACechO35JayHE5V7qEisSaJ78k3u+GXQ/UCqEu+C7l1CSwSgKaQ2BWi+rL5syW9m5MMLXqwFzl pMgXVwRkbFraICJmSDgj+LP8kiRDdVkMD6nVU= X-Google-Smtp-Source: AGHT+IEr3WgxVsBp2cu2Hcr4M8L3QkXw8rg3de27C+42+/pPUWvYV6ltTUE5rrNUpd+90siAM5y9Zg== X-Received: by 2002:a05:6a00:a14:b0:6ed:de70:5ef8 with SMTP id d2e1a72fcca58-702477bc028mr11249753b3a.6.1717462006990; Mon, 03 Jun 2024 17:46:46 -0700 (PDT) Received: from localhost.localdomain ([2620:11a:c019:0:65e:3115:2f58:c5fd]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70242c26067sm6049316b3a.218.2024.06.03.17.46.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Jun 2024 17:46:46 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: nalramli@fastly.com, Joe Damato , Saeed Mahameed , Leon Romanovsky , Tariq Toukan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Gal Pressman , Carolina Jubran , Naveen Mamindlapalli , linux-rdma@vger.kernel.org (open list:MELLANOX MLX5 core VPI driver) Subject: [RFC net-next v4 1/2] net/mlx5e: Add txq to sq stats mapping Date: Tue, 4 Jun 2024 00:46:25 +0000 Message-Id: <20240604004629.299699-2-jdamato@fastly.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240604004629.299699-1-jdamato@fastly.com> References: <20240604004629.299699-1-jdamato@fastly.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC mlx5 currently maps txqs to an sq via priv->txq2sq. It is useful to map txqs to sq_stats, as well, for direct access to stats. Add priv->txq2sq_stats and insert mappings. The mappings will be used next to tabulate stats information. Signed-off-by: Joe Damato --- drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 ++ drivers/net/ethernet/mellanox/mlx5/core/en/qos.c | 13 +++++++++++-- drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 11 ++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index e85fb71bf0b4..4ae3eee3940c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -885,6 +885,8 @@ struct mlx5e_priv { /* priv data path fields - start */ struct mlx5e_selq selq; struct mlx5e_txqsq **txq2sq; + struct mlx5e_sq_stats **txq2sq_stats; + #ifdef CONFIG_MLX5_CORE_EN_DCB struct mlx5e_dcbx_dp dcbx_dp; #endif diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/qos.c b/drivers/net/ethernet/mellanox/mlx5/core/en/qos.c index 6743806b8480..e89272a5d036 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/qos.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/qos.c @@ -170,6 +170,7 @@ int mlx5e_activate_qos_sq(void *data, u16 node_qid, u32 hw_id) mlx5e_tx_disable_queue(netdev_get_tx_queue(priv->netdev, qid)); priv->txq2sq[qid] = sq; + priv->txq2sq_stats[qid] = sq->stats; /* Make the change to txq2sq visible before the queue is started. * As mlx5e_xmit runs under a spinlock, there is an implicit ACQUIRE, @@ -186,6 +187,7 @@ int mlx5e_activate_qos_sq(void *data, u16 node_qid, u32 hw_id) void mlx5e_deactivate_qos_sq(struct mlx5e_priv *priv, u16 qid) { struct mlx5e_txqsq *sq; + u16 mlx5e_qid; sq = mlx5e_get_qos_sq(priv, qid); if (!sq) /* Handle the case when the SQ failed to open. */ @@ -194,7 +196,10 @@ void mlx5e_deactivate_qos_sq(struct mlx5e_priv *priv, u16 qid) qos_dbg(sq->mdev, "Deactivate QoS SQ qid %u\n", qid); mlx5e_deactivate_txqsq(sq); - priv->txq2sq[mlx5e_qid_from_qos(&priv->channels, qid)] = NULL; + mlx5e_qid = mlx5e_qid_from_qos(&priv->channels, qid); + + priv->txq2sq[mlx5e_qid] = NULL; + priv->txq2sq_stats[mlx5e_qid] = NULL; /* Make the change to txq2sq visible before the queue is started again. * As mlx5e_xmit runs under a spinlock, there is an implicit ACQUIRE, @@ -325,6 +330,7 @@ void mlx5e_qos_deactivate_queues(struct mlx5e_channel *c) { struct mlx5e_params *params = &c->priv->channels.params; struct mlx5e_txqsq __rcu **qos_sqs; + u16 mlx5e_qid; int i; qos_sqs = mlx5e_state_dereference(c->priv, c->qos_sqs); @@ -342,8 +348,11 @@ void mlx5e_qos_deactivate_queues(struct mlx5e_channel *c) qos_dbg(c->mdev, "Deactivate QoS SQ qid %u\n", qid); mlx5e_deactivate_txqsq(sq); + mlx5e_qid = mlx5e_qid_from_qos(&c->priv->channels, qid); + /* The queue is disabled, no synchronization with datapath is needed. */ - c->priv->txq2sq[mlx5e_qid_from_qos(&c->priv->channels, qid)] = NULL; + c->priv->txq2sq[mlx5e_qid] = NULL; + c->priv->txq2sq_stats[mlx5e_qid] = NULL; } } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index c53c99dde558..d03fd1c98eb6 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -3111,6 +3111,7 @@ static void mlx5e_build_txq_maps(struct mlx5e_priv *priv) struct mlx5e_txqsq *sq = &c->sq[tc]; priv->txq2sq[sq->txq_ix] = sq; + priv->txq2sq_stats[sq->txq_ix] = sq->stats; } } @@ -3125,6 +3126,7 @@ static void mlx5e_build_txq_maps(struct mlx5e_priv *priv) struct mlx5e_txqsq *sq = &c->ptpsq[tc].txqsq; priv->txq2sq[sq->txq_ix] = sq; + priv->txq2sq_stats[sq->txq_ix] = sq->stats; } out: @@ -5824,9 +5826,13 @@ int mlx5e_priv_init(struct mlx5e_priv *priv, if (!priv->txq2sq) goto err_destroy_workqueue; + priv->txq2sq_stats = kcalloc_node(num_txqs, sizeof(*priv->txq2sq_stats), GFP_KERNEL, node); + if (!priv->txq2sq_stats) + goto err_free_txq2sq; + priv->tx_rates = kcalloc_node(num_txqs, sizeof(*priv->tx_rates), GFP_KERNEL, node); if (!priv->tx_rates) - goto err_free_txq2sq; + goto err_free_txq2sq_stats; priv->channel_stats = kcalloc_node(nch, sizeof(*priv->channel_stats), GFP_KERNEL, node); @@ -5837,6 +5843,8 @@ int mlx5e_priv_init(struct mlx5e_priv *priv, err_free_tx_rates: kfree(priv->tx_rates); +err_free_txq2sq_stats: + kfree(priv->txq2sq_stats); err_free_txq2sq: kfree(priv->txq2sq); err_destroy_workqueue: @@ -5860,6 +5868,7 @@ void mlx5e_priv_cleanup(struct mlx5e_priv *priv) kvfree(priv->channel_stats[i]); kfree(priv->channel_stats); kfree(priv->tx_rates); + kfree(priv->txq2sq_stats); kfree(priv->txq2sq); destroy_workqueue(priv->wq); mlx5e_selq_cleanup(&priv->selq); From patchwork Tue Jun 4 00:46:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Damato X-Patchwork-Id: 13684515 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) (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 13D29611B for ; Tue, 4 Jun 2024 00:46:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717462011; cv=none; b=OTXMy69H6pjenIJm8t4QYZGsRGRInjUVf17nOZgVrTQNepMl8XwVXkI/RHAXe08yAqUM6gI4BIvBwBtV86AD4ISO0ujvlCP0CyxnujM4mUfLdaphNRsoWhn6ft4IgE29kIWJqEl2bJIKoY1YHwuAubxmazHPSrbFyIxh82iCo+Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717462011; c=relaxed/simple; bh=xeCNQPpqwLr+yySpDhWmVdshfjNVE2u1ej0vOZenWDw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sOlvYib33YfUtIcpz1C0tdp5WrcvVwQxLCAL+BG1+Lq+vz9VxMgNDTph1y3Wcvu96K67AsW4BjCkulPR7OqTFw2U9ZEG+OMTjw85tc6iiEAXFsCT7VkK+CjHIkAMimRl8u9peC2cdAU1W4gkBzWTrGfMNBbEbshz7GvULxbEO+c= 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=LKpKY3TT; arc=none smtp.client-ip=209.85.210.175 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=fastly.com header.i=@fastly.com header.b="LKpKY3TT" Received: by mail-pf1-f175.google.com with SMTP id d2e1a72fcca58-702508bf0a9so2580070b3a.0 for ; Mon, 03 Jun 2024 17:46:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastly.com; s=google; t=1717462009; x=1718066809; 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=kRNmM+KNU8Jfr/J37h41UJmq3f6CvWN8UWrAkvJOyKs=; b=LKpKY3TTRqwQqFsY5o6UhHJgIL6KQEDy3ioMRKcqew7o6M+kUMtzSrObdvEc4L8Cv/ HmEFbFkpziIHejIZ9rjd5hlrifzID0AfpsTYsLa7y/mNTRtBvtH3UYhBuBbmdW0FWfRP aaa0pxVa6awqGAIEhCQZJNfH5vqxaPg0iaoIA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717462009; x=1718066809; 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=kRNmM+KNU8Jfr/J37h41UJmq3f6CvWN8UWrAkvJOyKs=; b=Ptqoihl7qPKDg3vVaMQCur7SQI94/yBk/Ned2Eku2uTxqMGkc5P3MWVEG92gisoecq g7IVJvfR9mer/U16JUdOYcVfXGCc605CfVkPp707LFiBrE8amAlwUWZWlit9SNSrdwYM V7BmRjA/ZwLH0KTrJwVSR5XupkukF+z90GZvUQpZE0h2c2OqfOqf/SifPV0zAP208EJZ IgHfel49KR8LHpfATxMFx4pKkaWLYAiKxUg1/cyWD+90Z7kSOhz3YZNXm+dhmYZ0Hzut 5bbfN94gObJGrem3YeQH6O6OCSWRVjh7FOBGXd4+HQdFTBeZl0GwBhycs7xhDuTOXCWt Pofg== X-Gm-Message-State: AOJu0Yw7ak3y9PqRj9cQtcMsVBjzuhS3tO4sxk20+WdS4weWtOUzMZ8m vGso0iyXp6ikWOfcDB1RpWECpjdCLB1RfflvYt45gAG0XENz02AjWb7C8LPdPm6GGsoGhCpI03j Gvid2n8CxR8yKKia1F3ar7v75NmFlJb/98RLq1YKuIwpy/Qi2RKUzBwZ0ZehM+DdJ0oDlpqBsJr UXSOKd9vhPqzwixL47BUYBkBm9NQZRbpSOy2w= X-Google-Smtp-Source: AGHT+IEtt9vVTnloDJp/tTG4M8U/kxRBbgMOjb/lWQirUf9WpmWYku7QfuorygLOTex+rFk0l3N6hQ== X-Received: by 2002:a05:6a20:3ca4:b0:1af:d9b1:5862 with SMTP id adf61e73a8af0-1b26f12dcd4mr12054725637.17.1717462008693; Mon, 03 Jun 2024 17:46:48 -0700 (PDT) Received: from localhost.localdomain ([2620:11a:c019:0:65e:3115:2f58:c5fd]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-70242c26067sm6049316b3a.218.2024.06.03.17.46.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Jun 2024 17:46:48 -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: [RFC net-next v4 2/2] net/mlx5e: Add per queue netdev-genl stats Date: Tue, 4 Jun 2024 00:46:26 +0000 Message-Id: <20240604004629.299699-3-jdamato@fastly.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240604004629.299699-1-jdamato@fastly.com> References: <20240604004629.299699-1-jdamato@fastly.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org X-Patchwork-State: RFC ./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 | 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) { + 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 + */ + 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). + */ + 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;