From nobody Sat Feb 7 18:21:31 2026 Received: from mail-yw1-f178.google.com (mail-yw1-f178.google.com [209.85.128.178]) (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 C78A1E56A for ; Tue, 28 Oct 2025 00:00:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609625; cv=none; b=ReO+8QYVdHG5mo6M3KSXILxhPHA9qlfp0e9+GOkErFiAAIdh29vgENo15+pJVBvkGpEGCsrcVMownAtPXB0nNaJJrEg3i8GWa0J2ZFx6Gxw0k0KuWRooMRern2EryvNuJWfNR7pHPvGAvxMzh3dR8LCCYjWOszBfZI1cWUwuzUY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609625; c=relaxed/simple; bh=4MYN7EAgWnSODODG6A19x6ijHGlK8gmMv8zjON/zh+s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=R6L8p4BjYL6OyEKOpH2vtj2apgobUg4mgN0VbvrI4JGoANkUcG4d2ZxlQI7IvFqIDC0GZ52zbUWj1o1o153gIIlrS3Cj0iVmcXpnmieQT4h96UnWZVATR2rdRzYfAx+fLVJ5wxRge2YYU6CUjJUXSrrKbUwShJuWUFU6t/5YY7Q= 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=K9WiNUHf; arc=none smtp.client-ip=209.85.128.178 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="K9WiNUHf" Received: by mail-yw1-f178.google.com with SMTP id 00721157ae682-78356c816fdso55122757b3.3 for ; Mon, 27 Oct 2025 17:00:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761609622; x=1762214422; 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=Fj6rW30AFi0w9W9uK7Qpyv8PnHs6M2XJTUrrQLC3IC8=; b=K9WiNUHfdiiz6D/lkx1HLgRx267AD//0INUAdkH7Td7OLjGTVsH2ZJEWfA69SbcUWD Q35Td94rykP5D7Nkjxdw3hm+2J7qJSMWb0t5dU/eiX72tD62kPJL6WBnOvRCj1JUbCMb 6DzJwcxxCNr0dsHGCzdiCLszyeydPtPnGerQRRrNXXyKxKQA96rCjB5bV+5TlYKSr7CE 8k9KMdC/d2DlLasBoRsAWrUMyZ5hRiIsJCmEAFcWc6VLFax/KRKLFx4gXmO/I+9JMiat 6X3pYxXoOLUXapMvlcJzXU+3gKKeyjUVrP0ptvjfXZNYdQEOEuOI3zXtvNV7UxLlTEbx M51g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761609622; x=1762214422; 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=Fj6rW30AFi0w9W9uK7Qpyv8PnHs6M2XJTUrrQLC3IC8=; b=K/2tBb8WJoU6h28A3RHfoHPmKus6C3dUox3eFvOaayAYjEh9d4ec0Pq6yiI9ct1EmR Jogd7mt96LKGF7HAGKSWE+i9w32X0DRt0EIfLnBRekCIP8OtEV3jY/tmH6l8aZg5DAKa 8gPiWrAhhAvCQB3perif2Dr7i3z6sZc9Kn06tRP834OQlmSKfLMRn6+1gGB0BCgOfxVz hJL1YswydB6SCv2sRTYBNbZNxPN8Meaqu6UpwWEcAu1OilONI18DwG6108O3vV8D4AiY dQtgqVQX7Utag7F1My4Oo8N8D9EvBVSZ35wefBiEwU8RN3upNh3MbLFnDVD82Ihm/smy mNfA== X-Forwarded-Encrypted: i=1; AJvYcCXQG9RDeLnxy4AWil6rq4jpDaPG86TFZdCU+NAyuEA6MVGGsbzt8tt7Sw5dsgFIE51y51pAok/mdEaY/+U=@vger.kernel.org X-Gm-Message-State: AOJu0YzLHIGwdUnIClz5B1fZwrhuxuINz5lt9yCtumhigYc6oYS5wkk9 LtP4eaP1m+4IPUJRFQiDovFjiv7T+PYki8benpZYV7pOJQl+bt0OnkTj X-Gm-Gg: ASbGnctx+/F/fHGhAA9t26Yv79RGRKRP2yuHF+R9+TxCBd1zqQ9+hzHtM7ejVX6LD/l mV7H2oPuX0Lqf+Q41JoTCmeCkRQLSr9hZ+sRvAgF8U1ruQm8S4kFQf6Gzpfw0kf0XkANoBMHo3l /0//zJGWqJKhj4rIORKS03ZG+3WuVgrzcQBnydS4N1XN6dX89levMW2b+HZaGXh1yhJnr7Mcuoo vKUSzqpsWZAwoOA5I3S7dWC14fKhMDCSS1xIpm1Yyc5f5W6+ZiK79Q/XFuLzQEYwJFPDSdVbdq7 LMM+yoCYyHnMChmwuDOY8mw5R75ti/GoR9K4eh0YdaJJ0T0GTx9+2Ic1CMv1yrVJ7k/zbNlwHdu Hlk2zhosE5vDQhVnvjNzIDJyJV0j6k6UK4xJ4By3Bx/swCIH4gdQIiJDT0Mjt/Gd2/dKKtTY7/z CXGQp3gKECpmZMPvseHDkw X-Google-Smtp-Source: AGHT+IEtNhRbUqJpwZGM8HVJkKiz5qUA6NwVSOw0LZb3oruArjnuV5wMId10sJYQfZpsNjoZann6RA== X-Received: by 2002:a05:690c:8689:20b0:781:226c:533f with SMTP id 00721157ae682-78617e9f364mr15508417b3.20.1761609621624; Mon, 27 Oct 2025 17:00:21 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:50::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-785ed1423f5sm23187217b3.5.2025.10.27.17.00.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Oct 2025 17:00:21 -0700 (PDT) From: Daniel Zahka To: "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Donald Hunter , Andrew Lunn , Shuah Khan , Boris Pismenny , Saeed Mahameed , Leon Romanovsky , Tariq Toukan , Mark Bloch Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v2 1/5] psp: report basic stats from the core Date: Mon, 27 Oct 2025 17:00:12 -0700 Message-ID: <20251028000018.3869664-2-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251028000018.3869664-1-daniel.zahka@gmail.com> References: <20251028000018.3869664-1-daniel.zahka@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jakub Kicinski Track and report stats common to all psp devices from the core. A 'stale-event' is when the core marks the rx state of an active psp_assoc as incapable of authenticating psp encapsulated data. Signed-off-by: Jakub Kicinski Signed-off-by: Daniel Zahka --- Notes: v2: - don't return skb->len from psp_nl_get_stats_dumpit() on success and EMSGSIZE Documentation/netlink/specs/psp.yaml | 40 +++++++++++++++ include/net/psp/types.h | 9 ++++ include/uapi/linux/psp.h | 10 ++++ net/psp/psp-nl-gen.c | 19 +++++++ net/psp/psp-nl-gen.h | 2 + net/psp/psp_nl.c | 74 ++++++++++++++++++++++++++++ net/psp/psp_sock.c | 4 +- 7 files changed, 157 insertions(+), 1 deletion(-) diff --git a/Documentation/netlink/specs/psp.yaml b/Documentation/netlink/s= pecs/psp.yaml index 944429e5c9a8..914148221384 100644 --- a/Documentation/netlink/specs/psp.yaml +++ b/Documentation/netlink/specs/psp.yaml @@ -76,6 +76,28 @@ attribute-sets: name: spi doc: Security Parameters Index (SPI) of the association. type: u32 + - + name: stats + attributes: + - + name: dev-id + doc: PSP device ID. + type: u32 + checks: + min: 1 + - + name: key-rotations + type: uint + doc: | + Number of key rotations during the lifetime of the device. + Kernel statistic. + - + name: stale-events + type: uint + doc: | + Number of times a socket's Rx got shut down due to using + a key which went stale (fully rotated out). + Kernel statistic. =20 operations: list: @@ -177,6 +199,24 @@ operations: pre: psp-assoc-device-get-locked post: psp-device-unlock =20 + - + name: get-stats + doc: Get device statistics. + attribute-set: stats + do: + request: + attributes: + - dev-id + reply: &stats-all + attributes: + - dev-id + - key-rotations + - stale-events + pre: psp-device-get-locked + post: psp-device-unlock + dump: + reply: *stats-all + mcast-groups: list: - diff --git a/include/net/psp/types.h b/include/net/psp/types.h index 31cee64b7c86..5b0ccaac3882 100644 --- a/include/net/psp/types.h +++ b/include/net/psp/types.h @@ -59,6 +59,10 @@ struct psp_dev_config { * device key * @stale_assocs: associations which use a rotated out key * + * @stats: statistics maintained by the core + * @stats.rotations: See stats attr key-rotations + * @stats.stales: See stats attr stale-events + * * @rcu: RCU head for freeing the structure */ struct psp_dev { @@ -81,6 +85,11 @@ struct psp_dev { struct list_head prev_assocs; struct list_head stale_assocs; =20 + struct { + unsigned long rotations; + unsigned long stales; + } stats; + struct rcu_head rcu; }; =20 diff --git a/include/uapi/linux/psp.h b/include/uapi/linux/psp.h index 607c42c39ba5..31592760ad79 100644 --- a/include/uapi/linux/psp.h +++ b/include/uapi/linux/psp.h @@ -45,6 +45,15 @@ enum { PSP_A_KEYS_MAX =3D (__PSP_A_KEYS_MAX - 1) }; =20 +enum { + PSP_A_STATS_DEV_ID =3D 1, + PSP_A_STATS_KEY_ROTATIONS, + PSP_A_STATS_STALE_EVENTS, + + __PSP_A_STATS_MAX, + PSP_A_STATS_MAX =3D (__PSP_A_STATS_MAX - 1) +}; + enum { PSP_CMD_DEV_GET =3D 1, PSP_CMD_DEV_ADD_NTF, @@ -55,6 +64,7 @@ enum { PSP_CMD_KEY_ROTATE_NTF, PSP_CMD_RX_ASSOC, PSP_CMD_TX_ASSOC, + PSP_CMD_GET_STATS, =20 __PSP_CMD_MAX, PSP_CMD_MAX =3D (__PSP_CMD_MAX - 1) diff --git a/net/psp/psp-nl-gen.c b/net/psp/psp-nl-gen.c index 9fdd6f831803..73f8b06d66f0 100644 --- a/net/psp/psp-nl-gen.c +++ b/net/psp/psp-nl-gen.c @@ -47,6 +47,11 @@ static const struct nla_policy psp_tx_assoc_nl_policy[PS= P_A_ASSOC_SOCK_FD + 1] =3D [PSP_A_ASSOC_SOCK_FD] =3D { .type =3D NLA_U32, }, }; =20 +/* PSP_CMD_GET_STATS - do */ +static const struct nla_policy psp_get_stats_nl_policy[PSP_A_STATS_DEV_ID = + 1] =3D { + [PSP_A_STATS_DEV_ID] =3D NLA_POLICY_MIN(NLA_U32, 1), +}; + /* Ops table for psp */ static const struct genl_split_ops psp_nl_ops[] =3D { { @@ -99,6 +104,20 @@ static const struct genl_split_ops psp_nl_ops[] =3D { .maxattr =3D PSP_A_ASSOC_SOCK_FD, .flags =3D GENL_CMD_CAP_DO, }, + { + .cmd =3D PSP_CMD_GET_STATS, + .pre_doit =3D psp_device_get_locked, + .doit =3D psp_nl_get_stats_doit, + .post_doit =3D psp_device_unlock, + .policy =3D psp_get_stats_nl_policy, + .maxattr =3D PSP_A_STATS_DEV_ID, + .flags =3D GENL_CMD_CAP_DO, + }, + { + .cmd =3D PSP_CMD_GET_STATS, + .dumpit =3D psp_nl_get_stats_dumpit, + .flags =3D GENL_CMD_CAP_DUMP, + }, }; =20 static const struct genl_multicast_group psp_nl_mcgrps[] =3D { diff --git a/net/psp/psp-nl-gen.h b/net/psp/psp-nl-gen.h index 25268ed11fb5..5bc3b5d5a53e 100644 --- a/net/psp/psp-nl-gen.h +++ b/net/psp/psp-nl-gen.h @@ -28,6 +28,8 @@ int psp_nl_dev_set_doit(struct sk_buff *skb, struct genl_= info *info); int psp_nl_key_rotate_doit(struct sk_buff *skb, struct genl_info *info); int psp_nl_rx_assoc_doit(struct sk_buff *skb, struct genl_info *info); int psp_nl_tx_assoc_doit(struct sk_buff *skb, struct genl_info *info); +int psp_nl_get_stats_doit(struct sk_buff *skb, struct genl_info *info); +int psp_nl_get_stats_dumpit(struct sk_buff *skb, struct netlink_callback *= cb); =20 enum { PSP_NLGRP_MGMT, diff --git a/net/psp/psp_nl.c b/net/psp/psp_nl.c index 8aaca62744c3..f990cccbe99c 100644 --- a/net/psp/psp_nl.c +++ b/net/psp/psp_nl.c @@ -262,6 +262,7 @@ int psp_nl_key_rotate_doit(struct sk_buff *skb, struct = genl_info *info) psd->generation & ~PSP_GEN_VALID_MASK); =20 psp_assocs_key_rotated(psd); + psd->stats.rotations++; =20 nlmsg_end(ntf, (struct nlmsghdr *)ntf->data); genlmsg_multicast_netns(&psp_nl_family, dev_net(psd->main_netdev), ntf, @@ -503,3 +504,76 @@ int psp_nl_tx_assoc_doit(struct sk_buff *skb, struct g= enl_info *info) nlmsg_free(rsp); return err; } + +static int +psp_nl_stats_fill(struct psp_dev *psd, struct sk_buff *rsp, + const struct genl_info *info) +{ + void *hdr; + + hdr =3D genlmsg_iput(rsp, info); + if (!hdr) + return -EMSGSIZE; + + if (nla_put_u32(rsp, PSP_A_STATS_DEV_ID, psd->id) || + nla_put_uint(rsp, PSP_A_STATS_KEY_ROTATIONS, + psd->stats.rotations) || + nla_put_uint(rsp, PSP_A_STATS_STALE_EVENTS, psd->stats.stales)) + goto err_cancel_msg; + + genlmsg_end(rsp, hdr); + return 0; + +err_cancel_msg: + genlmsg_cancel(rsp, hdr); + return -EMSGSIZE; +} + +int psp_nl_get_stats_doit(struct sk_buff *skb, struct genl_info *info) +{ + struct psp_dev *psd =3D info->user_ptr[0]; + struct sk_buff *rsp; + int err; + + rsp =3D genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL); + if (!rsp) + return -ENOMEM; + + err =3D psp_nl_stats_fill(psd, rsp, info); + if (err) + goto err_free_msg; + + return genlmsg_reply(rsp, info); + +err_free_msg: + nlmsg_free(rsp); + return err; +} + +static int +psp_nl_stats_get_dumpit_one(struct sk_buff *rsp, struct netlink_callback *= cb, + struct psp_dev *psd) +{ + if (psp_dev_check_access(psd, sock_net(rsp->sk))) + return 0; + + return psp_nl_stats_fill(psd, rsp, genl_info_dump(cb)); +} + +int psp_nl_get_stats_dumpit(struct sk_buff *rsp, struct netlink_callback *= cb) +{ + struct psp_dev *psd; + int err =3D 0; + + mutex_lock(&psp_devs_lock); + xa_for_each_start(&psp_devs, cb->args[0], psd, cb->args[0]) { + mutex_lock(&psd->lock); + err =3D psp_nl_stats_get_dumpit_one(rsp, cb, psd); + mutex_unlock(&psd->lock); + if (err) + break; + } + mutex_unlock(&psp_devs_lock); + + return err; +} diff --git a/net/psp/psp_sock.c b/net/psp/psp_sock.c index a931d825d1cc..f785672b7df6 100644 --- a/net/psp/psp_sock.c +++ b/net/psp/psp_sock.c @@ -253,8 +253,10 @@ void psp_assocs_key_rotated(struct psp_dev *psd) /* Mark the stale associations as invalid, they will no longer * be able to Rx any traffic. */ - list_for_each_entry_safe(pas, next, &psd->prev_assocs, assocs_list) + list_for_each_entry_safe(pas, next, &psd->prev_assocs, assocs_list) { pas->generation |=3D ~PSP_GEN_VALID_MASK; + psd->stats.stales++; + } list_splice_init(&psd->prev_assocs, &psd->stale_assocs); list_splice_init(&psd->active_assocs, &psd->prev_assocs); =20 --=20 2.47.3 From nobody Sat Feb 7 18:21:31 2026 Received: from mail-yx1-f51.google.com (mail-yx1-f51.google.com [74.125.224.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 3AC4635940 for ; Tue, 28 Oct 2025 00:00:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609625; cv=none; b=YTqlAUb2R66H0v7g4fnfYQiTnpa2nmOFcL2GOOarQs3sKd5m1OSquNC/qmj1YSGSqjJZd2EGdnDKH2d9XM2FJRJsgNsRwFGR5UpWfjvDeQwhutN42x5rIYhoJHIAZi5I6FO2fxx4vUSQOTWEcIdq/UqGP5Opa/c4WcWvBSodMeY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609625; c=relaxed/simple; bh=bcETCkepaF74e7lPUMskBIH6KkDLfN5id3lvNhxFZ9M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r/npJ0UDjeDVfkwW8sTdZeJ9JQ+yOmgA+yhKsnHgd447ojkrOFSfBMrfiJWNZqdsI5VNz4eAfZPzmV1BMJWVzH9fJkvPhbsCANBgzQMEv/l0WMzRGE6+eTqZuJDw1XLF8s/SRG/BRkVsA8977zzJ3kJmiS0Abcqdz1UKvJCYUzs= 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=LWVGCeLX; arc=none smtp.client-ip=74.125.224.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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LWVGCeLX" Received: by mail-yx1-f51.google.com with SMTP id 956f58d0204a3-63e16fbdd50so5005185d50.2 for ; Mon, 27 Oct 2025 17:00:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761609623; x=1762214423; 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=/hXmhTJZAlfrfDbx5/TiDoR6puyEL1cB+IP+R3Vobds=; b=LWVGCeLXfF1jJPfpWH9nlwfD9/8dVFUUr0vaLTfLZb1ouBFs2JGsaiVG10UN/7B/WJ xJjm5DLAL7GSZIxNCF8jfs4G4axwLR8/sRkxR7SXnwxAEggqpphSt5pzZXFUyMK5DBL2 GjTFZX9ISxEa7T7oO9DcCtHbbU01DM9WwkTiVf7TXSbqLTyUKYZQTnbTuj3JAcKjYnZf 0XbCBDh61zkQM4Kaigkxa9zPziq+UELBy2zTcWb8VpanuKmRUAk1Dm+fbsuayJRXBIRD jhumMlpM/pZ3KDJgL3nyxWosUYF+81JzvVrRYWm0CIzq+APir7pFhH/Pf7xSIeZKUk/P gT7Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761609623; x=1762214423; 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=/hXmhTJZAlfrfDbx5/TiDoR6puyEL1cB+IP+R3Vobds=; b=irpMbla45FQYmfSNNEqDYpPguJ7kAgqS0wmXHEnj5X5iEDfpultaF32ZTE5QUkbJcX ZPt6ly1GO6JLupdhCRNfCRzISOk/M22zj4mwPNf+Q1Iuz3NAwJs/7z2r+648djLCMN1F w7tSDRQzae3UxS0p2jidc82FsgGOIjFVrrrdHGVZkHnFwYSax8tfosQ3U5w1E0p41jDG FlMuxuniOoP6r7SbS5h5JWxrrBMLijbjKLK7LIhZygp5prhY2CtfXTk0XvHpKR/vQqgk AX541L7qGV5gx2AEm/5OrF7TvaMXQfg3eOl5NjPgPfeahau4sEECm41YuOhtQEjYjJ38 0PaQ== X-Forwarded-Encrypted: i=1; AJvYcCXMong6fZh7DHONBdqM1kDQ52D3z06ytZLBWzqbSzLxYXRxvvhhz8MHCfW5DHlZTL5t3k8dhkXEiVOigOk=@vger.kernel.org X-Gm-Message-State: AOJu0YyEdrZVWI99+3Gm5H1gYP+3Z2KGl12gmCDb9Vg3SwVAIIQkE6m6 cH/xA4Dsk1YzHV2+EDKwwoihqQGq8ovr7QQ2e0HYW+hCrm2f1mJGNBTh X-Gm-Gg: ASbGnct2qFqKmllj54s6c33orrtL0gm+CVbFw1Ok0RBPISTAjlD27ANVSIItvHsk7e8 safJPSm9wZr3IIUZRVToUasEDjL3Q2cihE0jbwdg/AJSx7wltKj7sodzf5vI8O1VVc+WcqpjDLX HCaWHsjTb4Z5xkhyB974HSlDOTLHL2rGkGJN7O1OcgXHCx+FvQfPf5dr3kR9dQg5dU4IZ/+eprw Ya+FedvlukxxE66v9HltTYhcKamRnKEK4hQ5r3jcfjewzMkyHx28sCSC0GfCo8ZQ0jz5yV74+HI H3HB8hp2euxXPm7yY3R3J3GtDrBZy/ZIdC3ZnbWa9Ch2RgpHPjdfMybmFsv0ZaKFMXNTQgfOr67 weYhI8+i2RV23qmou1zk6XKPIzym9DgVWELpUf7li2sYVSqm/bbB9RFxNwcZvqef8hCvbPmUP9e h8jwbKcepzYEBXfb1LYpg= X-Google-Smtp-Source: AGHT+IFM7FoSp+6n8D1h1RGRzyioBT8sthh2seeo+TigunDqVeBpnwtLnUyA0CdAXQqwjeY66Eaicw== X-Received: by 2002:a05:690e:1652:b0:63e:a2b:70db with SMTP id 956f58d0204a3-63f6b9ee47amr1322903d50.27.1761609623183; Mon, 27 Oct 2025 17:00:23 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:9::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-63f4c3cc4a1sm2776554d50.11.2025.10.27.17.00.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Oct 2025 17:00:22 -0700 (PDT) From: Daniel Zahka To: "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Donald Hunter , Andrew Lunn , Shuah Khan , Boris Pismenny , Saeed Mahameed , Leon Romanovsky , Tariq Toukan , Mark Bloch Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v2 2/5] selftests: drv-net: psp: add assertions on core-tracked psp dev stats Date: Mon, 27 Oct 2025 17:00:13 -0700 Message-ID: <20251028000018.3869664-3-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251028000018.3869664-1-daniel.zahka@gmail.com> References: <20251028000018.3869664-1-daniel.zahka@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add assertions to existing test cases to cover key rotations and 'stale-events'. Signed-off-by: Daniel Zahka --- tools/testing/selftests/drivers/net/psp.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/testing/selftests/drivers/net/psp.py b/tools/testing/sel= ftests/drivers/net/psp.py index 4ae7a785ff10..06559ef49b9a 100755 --- a/tools/testing/selftests/drivers/net/psp.py +++ b/tools/testing/selftests/drivers/net/psp.py @@ -109,6 +109,10 @@ def _check_data_outq(s, exp_len, force_wait=3DFalse): time.sleep(0.01) ksft_eq(outq, exp_len) =20 + +def _get_stat(cfg, key): + return cfg.pspnl.get_stats({'dev-id': cfg.psp_dev_id})[key] + # # Test case boiler plate # @@ -171,11 +175,16 @@ def dev_rotate(cfg): """ Test key rotation """ _init_psp_dev(cfg) =20 + prev_rotations =3D _get_stat(cfg, 'key-rotations') + rot =3D cfg.pspnl.key_rotate({"id": cfg.psp_dev_id}) ksft_eq(rot['id'], cfg.psp_dev_id) rot =3D cfg.pspnl.key_rotate({"id": cfg.psp_dev_id}) ksft_eq(rot['id'], cfg.psp_dev_id) =20 + cur_rotations =3D _get_stat(cfg, 'key-rotations') + ksft_eq(cur_rotations, prev_rotations + 2) + =20 def dev_rotate_spi(cfg): """ Test key rotation and SPI check """ @@ -475,6 +484,7 @@ def data_stale_key(cfg): """ Test send on a double-rotated key """ _init_psp_dev(cfg) =20 + prev_stale =3D _get_stat(cfg, 'stale-events') s =3D _make_psp_conn(cfg) try: rx_assoc =3D cfg.pspnl.rx_assoc({"version": 0, @@ -495,6 +505,9 @@ def data_stale_key(cfg): cfg.pspnl.key_rotate({"id": cfg.psp_dev_id}) cfg.pspnl.key_rotate({"id": cfg.psp_dev_id}) =20 + cur_stale =3D _get_stat(cfg, 'stale-events') + ksft_gt(cur_stale, prev_stale) + s.send(b'0123456789' * 200) _check_data_outq(s, 2000, force_wait=3DTrue) finally: --=20 2.47.3 From nobody Sat Feb 7 18:21:31 2026 Received: from mail-yw1-f171.google.com (mail-yw1-f171.google.com [209.85.128.171]) (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 6B71A19F121 for ; Tue, 28 Oct 2025 00:00:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609627; cv=none; b=mXK/6XiUwk1S59siZFO9LvVY4Zy/ehDQvJtbnK0FOD51RcebDt54/gv9eU9jq47iyNyHFoXy2fjTa1U8FNX3bjsSkn+b7kMFh0+wiG0ZXUhm1LRyYTO+c4Z8PPOan65X/22WMYKoElYpg9ZFX7ytNADIUR2s0VBXsvNq+AqcKdw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609627; c=relaxed/simple; bh=wpjBIJ6UQ1SC2AMlricidu0TF3ztCZv3T7Z+LEo/Juk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o5ExZMlOQyGrObWz4cZ1FLEch1dE3+yPt6w9AyGGekS87nrYXJFj2ZRwy/8SmwKROdooqjm8npA9yrDvS214HJvDt3hhYtQohJNW12BjjOij8EFJ4Pbewk9tF1uKIR/ATfdO3CHM4e7UFQ+AkJbllRov9+ByrbEpApsQjS1NfSk= 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=hL+x3IQs; arc=none smtp.client-ip=209.85.128.171 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hL+x3IQs" Received: by mail-yw1-f171.google.com with SMTP id 00721157ae682-78488cdc20aso69091307b3.1 for ; Mon, 27 Oct 2025 17:00:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761609624; x=1762214424; 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=BdcFP1QaTsuTtBulUqx+7dg8/rJFCvHWDJDP1RMUy/E=; b=hL+x3IQs87sfJiHmHGrx/RlLsIkv0XGwd4vPsRUVSYPcfb+gBXyfk/LTa67ay5yTHk ZoOMRr8kD0Tli/xCM6i+FHZ6qlroUUjiUxueAMWBxfwe01+mKYVQ+ExzuuJfzcGL3vAB UcFeyLORKswXbt9HdI2bpXM9fEYru6kHd8+9vUqH9+URwf8HcvbI7ZHKpMH1Lbd3/ZGf AIk+09kPFCkrZh7PuMcBev9iqBY4JB7Rmjnjo5awpk5STnjgKPmDNkA39QkHI6rcGJa9 4GishBuSS8u5kaBrkO06SDiGiJBm9EeIt+UQgldBeIYYzkYqISPk1ds4C/xrfdnJbL4w f3LA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761609624; x=1762214424; 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=BdcFP1QaTsuTtBulUqx+7dg8/rJFCvHWDJDP1RMUy/E=; b=C/zUEDmEHDjwSVKpPvYs1fnUcmEx884V69iRnprWd3iH1/4f0TzGpjyvot394OF7X5 095ZgQwtBNpsacv/SAJZEsTPRLueXWjYxCZ9S4kxo5KncQm3LPZ1mw83a7vpAkmFxNYF 1yloo2EY9L6MrO1kZz7gWYU/ZZvi0muZU04iyYovOEigZQETQiNwlBTMlhPNVzIFwYcb 4K0aF3P0Th9G24MsydM/DBy8JSTJIiOlHgQhMPq/qpTko8pGVvmpthHps+oVo9q3hi8F 15tSeE3lnzp6on1IfYiq3o3OwECqt0weuORBEupRbx+ctlRSVwMICorHlkJJ6LhKVbYm OUmQ== X-Forwarded-Encrypted: i=1; AJvYcCX8orN4+8AkLazQVy+E9jIqShLC9PfTwiNEuGJFcuWIDN87CFs+Zq1WZOe7dItOzq1i01hqN9JjoaXBhiA=@vger.kernel.org X-Gm-Message-State: AOJu0YzzMbU7vKvVbvhvQug9tjQi8peyYBInp6jveX+YP+qC57HSPaQj +Pa2PEkxVeNxJsdT4Ksy2T9HyXif5d32Y8QwEElT715uy8hvCI+6Z3hy X-Gm-Gg: ASbGncuZFg8IAWxXMXZKdqamDsHIArn1ZojOZ/gw8vQ3IR9bd+xP2+OO9IQpTVaK4gQ O7PV9BnUKl6L3lf7kG0XwBPu+6TozyjWUBo5EjEPGsHFbyPPalY4bNlfSm8BGuMcegeVbBKmwm0 SfU6qqb39Lsn2ITZeqgexFp4KJCJ0YU+mWJgZpaHlwAfcbS31fb4QZl1ZawxW3s/GQ9M6fK9hsr PN7H/O/J89VgZqEdrNUHz5TLDskRzuma7c/b3FCHsqTQwE5MarguSLKHV1HPyaaVshZdTXUKZo9 TviriseyHYsSQBuoHc6MDSkfXeqkLef4bb7ZHzHRdWH4TVLdJP+Kl2cfGJcINJ+sOakN6QsOBqX CFuPrEmiM/FZzunpK+cje27mBGrznHcPaI/VgDsmJ8vBfFGvr8TBpkKm++cQ33r0FPXk98kBu2t T6WkSECX2ezg== X-Google-Smtp-Source: AGHT+IGTW9A3v/Un7T75YSG+S6IX+bvGqsBHmZHbWNg2qRPduaM2qSRvFpbhNfTaxccwAUm5TJ/LXw== X-Received: by 2002:a05:690c:b05:b0:784:ab8d:4b97 with SMTP id 00721157ae682-786183b0968mr16539847b3.58.1761609624295; Mon, 27 Oct 2025 17:00:24 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:49::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-785ed196a0dsm23152787b3.27.2025.10.27.17.00.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Oct 2025 17:00:23 -0700 (PDT) From: Daniel Zahka To: "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Donald Hunter , Andrew Lunn , Shuah Khan , Boris Pismenny , Saeed Mahameed , Leon Romanovsky , Tariq Toukan , Mark Bloch Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v2 3/5] psp: add stats from psp spec to driver facing api Date: Mon, 27 Oct 2025 17:00:14 -0700 Message-ID: <20251028000018.3869664-4-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251028000018.3869664-1-daniel.zahka@gmail.com> References: <20251028000018.3869664-1-daniel.zahka@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jakub Kicinski Provide a driver api for reporting device statistics required by the "Implementation Requirements" section of the PSP Architecture Specification. Use a warning to ensure drivers report stats required by the spec. Signed-off-by: Jakub Kicinski Signed-off-by: Daniel Zahka --- Documentation/netlink/specs/psp.yaml | 55 ++++++++++++++++++++++++++++ include/net/psp/types.h | 26 +++++++++++++ include/uapi/linux/psp.h | 8 ++++ net/psp/psp_main.c | 3 +- net/psp/psp_nl.c | 22 ++++++++++- 5 files changed, 112 insertions(+), 2 deletions(-) diff --git a/Documentation/netlink/specs/psp.yaml b/Documentation/netlink/s= pecs/psp.yaml index 914148221384..f3a57782d2cf 100644 --- a/Documentation/netlink/specs/psp.yaml +++ b/Documentation/netlink/specs/psp.yaml @@ -98,6 +98,61 @@ attribute-sets: Number of times a socket's Rx got shut down due to using a key which went stale (fully rotated out). Kernel statistic. + - + name: rx-packets + type: uint + doc: | + Number of successfully processed and authenticated PSP packets. + Device statistic (from the PSP spec). + - + name: rx-bytes + type: uint + doc: | + Number of successfully authenticated PSP bytes received, countin= g from + the first byte after the IV through the last byte of payload. + The fixed initial portion of the PSP header (16 bytes) + and the PSP trailer/ICV (16 bytes) are not included in this coun= t. + Device statistic (from the PSP spec). + - + name: rx-auth-fail + type: uint + doc: | + Number of received PSP packets with unsuccessful authentication. + Device statistic (from the PSP spec). + - + name: rx-error + type: uint + doc: | + Number of received PSP packets with length/framing errors. + Device statistic (from the PSP spec). + - + name: rx-bad + type: uint + doc: | + Number of received PSP packets with miscellaneous errors + (invalid master key indicated by SPI, unsupported version, etc.) + Device statistic (from the PSP spec). + - + name: tx-packets + type: uint + doc: | + Number of successfully processed PSP packets for transmission. + Device statistic (from the PSP spec). + - + name: tx-bytes + type: uint + doc: | + Number of successfully processed PSP bytes for transmit, countin= g from + the first byte after the IV through the last byte of payload. + The fixed initial portion of the PSP header (16 bytes) + and the PSP trailer/ICV (16 bytes) are not included in this coun= t. + Device statistic (from the PSP spec). + - + name: tx-error + type: uint + doc: | + Number of PSP packets for transmission with errors. + Device statistic (from the PSP spec). =20 operations: list: diff --git a/include/net/psp/types.h b/include/net/psp/types.h index 5b0ccaac3882..1aa3857a85c1 100644 --- a/include/net/psp/types.h +++ b/include/net/psp/types.h @@ -150,6 +150,25 @@ struct psp_assoc { u8 drv_data[] __aligned(8); }; =20 +struct psp_dev_stats { + union { + struct { + u64 rx_packets; + u64 rx_bytes; + u64 rx_auth_fail; + u64 rx_error; + u64 rx_bad; + u64 tx_packets; + u64 tx_bytes; + u64 tx_error; + }; + DECLARE_FLEX_ARRAY(u64, required); + }; + char required_end[0]; + + /* optional stats would go here */ +}; + /** * struct psp_dev_ops - netdev driver facing PSP callbacks */ @@ -188,6 +207,13 @@ struct psp_dev_ops { * Remove an association from the device. */ void (*tx_key_del)(struct psp_dev *psd, struct psp_assoc *pas); + + /** + * @get_stats: get statistics from the device + * Stats required by the spec must be maintained and filled in. + * Stats must be filled in member-by-member, never memset the struct. + */ + void (*get_stats)(struct psp_dev *psd, struct psp_dev_stats *stats); }; =20 #endif /* __NET_PSP_H */ diff --git a/include/uapi/linux/psp.h b/include/uapi/linux/psp.h index 31592760ad79..d8449c043ba1 100644 --- a/include/uapi/linux/psp.h +++ b/include/uapi/linux/psp.h @@ -49,6 +49,14 @@ enum { PSP_A_STATS_DEV_ID =3D 1, PSP_A_STATS_KEY_ROTATIONS, PSP_A_STATS_STALE_EVENTS, + PSP_A_STATS_RX_PACKETS, + PSP_A_STATS_RX_BYTES, + PSP_A_STATS_RX_AUTH_FAIL, + PSP_A_STATS_RX_ERROR, + PSP_A_STATS_RX_BAD, + PSP_A_STATS_TX_PACKETS, + PSP_A_STATS_TX_BYTES, + PSP_A_STATS_TX_ERROR, =20 __PSP_A_STATS_MAX, PSP_A_STATS_MAX =3D (__PSP_A_STATS_MAX - 1) diff --git a/net/psp/psp_main.c b/net/psp/psp_main.c index 481aaf0fc9fc..a8534124f626 100644 --- a/net/psp/psp_main.c +++ b/net/psp/psp_main.c @@ -60,7 +60,8 @@ psp_dev_create(struct net_device *netdev, !psd_ops->key_rotate || !psd_ops->rx_spi_alloc || !psd_ops->tx_key_add || - !psd_ops->tx_key_del)) + !psd_ops->tx_key_del || + !psd_ops->get_stats)) return ERR_PTR(-EINVAL); =20 psd =3D kzalloc(sizeof(*psd), GFP_KERNEL); diff --git a/net/psp/psp_nl.c b/net/psp/psp_nl.c index f990cccbe99c..1bace9731d3c 100644 --- a/net/psp/psp_nl.c +++ b/net/psp/psp_nl.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only =20 +#include #include #include #include @@ -509,7 +510,18 @@ static int psp_nl_stats_fill(struct psp_dev *psd, struct sk_buff *rsp, const struct genl_info *info) { + const unsigned int required_cnt =3D offsetof(struct psp_dev_stats, + required_end) / sizeof(u64); + struct psp_dev_stats stats; void *hdr; + int i; + + memset(&stats, 0xff, sizeof(stats)); + psd->ops->get_stats(psd, &stats); + + for (i =3D 0; i < required_cnt; i++) + if (WARN_ON_ONCE(stats.required[i] =3D=3D ETHTOOL_STAT_NOT_SET)) + return -EOPNOTSUPP; =20 hdr =3D genlmsg_iput(rsp, info); if (!hdr) @@ -518,7 +530,15 @@ psp_nl_stats_fill(struct psp_dev *psd, struct sk_buff = *rsp, if (nla_put_u32(rsp, PSP_A_STATS_DEV_ID, psd->id) || nla_put_uint(rsp, PSP_A_STATS_KEY_ROTATIONS, psd->stats.rotations) || - nla_put_uint(rsp, PSP_A_STATS_STALE_EVENTS, psd->stats.stales)) + nla_put_uint(rsp, PSP_A_STATS_STALE_EVENTS, psd->stats.stales) || + nla_put_uint(rsp, PSP_A_STATS_RX_PACKETS, stats.rx_packets) || + nla_put_uint(rsp, PSP_A_STATS_RX_BYTES, stats.rx_bytes) || + nla_put_uint(rsp, PSP_A_STATS_RX_AUTH_FAIL, stats.rx_auth_fail) || + nla_put_uint(rsp, PSP_A_STATS_RX_ERROR, stats.rx_error) || + nla_put_uint(rsp, PSP_A_STATS_RX_BAD, stats.rx_bad) || + nla_put_uint(rsp, PSP_A_STATS_TX_PACKETS, stats.tx_packets) || + nla_put_uint(rsp, PSP_A_STATS_TX_BYTES, stats.tx_bytes) || + nla_put_uint(rsp, PSP_A_STATS_TX_ERROR, stats.tx_error)) goto err_cancel_msg; =20 genlmsg_end(rsp, hdr); --=20 2.47.3 From nobody Sat Feb 7 18:21:31 2026 Received: from mail-yx1-f41.google.com (mail-yx1-f41.google.com [74.125.224.41]) (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 B82094C6D for ; Tue, 28 Oct 2025 00:00:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609629; cv=none; b=lvRpymTNJKQaQHHWUnU2l3o0JwlfUsTtbpTm8s8oP9mBntjVxSKQBW1seAmC/DncR43AxkFRQ+scJz/DbZUxu0hQK0NTY7CS7azh+OvcmL9NeoZ12I/BIieb+tSZGEoi5gMGM0xV2yYOLXvoi+ne4v2mWDYkTIqzDKeYQH5mBRc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609629; c=relaxed/simple; bh=QR2dtsbS7UwluGoSZW4mLmSa/tnfkqCojkKtoHA71rU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oJVq2OBA5WwyPoJJq1Sasf+7Abnt3FIc+PX5K4RvGSXvXKRQit+gDdf/TP504jvtKK72NaDVxVItYCUG0dKOl0Hb3IU5O2SKtrYxSaF5C+VoLJ2Pr32ElqUqt8m/ysE5q2npK7Js9BLI6NNVsEhljmBvGralXPFv1ZXwF2OGitI= 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=Yz/QIiZW; arc=none smtp.client-ip=74.125.224.41 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Yz/QIiZW" Received: by mail-yx1-f41.google.com with SMTP id 956f58d0204a3-63bcfcb800aso5997685d50.0 for ; Mon, 27 Oct 2025 17:00:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761609627; x=1762214427; 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=DMiDZHWOUNK2yHGSlay4OKVr5nHbaNPUDwYp1k2lS6U=; b=Yz/QIiZWGNc8zZlN7kool5axIpfZgG/weDQIYGf6ilgaZgJ++IbpDXKCXiKCVXgKK2 oEomLjNQkYroF+u39jE2veVpfiT0aKLplM/8wMUwgop1JHkelsNoHrKuYMo80+L/W5Hn 7I3jekg3qRQVtgALHU80gaRQfZe8CN5XWOzMfIduAmR48FmM8ag59CWhHYc0Yol3/Gnr BnGQ8ZSW32jCzvoj2ajUQUb8RdsaaXAZAMcVHX/q2Ym9BVMFaUEY4B5l4xfYHuw6NDnQ N5M8XDWO32449i9D07YxxDkdIQvMl6LOh2ehHcK89Ln10Z2svF6ob/JroSVc2m8ly5EN /Atg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761609627; x=1762214427; 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=DMiDZHWOUNK2yHGSlay4OKVr5nHbaNPUDwYp1k2lS6U=; b=OqSDxx/rTOK1pyZqHFe/jnTphD2R/1KYOllDE60P1E/T+3bVMHaeCw0MWBuwqzG8of I/hW0D+iz68Oi55DkM6n0KiyP4ap2jcGqIGdx0Zlsu7wf2KgEr2soaauG9la+RfrUaYS ZK5Uj9ZAQgwheNdYEs6oWTnWHjgPKENpF4+kspGdtfAtj2HMkV8klgGhDuS+xeytKcPO SMxE+ird91xs52swHU/FE5HPbKSGexeGqAeoSqBU8wLiHBkZj0qhBhf28bxtOuY7LNqJ BhKRpjNaASnrZoIyRPJ//u/SnXy+Ic1ihriBWYUWy6chtqxFsMFh4lHXjytj9Sy/Chas oq3w== X-Forwarded-Encrypted: i=1; AJvYcCVAb7MQhMk5wq+Eqbvhqtc3nQsz77LT4c0D9Y9KbeNf/7KUN0fi2zQZ8frJhve6Fn0+9ZrSQ8oIXMgqlq4=@vger.kernel.org X-Gm-Message-State: AOJu0YxUsRH52GyEfhIJM2eQzI4MSlWsDoDopO4ILbk/0Q5f81Ei0swu hkb1tv0uXkcVjOYklm0Em99U/LhaJOpJZAlEuzW4QPVxNKhAILWsJxwJ X-Gm-Gg: ASbGncvPfE/hK/svgw6rGSF/L/T/gYSTmVRoJJizOnMh2zrIhzZK+nov/iEcXRWEwlZ id3gCg+tS53Pbwai4KYQIOcjIElnWbKFhmgyAOxISwmtae/E2BKLfHm9vXXtxGQ8hXbRblk613Z i3kEDrr/9g/IkLSnyM+JbItjSUrkbI1gI8gIrG8yy77EccuEvLyaDjRpv89j5SgtZkQK3tYch1f g3Bra+eiTNtAcZad3Gc7x8C1rNivIhG5G7FzgBIDXUXUQHGy8pCPbXbZ8bHZVN5wnFUeftK3Tic GNzI84xA4gY0CHpAazmKiA0QcsrDe7dB1Qxc1F7vsSwY07PGYKm4m/WPb9vkXVqE8Q5csA66GGc /eBfiVWQb7llKtnMIwKGaJG9huzsafBqM9wp5hjtcQVnsDolCvgU+xy+yRUwj5NrwWeCFm0pHuS 2olfh7fXJIhg== X-Google-Smtp-Source: AGHT+IEzvoGO/9PCP63+vtMrinkWY9/WHwpDM4iVV3uWfF7XFeKpTw+b5i5D6o4Fr6kqDpK+dhVDzQ== X-Received: by 2002:a05:690e:d08:b0:63c:e90c:a6dc with SMTP id 956f58d0204a3-63f6b9b17c4mr1840582d50.8.1761609626416; Mon, 27 Oct 2025 17:00:26 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:72::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-785ed1bf36dsm23135087b3.42.2025.10.27.17.00.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Oct 2025 17:00:25 -0700 (PDT) From: Daniel Zahka To: "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Donald Hunter , Andrew Lunn , Shuah Khan , Boris Pismenny , Saeed Mahameed , Leon Romanovsky , Tariq Toukan , Mark Bloch Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v2 4/5] net/mlx5e: Add PSP stats support for Rx/Tx flows Date: Mon, 27 Oct 2025 17:00:15 -0700 Message-ID: <20251028000018.3869664-5-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251028000018.3869664-1-daniel.zahka@gmail.com> References: <20251028000018.3869664-1-daniel.zahka@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Jakub Kicinski Add all statistics described under the "Implementation Requirements" section of the PSP Architecture Specification: Rx successfully decrypted PSP packets: psp_rx_pkts : Number of packets decrypted successfully psp_rx_bytes : Number of bytes decrypted successfully Rx PSP authentication failure statistics: psp_rx_pkts_auth_fail : Number of PSP packets that failed authentication psp_rx_bytes_auth_fail : Number of PSP bytes that failed authentication Rx PSP bad frame error statistics: psp_rx_pkts_frame_err; psp_rx_bytes_frame_err; Rx PSP drop statistics: psp_rx_pkts_drop : Number of PSP packets dropped psp_rx_bytes_drop : Number of PSP bytes dropped Tx successfully encrypted PSP packets: psp_tx_pkts : Number of packets encrypted successfully psp_tx_bytes : Number of bytes encrypted successfully Tx drops: tx_drop : Number of misc psp related drops The above can be seen using the ynl cli: ./pyynl/cli.py --spec netlink/specs/psp.yaml --dump get-stats Signed-off-by: Jakub Kicinski Signed-off-by: Raed Salem Signed-off-by: Rahul Rameshbabu Signed-off-by: Daniel Zahka --- Notes: v2: - use %pe to print PTR_ERR() .../mellanox/mlx5/core/en_accel/psp.c | 239 ++++++++++++++++-- .../mellanox/mlx5/core/en_accel/psp.h | 18 ++ .../mellanox/mlx5/core/en_accel/psp_rxtx.c | 1 + .../net/ethernet/mellanox/mlx5/core/en_main.c | 5 + 4 files changed, 248 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp.c b/drive= rs/net/ethernet/mellanox/mlx5/core/en_accel/psp.c index 8565cfe8d7dc..93a1ddfc7f8a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp.c @@ -28,12 +28,15 @@ struct mlx5e_psp_tx { struct mlx5_flow_handle *rule; struct mutex mutex; /* Protect PSP TX steering */ u32 refcnt; + struct mlx5_fc *tx_counter; }; =20 struct mlx5e_psp_rx_err { struct mlx5_flow_table *ft; struct mlx5_flow_handle *rule; - struct mlx5_flow_handle *drop_rule; + struct mlx5_flow_handle *auth_fail_rule; + struct mlx5_flow_handle *err_rule; + struct mlx5_flow_handle *bad_rule; struct mlx5_modify_hdr *copy_modify_hdr; }; =20 @@ -50,6 +53,10 @@ struct mlx5e_accel_fs_psp_prot { =20 struct mlx5e_accel_fs_psp { struct mlx5e_accel_fs_psp_prot fs_prot[ACCEL_FS_PSP_NUM_TYPES]; + struct mlx5_fc *rx_counter; + struct mlx5_fc *rx_auth_fail_counter; + struct mlx5_fc *rx_err_counter; + struct mlx5_fc *rx_bad_counter; }; =20 struct mlx5e_psp_fs { @@ -72,9 +79,19 @@ static enum mlx5_traffic_types fs_psp2tt(enum accel_fs_p= sp_type i) static void accel_psp_fs_rx_err_del_rules(struct mlx5e_psp_fs *fs, struct mlx5e_psp_rx_err *rx_err) { - if (rx_err->drop_rule) { - mlx5_del_flow_rules(rx_err->drop_rule); - rx_err->drop_rule =3D NULL; + if (rx_err->bad_rule) { + mlx5_del_flow_rules(rx_err->bad_rule); + rx_err->bad_rule =3D NULL; + } + + if (rx_err->err_rule) { + mlx5_del_flow_rules(rx_err->err_rule); + rx_err->err_rule =3D NULL; + } + + if (rx_err->auth_fail_rule) { + mlx5_del_flow_rules(rx_err->auth_fail_rule); + rx_err->auth_fail_rule =3D NULL; } =20 if (rx_err->rule) { @@ -117,6 +134,7 @@ static int accel_psp_fs_rx_err_add_rule(struct mlx5e_ps= p_fs *fs, { u8 action[MLX5_UN_SZ_BYTES(set_add_copy_action_in_auto)] =3D {}; struct mlx5_core_dev *mdev =3D fs->mdev; + struct mlx5_flow_destination dest[2]; struct mlx5_flow_act flow_act =3D {}; struct mlx5_modify_hdr *modify_hdr; struct mlx5_flow_handle *fte; @@ -147,10 +165,14 @@ static int accel_psp_fs_rx_err_add_rule(struct mlx5e_= psp_fs *fs, accel_psp_setup_syndrome_match(spec, PSP_OK); /* create fte */ flow_act.action =3D MLX5_FLOW_CONTEXT_ACTION_MOD_HDR | - MLX5_FLOW_CONTEXT_ACTION_FWD_DEST; + MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | + MLX5_FLOW_CONTEXT_ACTION_COUNT; flow_act.modify_hdr =3D modify_hdr; - fte =3D mlx5_add_flow_rules(rx_err->ft, spec, &flow_act, - &fs_prot->default_dest, 1); + dest[0].type =3D fs_prot->default_dest.type; + dest[0].ft =3D fs_prot->default_dest.ft; + dest[1].type =3D MLX5_FLOW_DESTINATION_TYPE_COUNTER; + dest[1].counter =3D fs->rx_fs->rx_counter; + fte =3D mlx5_add_flow_rules(rx_err->ft, spec, &flow_act, dest, 2); if (IS_ERR(fte)) { err =3D PTR_ERR(fte); mlx5_core_err(mdev, "fail to add psp rx err copy rule err=3D%d\n", err); @@ -158,22 +180,69 @@ static int accel_psp_fs_rx_err_add_rule(struct mlx5e_= psp_fs *fs, } rx_err->rule =3D fte; =20 - /* add default drop rule */ + /* add auth fail drop rule */ memset(spec, 0, sizeof(*spec)); memset(&flow_act, 0, sizeof(flow_act)); + accel_psp_setup_syndrome_match(spec, PSP_ICV_FAIL); /* create fte */ - flow_act.action =3D MLX5_FLOW_CONTEXT_ACTION_DROP; - fte =3D mlx5_add_flow_rules(rx_err->ft, spec, &flow_act, NULL, 0); + flow_act.action =3D MLX5_FLOW_CONTEXT_ACTION_DROP | + MLX5_FLOW_CONTEXT_ACTION_COUNT; + dest[0].type =3D MLX5_FLOW_DESTINATION_TYPE_COUNTER; + dest[0].counter =3D fs->rx_fs->rx_auth_fail_counter; + fte =3D mlx5_add_flow_rules(rx_err->ft, spec, &flow_act, dest, 1); if (IS_ERR(fte)) { err =3D PTR_ERR(fte); - mlx5_core_err(mdev, "fail to add psp rx err drop rule err=3D%d\n", err); + mlx5_core_err(mdev, "fail to add psp rx auth fail drop rule err=3D%d\n", + err); goto out_drop_rule; } - rx_err->drop_rule =3D fte; + rx_err->auth_fail_rule =3D fte; + + /* add framing drop rule */ + memset(spec, 0, sizeof(*spec)); + memset(&flow_act, 0, sizeof(flow_act)); + accel_psp_setup_syndrome_match(spec, PSP_BAD_TRAILER); + /* create fte */ + flow_act.action =3D MLX5_FLOW_CONTEXT_ACTION_DROP | + MLX5_FLOW_CONTEXT_ACTION_COUNT; + dest[0].type =3D MLX5_FLOW_DESTINATION_TYPE_COUNTER; + dest[0].counter =3D fs->rx_fs->rx_err_counter; + fte =3D mlx5_add_flow_rules(rx_err->ft, spec, &flow_act, dest, 1); + if (IS_ERR(fte)) { + err =3D PTR_ERR(fte); + mlx5_core_err(mdev, "fail to add psp rx framing err drop rule err=3D%d\n= ", + err); + goto out_drop_auth_fail_rule; + } + rx_err->err_rule =3D fte; + + /* add misc. errors drop rule */ + memset(spec, 0, sizeof(*spec)); + memset(&flow_act, 0, sizeof(flow_act)); + /* create fte */ + flow_act.action =3D MLX5_FLOW_CONTEXT_ACTION_DROP | + MLX5_FLOW_CONTEXT_ACTION_COUNT; + dest[0].type =3D MLX5_FLOW_DESTINATION_TYPE_COUNTER; + dest[0].counter =3D fs->rx_fs->rx_bad_counter; + fte =3D mlx5_add_flow_rules(rx_err->ft, spec, &flow_act, dest, 1); + if (IS_ERR(fte)) { + err =3D PTR_ERR(fte); + mlx5_core_err(mdev, "fail to add psp rx misc. err drop rule err=3D%d\n", + err); + goto out_drop_error_rule; + } + rx_err->bad_rule =3D fte; + rx_err->copy_modify_hdr =3D modify_hdr; =20 goto out_spec; =20 +out_drop_error_rule: + mlx5_del_flow_rules(rx_err->err_rule); + rx_err->err_rule =3D NULL; +out_drop_auth_fail_rule: + mlx5_del_flow_rules(rx_err->auth_fail_rule); + rx_err->auth_fail_rule =3D NULL; out_drop_rule: mlx5_del_flow_rules(rx_err->rule); rx_err->rule =3D NULL; @@ -461,6 +530,10 @@ static void accel_psp_fs_cleanup_rx(struct mlx5e_psp_f= s *fs) return; =20 accel_psp =3D fs->rx_fs; + mlx5_fc_destroy(fs->mdev, accel_psp->rx_bad_counter); + mlx5_fc_destroy(fs->mdev, accel_psp->rx_err_counter); + mlx5_fc_destroy(fs->mdev, accel_psp->rx_auth_fail_counter); + mlx5_fc_destroy(fs->mdev, accel_psp->rx_counter); for (i =3D 0; i < ACCEL_FS_PSP_NUM_TYPES; i++) { fs_prot =3D &accel_psp->fs_prot[i]; mutex_destroy(&fs_prot->prot_mutex); @@ -474,7 +547,10 @@ static int accel_psp_fs_init_rx(struct mlx5e_psp_fs *f= s) { struct mlx5e_accel_fs_psp_prot *fs_prot; struct mlx5e_accel_fs_psp *accel_psp; + struct mlx5_core_dev *mdev =3D fs->mdev; + struct mlx5_fc *flow_counter; enum accel_fs_psp_type i; + int err; =20 accel_psp =3D kzalloc(sizeof(*accel_psp), GFP_KERNEL); if (!accel_psp) @@ -485,9 +561,68 @@ static int accel_psp_fs_init_rx(struct mlx5e_psp_fs *f= s) mutex_init(&fs_prot->prot_mutex); } =20 + flow_counter =3D mlx5_fc_create(mdev, false); + if (IS_ERR(flow_counter)) { + mlx5_core_warn(mdev, + "fail to create psp rx flow counter err=3D%pe\n", + flow_counter); + err =3D PTR_ERR(flow_counter); + goto out_err; + } + accel_psp->rx_counter =3D flow_counter; + + flow_counter =3D mlx5_fc_create(mdev, false); + if (IS_ERR(flow_counter)) { + mlx5_core_warn(mdev, + "fail to create psp rx auth fail flow counter err=3D%pe\n", + flow_counter); + err =3D PTR_ERR(flow_counter); + goto out_counter_err; + } + accel_psp->rx_auth_fail_counter =3D flow_counter; + + flow_counter =3D mlx5_fc_create(mdev, false); + if (IS_ERR(flow_counter)) { + mlx5_core_warn(mdev, + "fail to create psp rx error flow counter err=3D%pe\n", + flow_counter); + err =3D PTR_ERR(flow_counter); + goto out_auth_fail_counter_err; + } + accel_psp->rx_err_counter =3D flow_counter; + + flow_counter =3D mlx5_fc_create(mdev, false); + if (IS_ERR(flow_counter)) { + mlx5_core_warn(mdev, + "fail to create psp rx bad flow counter err=3D%pe\n", + flow_counter); + err =3D PTR_ERR(flow_counter); + goto out_err_counter_err; + } + accel_psp->rx_bad_counter =3D flow_counter; + fs->rx_fs =3D accel_psp; =20 return 0; + +out_err_counter_err: + mlx5_fc_destroy(mdev, accel_psp->rx_err_counter); + accel_psp->rx_err_counter =3D NULL; +out_auth_fail_counter_err: + mlx5_fc_destroy(mdev, accel_psp->rx_auth_fail_counter); + accel_psp->rx_auth_fail_counter =3D NULL; +out_counter_err: + mlx5_fc_destroy(mdev, accel_psp->rx_counter); + accel_psp->rx_counter =3D NULL; +out_err: + for (i =3D 0; i < ACCEL_FS_PSP_NUM_TYPES; i++) { + fs_prot =3D &accel_psp->fs_prot[i]; + mutex_destroy(&fs_prot->prot_mutex); + } + kfree(accel_psp); + fs->rx_fs =3D NULL; + + return err; } =20 void mlx5_accel_psp_fs_cleanup_rx_tables(struct mlx5e_priv *priv) @@ -532,6 +667,7 @@ static int accel_psp_fs_tx_create_ft_table(struct mlx5e= _psp_fs *fs) { int inlen =3D MLX5_ST_SZ_BYTES(create_flow_group_in); struct mlx5_flow_table_attr ft_attr =3D {}; + struct mlx5_flow_destination dest =3D {}; struct mlx5_core_dev *mdev =3D fs->mdev; struct mlx5_flow_act flow_act =3D {}; u32 *in, *mc, *outer_headers_c; @@ -580,8 +716,11 @@ static int accel_psp_fs_tx_create_ft_table(struct mlx5= e_psp_fs *fs) flow_act.crypto.type =3D MLX5_FLOW_CONTEXT_ENCRYPT_DECRYPT_TYPE_PSP; flow_act.flags |=3D FLOW_ACT_NO_APPEND; flow_act.action =3D MLX5_FLOW_CONTEXT_ACTION_ALLOW | - MLX5_FLOW_CONTEXT_ACTION_CRYPTO_ENCRYPT; - rule =3D mlx5_add_flow_rules(ft, spec, &flow_act, NULL, 0); + MLX5_FLOW_CONTEXT_ACTION_CRYPTO_ENCRYPT | + MLX5_FLOW_CONTEXT_ACTION_COUNT; + dest.type =3D MLX5_FLOW_DESTINATION_TYPE_COUNTER; + dest.counter =3D tx_fs->tx_counter; + rule =3D mlx5_add_flow_rules(ft, spec, &flow_act, &dest, 1); if (IS_ERR(rule)) { err =3D PTR_ERR(rule); mlx5_core_err(mdev, "PSP: fail to add psp tx flow rule, err =3D %d\n", e= rr); @@ -650,6 +789,7 @@ static void accel_psp_fs_cleanup_tx(struct mlx5e_psp_fs= *fs) if (!tx_fs) return; =20 + mlx5_fc_destroy(fs->mdev, tx_fs->tx_counter); mutex_destroy(&tx_fs->mutex); WARN_ON(tx_fs->refcnt); kfree(tx_fs); @@ -658,10 +798,13 @@ static void accel_psp_fs_cleanup_tx(struct mlx5e_psp_= fs *fs) =20 static int accel_psp_fs_init_tx(struct mlx5e_psp_fs *fs) { + struct mlx5_core_dev *mdev =3D fs->mdev; struct mlx5_flow_namespace *ns; + struct mlx5_fc *flow_counter; struct mlx5e_psp_tx *tx_fs; + int err; =20 - ns =3D mlx5_get_flow_namespace(fs->mdev, MLX5_FLOW_NAMESPACE_EGRESS_IPSEC= ); + ns =3D mlx5_get_flow_namespace(mdev, MLX5_FLOW_NAMESPACE_EGRESS_IPSEC); if (!ns) return -EOPNOTSUPP; =20 @@ -670,9 +813,57 @@ static int accel_psp_fs_init_tx(struct mlx5e_psp_fs *f= s) return -ENOMEM; =20 mutex_init(&tx_fs->mutex); + flow_counter =3D mlx5_fc_create(mdev, false); + if (IS_ERR(flow_counter)) { + mlx5_core_warn(mdev, + "fail to create psp tx flow counter err=3D%pe\n", + flow_counter); + err =3D PTR_ERR(flow_counter); + goto out_err; + } + tx_fs->tx_counter =3D flow_counter; tx_fs->ns =3D ns; fs->tx_fs =3D tx_fs; return 0; + +out_err: + mutex_destroy(&tx_fs->mutex); + kfree(tx_fs); + return err; +} + +static void +mlx5e_accel_psp_fs_get_stats_fill(struct mlx5e_priv *priv, void *psp_stats) +{ + struct mlx5e_psp_stats *stats =3D (struct mlx5e_psp_stats *)psp_stats; + struct mlx5e_psp_tx *tx_fs =3D priv->psp->fs->tx_fs; + struct mlx5_core_dev *mdev =3D priv->mdev; + struct mlx5e_accel_fs_psp *accel_psp; + + accel_psp =3D (struct mlx5e_accel_fs_psp *)priv->psp->fs->rx_fs; + + if (tx_fs->tx_counter) + mlx5_fc_query(mdev, tx_fs->tx_counter, &stats->psp_tx_pkts, + &stats->psp_tx_bytes); + + if (accel_psp->rx_counter) + mlx5_fc_query(mdev, accel_psp->rx_counter, &stats->psp_rx_pkts, + &stats->psp_rx_bytes); + + if (accel_psp->rx_auth_fail_counter) + mlx5_fc_query(mdev, accel_psp->rx_auth_fail_counter, + &stats->psp_rx_pkts_auth_fail, + &stats->psp_rx_bytes_auth_fail); + + if (accel_psp->rx_err_counter) + mlx5_fc_query(mdev, accel_psp->rx_err_counter, + &stats->psp_rx_pkts_frame_err, + &stats->psp_rx_bytes_frame_err); + + if (accel_psp->rx_bad_counter) + mlx5_fc_query(mdev, accel_psp->rx_bad_counter, + &stats->psp_rx_pkts_drop, + &stats->psp_rx_bytes_drop); } =20 void mlx5_accel_psp_fs_cleanup_tx_tables(struct mlx5e_priv *priv) @@ -849,12 +1040,30 @@ mlx5e_psp_key_rotate(struct psp_dev *psd, struct net= link_ext_ack *exack) return mlx5e_psp_rotate_key(priv->mdev); } =20 +static void +mlx5e_psp_get_stats(struct psp_dev *psd, struct psp_dev_stats *stats) +{ + struct mlx5e_priv *priv =3D netdev_priv(psd->main_netdev); + struct mlx5e_psp_stats nstats; + + mlx5e_accel_psp_fs_get_stats_fill(priv, &nstats); + stats->rx_packets =3D nstats.psp_rx_pkts; + stats->rx_bytes =3D nstats.psp_rx_bytes; + stats->rx_auth_fail =3D nstats.psp_rx_pkts_auth_fail; + stats->rx_error =3D nstats.psp_rx_pkts_frame_err; + stats->rx_bad =3D nstats.psp_rx_pkts_drop; + stats->tx_packets =3D nstats.psp_tx_pkts; + stats->tx_bytes =3D nstats.psp_tx_bytes; + stats->tx_error =3D atomic_read(&priv->psp->tx_drop); +} + static struct psp_dev_ops mlx5_psp_ops =3D { .set_config =3D mlx5e_psp_set_config, .rx_spi_alloc =3D mlx5e_psp_rx_spi_alloc, .tx_key_add =3D mlx5e_psp_assoc_add, .tx_key_del =3D mlx5e_psp_assoc_del, .key_rotate =3D mlx5e_psp_key_rotate, + .get_stats =3D mlx5e_psp_get_stats, }; =20 void mlx5e_psp_unregister(struct mlx5e_priv *priv) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp.h b/drive= rs/net/ethernet/mellanox/mlx5/core/en_accel/psp.h index 42bb671fb2cb..b3284d00415f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp.h @@ -7,11 +7,29 @@ #include #include "en.h" =20 +struct mlx5e_psp_stats { + u64 psp_rx_pkts; + u64 psp_rx_bytes; + u64 psp_rx_pkts_auth_fail; + u64 psp_rx_bytes_auth_fail; + u64 psp_rx_pkts_frame_err; + u64 psp_rx_bytes_frame_err; + u64 psp_rx_pkts_drop; + u64 psp_rx_bytes_drop; + u64 psp_tx_pkts; + u64 psp_tx_bytes; + u64 psp_tx_pkts_drop; + u64 psp_tx_bytes_drop; +}; + struct mlx5e_psp { struct psp_dev *psp; struct psp_dev_caps caps; struct mlx5e_psp_fs *fs; atomic_t tx_key_cnt; + atomic_t tx_drop; + /* Stats manage */ + struct mlx5e_psp_stats stats; }; =20 static inline bool mlx5_is_psp_device(struct mlx5_core_dev *mdev) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp_rxtx.c b/= drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp_rxtx.c index 828bff1137af..c17ea0fcd8ef 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp_rxtx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp_rxtx.c @@ -186,6 +186,7 @@ bool mlx5e_psp_handle_tx_skb(struct net_device *netdev, /* psp_encap of the packet */ if (!psp_dev_encapsulate(net, skb, psp_st->spi, psp_st->ver, 0)) { kfree_skb_reason(skb, SKB_DROP_REASON_PSP_OUTPUT); + atomic_inc(&priv->psp->tx_drop); return false; } if (skb_is_gso(skb)) { diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/en_main.c index 9c46511e7b43..7d2419fda70a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -3999,6 +3999,11 @@ void mlx5e_fold_sw_stats64(struct mlx5e_priv *priv, = struct rtnl_link_stats64 *s) s->rx_bytes +=3D rq_stats->bytes; s->multicast +=3D rq_stats->mcast_packets; } + +#ifdef CONFIG_MLX5_EN_PSP + if (priv->psp) + s->tx_dropped +=3D atomic_read(&priv->psp->tx_drop); +#endif } =20 void --=20 2.47.3 From nobody Sat Feb 7 18:21:31 2026 Received: from mail-yw1-f171.google.com (mail-yw1-f171.google.com [209.85.128.171]) (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 2DE9633032A for ; Tue, 28 Oct 2025 00:00:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609634; cv=none; b=dyXTyvWscObI7POL9rp3rEbUatd/zC1Wbl+yMcI/ROGi95UXk4B0kgkc44Oce9DmlFk+XDwH/STW2Uzdh+jS0Bfzr78UiPRjJSLSyC7H66NuKjxdzuzsmF4IESKNcIayl0GPd2Bfqy12XXzulpFZo9Vlo2sBQCQRvymsiiNfsnI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761609634; c=relaxed/simple; bh=ylW0lW+wuEzlGL+hHENqSKVEnatP0qVhMDiawJdeZVU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BMK9ozRjWrL6dSkrR/i157HKCKDmLfXFxvLMenAK3tLZMSzfVoijna+3cfQ1RaHa/qo6tUkOY/d62nXDza71FhV4mrYXfMa+J46Y2Np0+3xe8DrH1xB1GAjCgLuUNKFaZPRvDy1+qKCa25hfv7L5WR7imMtm/Nl9pMc6awNUtZ0= 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=m+tXZmNx; arc=none smtp.client-ip=209.85.128.171 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="m+tXZmNx" Received: by mail-yw1-f171.google.com with SMTP id 00721157ae682-71d60157747so51305217b3.0 for ; Mon, 27 Oct 2025 17:00:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761609630; x=1762214430; 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=ivCZW/5kdODw7DGks4Fdh9OvB5fw5w/Le7nkqaVGoCM=; b=m+tXZmNxaHjvq0hz1YlAtbBwk7OZz1PDJQ4cxdYigF6e0sUTY+h1yfVeqO96GmqZa5 G6z+80rNQ5VcJAv7/hqTwqiJT6ubGPbmHtQHFKAF7LufuqT6k7+whZAVlAgkd7umIF/p bxZyxZI3AloKo9f1lGQnGGze7Ld0qIQXtVUnCVryrFl43p71J+3A3CnJQ/ZIBqVQG2OH lAV/3yMNWMl4MD0a0Shot7m1Md8ttA1ig91SFWwGF/CkIkUX83bzkiJccuxaHt0mS88e 3/Obl3HJlEF9fA4cOFB/URqeVzBD9m+iRqAGZkFLygshpnQ61y2alceFlHwi08kl4LDW 2k2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761609630; x=1762214430; 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=ivCZW/5kdODw7DGks4Fdh9OvB5fw5w/Le7nkqaVGoCM=; b=MwESq83TMnWnaHqHhABT04mRuKwSA9bIvVhL80YoKagLCTJsBXsoFy9SL6WdRo8H8Q TzbfpivD9a3o6uz///qE7gnubBciS+K8L0rMWl+0qV2w/qU8sZa+3xucvgecUCgC19/e e0mI829wGJc9PlxtiWX/yaiUWvD/B0ZMSBFttsD/dboR0jthJkjA5zFemZZ2DO7eUMvV JjLWglQtozlPDUpr1q+vQ09JIvanCXtBwaKxvT2uuBuqsZuhGCJc8JUtuxUab1ynnKLO l3Ol3s6lw7eiOSxs9YZ/4u/uJBwdoU0PnMjb0WfzqeyOX3KLzH9XrcElVJbBzU8e+2VV y9dw== X-Forwarded-Encrypted: i=1; AJvYcCX3FoGV6vbfg9EIR1CkNPN8aTyynt/cs7NYYewVzj5v7XoYSN2hyJiP1mkxytfHZC6bVNlK4XGDWxdlbA4=@vger.kernel.org X-Gm-Message-State: AOJu0Yy9C+EM42FTce3M7eJ819a9X1zJau3CB0Cp7ibsPJReK9NkVky8 MoVJyVi8Env3CaUEoWNS9d4Vzr+45e0Ov3FswZzrW4cr6HqI7H5Nk9/7 X-Gm-Gg: ASbGncsq00HmEzaH+b+sHPGjVJ7rnGj9Toy4z9K+AMidmHh9wu7lwPg9WGSMS/MoENi d+3gP3+gdKZq6/LtINmRSRm7tCTZvO+Qpxy50ZpsHcMsvD+BeqCnu2tD/nsx5Ej7yy+4WiyZUrP +pbMLYvWZ0w7rNiwTWd89CMkX50ZvPByveKteAFCG/umbhW2zALJq1DKfvkVfaYJic7bWwK3U8s oMyQc9ZPsXNLGF3KI20XB2b238f7Yaq+KwVJdKWCWHujjDZCg05KJ1p0dx+chSMkSSKzwmxDJkr QD5FBwpg7TRd8OEIBehCiWxezvMfTuLM6A8VS1qD5xuPFHHU3C8o/+XUE/XzLV3STHnhRpE5hgc y0a+XJuY0vsW00b2TnDcY8MVgTr1NoimMtWKYpadwWAodedaN2xZzH/EB9TL92YOhgO+hXZnGW+ CvhyNQUuVAghPOEQTDIMco X-Google-Smtp-Source: AGHT+IFIT2ZZKJmfNpqscngAHfVc0scw3rsnRv+/zspdYA9vtzoBsZlLRZhmI0iL+Df05NV6ZwIZFw== X-Received: by 2002:a05:690e:d8d:b0:5f3:319c:ff0a with SMTP id 956f58d0204a3-63f6b97ec59mr1468225d50.28.1761609630201; Mon, 27 Oct 2025 17:00:30 -0700 (PDT) Received: from localhost ([2a03:2880:25ff:51::]) by smtp.gmail.com with ESMTPSA id 956f58d0204a3-63f4c3ccc77sm2718414d50.12.2025.10.27.17.00.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Oct 2025 17:00:27 -0700 (PDT) From: Daniel Zahka To: "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Donald Hunter , Andrew Lunn , Shuah Khan , Boris Pismenny , Saeed Mahameed , Leon Romanovsky , Tariq Toukan , Mark Bloch Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: [PATCH net-next v2 5/5] netdevsim: implement psp device stats Date: Mon, 27 Oct 2025 17:00:16 -0700 Message-ID: <20251028000018.3869664-6-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251028000018.3869664-1-daniel.zahka@gmail.com> References: <20251028000018.3869664-1-daniel.zahka@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For now only tx/rx packets/bytes are reported. This is not compliant with the PSP Architecture Specification. Signed-off-by: Daniel Zahka --- drivers/net/netdevsim/netdevsim.h | 5 +++++ drivers/net/netdevsim/psp.c | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netd= evsim.h index 02c1c97b7008..af6fcfcda8ba 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -109,6 +109,11 @@ struct netdevsim { int rq_reset_mode; =20 struct { + u64 rx_packets; + u64 rx_bytes; + u64 tx_packets; + u64 tx_bytes; + struct u64_stats_sync syncp; struct psp_dev *dev; u32 spi; u32 assoc_cnt; diff --git a/drivers/net/netdevsim/psp.c b/drivers/net/netdevsim/psp.c index 332b5b744f01..3912f2611862 100644 --- a/drivers/net/netdevsim/psp.c +++ b/drivers/net/netdevsim/psp.c @@ -70,6 +70,13 @@ nsim_do_psp(struct sk_buff *skb, struct netdevsim *ns, *psp_ext =3D skb->extensions; refcount_inc(&(*psp_ext)->refcnt); skb->decrypted =3D 1; + + u64_stats_update_begin(&ns->psp.syncp); + ns->psp.tx_packets++; + ns->psp.rx_packets++; + ns->psp.tx_bytes +=3D skb->len - skb_inner_transport_offset(skb); + ns->psp.rx_bytes +=3D skb->len - skb_inner_transport_offset(skb); + u64_stats_update_end(&ns->psp.syncp); } else { struct ipv6hdr *ip6h __maybe_unused; struct iphdr *iph; @@ -164,12 +171,32 @@ static void nsim_assoc_del(struct psp_dev *psd, struc= t psp_assoc *pas) ns->psp.assoc_cnt--; } =20 +static void nsim_get_stats(struct psp_dev *psd, struct psp_dev_stats *stat= s) +{ + struct netdevsim *ns =3D psd->drv_priv; + unsigned int start; + + /* WARNING: do *not* blindly zero stats in real drivers! + * All required stats must be reported by the device! + */ + memset(stats, 0, offsetof(struct psp_dev_stats, required_end)); + + do { + start =3D u64_stats_fetch_begin(&ns->psp.syncp); + stats->rx_bytes =3D ns->psp.rx_bytes; + stats->rx_packets =3D ns->psp.rx_packets; + stats->tx_bytes =3D ns->psp.tx_bytes; + stats->tx_packets =3D ns->psp.tx_packets; + } while (u64_stats_fetch_retry(&ns->psp.syncp, start)); +} + static struct psp_dev_ops nsim_psp_ops =3D { .set_config =3D nsim_psp_set_config, .rx_spi_alloc =3D nsim_rx_spi_alloc, .tx_key_add =3D nsim_assoc_add, .tx_key_del =3D nsim_assoc_del, .key_rotate =3D nsim_key_rotate, + .get_stats =3D nsim_get_stats, }; =20 static struct psp_dev_caps nsim_psp_caps =3D { --=20 2.47.3