From nobody Fri Dec 19 14:21:15 2025 Received: from mail-yw1-f172.google.com (mail-yw1-f172.google.com [209.85.128.172]) (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 D849F4D8CE for ; Thu, 6 Nov 2025 00:26:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388773; cv=none; b=NukI4bNfUup1NAc+xGKUnAvZ9fMTvQDw0bK3mwI0oMUqyqFch2Twsl79s4a7gC59QSOe4k168c/JNALrOjeXo5u4CotDw6gP1ks3utnjaJ3wTFX+T+bdVWUeq9h9Y87T7Ez/SlsGjo8joMIP/is8dKEtVUkad6KlSg0dBr6aNDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388773; c=relaxed/simple; bh=4MYN7EAgWnSODODG6A19x6ijHGlK8gmMv8zjON/zh+s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NcPv8a453jfWD3HO+H477Te3aBI0WTFxjNl1EC8bUybyNT/BhoB/YBSE2WsnpvpoPg8cw0beW/qTWTVcxYrpS0joemXvoKdeZF74PbLK1K7K/yAIQJGoJv/Qxgv0C/NvABM+575iLXykFlJyi4eDDVIcn6vP7iQXHfY04EX/Ru0= 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=BLdvknL5; arc=none smtp.client-ip=209.85.128.172 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="BLdvknL5" Received: by mail-yw1-f172.google.com with SMTP id 00721157ae682-781014f4e12so3915787b3.1 for ; Wed, 05 Nov 2025 16:26:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762388771; x=1762993571; 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=BLdvknL5PQxwSWGcKz//ajzKsjybP2gL0i6pb0u1PauO8nW3YppEtUE3j//YjRXYus 4pDmvrKEyzOZZsLnLf4njfKClfuJfPqaCbjEGura/QDOi1LL+OfLBqUB3lYEICU+yUTQ M+Itm4Q2I5eyAA0fNHGth3JaW4EWzn92QciUT4x/qjh07sIKJfrc6fzpLeo3iCXw8wN4 CqulfAGsQ8FjYzWCqJ06CqSI8YR2MZdTt4uzsRbpZRYmWnBWAuO7kFox9UNadWvMCQRM oxTiHAjuv/EhV0LlCZ44vanOG7ZYH1j8QcLOPSu7fxlu+vx6MOGaZYRaBmkRQPXgkFFR /MAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762388771; x=1762993571; 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=rLFBNfSlvk6bIAOe3E5Xx0gMsAifvM8m8BBdEaB423WO/VD6D2V5OfFRto0PmI9Fo2 wSNXrWvX3RDh/U3PEhcNhizC+ZHI8fJ4l+f2HG7ltYmQajc3da+8M3xHwjwXcBTQJLZ+ FvDBpBI7kA9nmRSHlfSDQlgmVGewh+ePNDpVkErjpThBTXqCoMbECkI9vS22/F8pEaf/ zaLtDAphkz0fOpyhERWTdtEDCDFW9JhJLbSljrCkAQTOaKeFO70D8HEUCFjzdpeqNmPO 5/8T5r9UT3ke9buC8mupcM9ScWYnG3TNJFEmdkemahZ5u2LCDyzAtNxSktl2Lu+H6u1F a8Og== X-Forwarded-Encrypted: i=1; AJvYcCXbLSVPE/i59PMtr6E9KFJBP8P66nepP91hfmKC35KmzqYiRvmH3MEst6zvxrTREsdDB2jXWf/3huV/t64=@vger.kernel.org X-Gm-Message-State: AOJu0YyPyhyfzprmhqPdLl8g4oq+yL1lWj3HGq1uJD9RFz2Oe9HJD09s rx1wh8uYBSEOqu6bF+0NeS1err57HHwVmQ7E/f8f1WDMuFFRiowGNsR7 X-Gm-Gg: ASbGncuxudlDWI7c01hkHUZDjwKoDuj04WvKuX0ieXfFPJWAGLI5Yc/pneHtLylGbXY a8fkuAHs2o5RLKEktc5kyv/ERFk3TfoTZMJmQwPX8rHem4Igein2FhYGKqmDhsMfKSC8B3jPGZZ N1FXEMJjmzURaUAlvrvreKhrnE71T4wDvtOB0wJmMWf8LoMhYfOUqzttuum4PK36fB9UIEiBHBd pFKd7L/uVA9tzUPqD4simvM836oWqMAN9lwGrk+rpCKUoaVuFPVlhbpD/2rJvJIrpytwWxoNM7q 5bdtNjYhkXxrWcpcrwfWSI0Baq13VRYs6fusHVlXcwoR1yMzdA9o8taJgbcm4XGgSkAjMBdHUml DNBoGn8vXaY1kjCeDErs05RDH4Pew3UTudMPY+VO/Q2K+IYWA2Wd1+DokPwSsoLghxptAH0KkiN az9OApoENk/A== X-Google-Smtp-Source: AGHT+IFS2iWAxEnztB5To7sq/L7ysBy9qfC2JiggfaKdL+MGbkE7IAtmPDihj9rg7WJDwBFUgndIyQ== X-Received: by 2002:a05:690c:8d14:b0:784:8b82:98d2 with SMTP id 00721157ae682-786a4213583mr42199497b3.70.1762388770706; Wed, 05 Nov 2025 16:26:10 -0800 (PST) Received: from localhost ([2a03:2880:25ff:74::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-787b159b666sm3400747b3.39.2025.11.05.16.26.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Nov 2025 16:26:10 -0800 (PST) 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 v3 1/5] psp: report basic stats from the core Date: Wed, 5 Nov 2025 16:26:02 -0800 Message-ID: <20251106002608.1578518-2-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251106002608.1578518-1-daniel.zahka@gmail.com> References: <20251106002608.1578518-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 Fri Dec 19 14:21:15 2025 Received: from mail-yx1-f47.google.com (mail-yx1-f47.google.com [74.125.224.47]) (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 DFE6D19755B for ; Thu, 6 Nov 2025 00:26:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388774; cv=none; b=AJtTPOWyBJV9J4TalbW30THp/SQVyJdIw3gtTiMOS5eDPe6upkLxIs708VDvNKjkQtwhQYg42h0t6o4GSq3gfMrof9mt7aj4i/cMm0ZEX5mwJ1iwVV89nBJ83AWZQOwPsVpj/bESH5qEkl+1fMA6dkBP/0c40uK95bC1xHkaQsI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388774; c=relaxed/simple; bh=bcETCkepaF74e7lPUMskBIH6KkDLfN5id3lvNhxFZ9M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M4H8/nuAU2pAPYf3zbI7lolRvpmbvehdkmRokGE4mutb6ObNX39WYw3Ai/PZV8jdMbz9v6HsEFaoKMbHYz4tOEDvvGsx4MoS1odCnBmjQGmIdg+BTcSyQ8xYIyyR4IUBcrZF2EV4eGPSfI6fhU5f7GD3LLQGaIO/9LUMI7Fu3IA= 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=AoZr23Kz; arc=none smtp.client-ip=74.125.224.47 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="AoZr23Kz" Received: by mail-yx1-f47.google.com with SMTP id 956f58d0204a3-63f96d5038dso490971d50.1 for ; Wed, 05 Nov 2025 16:26:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762388772; x=1762993572; 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=AoZr23KzUWN59YOfbzp7y0Y04/tJgWDRFFCOSUMgeTvZxyVlnZ8502wg/vsX8HNQC/ fjr4jKs5/vdBGMULFbUEwvkpNI8JMFbrhA6uR+XsbniuslywQVmKXSTLxqnw9WkJ15N1 z+45Mjp+iTAKxo88o4zEHog1OUgFU48BS+qMElH6nXJuH4jDFSFATmeAzCudxvFa0XdR gBIyg3/ttkMfqwgOdw7DeimP7nwDjJwVrAJtYJbZk70Iaa20NxHF1HtW9BVvhFoCwIK/ IhZiKeMuFz55MDVo8UqvajR0wFjr0uDKjCOU9K4lJHoXUVqrvdggoYwbzISi26IlQ3pg jX7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762388772; x=1762993572; 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=DKvO5gj44/+2Q2dZNGvTQlqDJcITgiIg/gzmLz9ny18j6sKPFLBEd1d6c+NnVHHfA4 nE00Wr+OHscbzaxLlkuge6qLe5h57g+Kyhxi5zykXPJHrDkhxOXf/98ZJoLJI7S6cxBC fTZ1WkdXMQM7Kb7oGNhHfBt3bGL2Jj054//Hhi9J0I5mSk8WzGocHmSpvybI0NH8Btxg RILDhGO8SVcq/Q6MAEpzoozUl/1VIGYdRDEs7mqmHKUHPdV3S3C/hbYWQAVRLaRr1Ruc yAOlll1hKcIEbRLUxt7I7jiaNE+dTqzjHqhEdnhaC+SxXKmtiy8RQTy6X2uzkdxRullO PDgw== X-Forwarded-Encrypted: i=1; AJvYcCUjPcQUFkUNaDAEisaOQ7xXsSEYFBGEOo+Mck+1huTQq0BkF3Wt8eFgrGIQ6uBSKVnRRrO50VjCWJxABas=@vger.kernel.org X-Gm-Message-State: AOJu0YzVD7qpotS1PXglC5CCFEcSJgEL0Z4cewmCzHs6yvvEbFnEgF7A IPuFyp/sjvuRjDyYZAx9fjTmTtAapzXR9Avwhm6Mn8sBuRVskrxXYUQk X-Gm-Gg: ASbGncumgsQ7IXtT/t+ksbOEs8RWz2bxRtbPZl3/NPmsx9kmkmwMWLym9BSFk5DDVBd Vt0eDbDH2eA9HYhj/3sHw8Fkx8RhRrhP1H96RWCvPGz7XitBAosCn2nwRH34h0gdlqFjZZKQUGM Io08lGSv8XWeuwi7c2/bTgag20KqcXLsxFG+xlGH9NLoTaNK/UN3BlanBcWOkZQm/gim7M9Sp17 7Fra9ZxuB5r6mQqRQIIcGBChoRlEs82XYXGWOtCi2gsnhG5AqDy1dV/fA3Gvasrp9wqtub3NM7B dlCtAvRrNSqmnGyGCZY+bUi34ePAnMpczak7ZJOraOFRdT1lQy1qlWZjUh64PTIBLO93MbJmSI4 Sz5pcbRrCXnhnqDWv82Bs0fv7WnYdpTbffqH+Rk9zTpHLXpUPx6sesZQIqWHMvpOZypq6Fqyv9w iRvDA6Bpot X-Google-Smtp-Source: AGHT+IGUs2EGrmJcpX8sLWFVHcWr4tdUrasTklxf9Bp0ULYKHhGWtlazRWy3T6CE6OmD8o7jNEYSVw== X-Received: by 2002:a05:690e:155b:10b0:63f:beb2:9519 with SMTP id 956f58d0204a3-63fd34b5e50mr3795617d50.5.1762388771781; Wed, 05 Nov 2025 16:26:11 -0800 (PST) Received: from localhost ([2a03:2880:25ff:8::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-787b142d5cfsm3513297b3.26.2025.11.05.16.26.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Nov 2025 16:26:11 -0800 (PST) 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 v3 2/5] selftests: drv-net: psp: add assertions on core-tracked psp dev stats Date: Wed, 5 Nov 2025 16:26:03 -0800 Message-ID: <20251106002608.1578518-3-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251106002608.1578518-1-daniel.zahka@gmail.com> References: <20251106002608.1578518-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 Fri Dec 19 14:21:15 2025 Received: from mail-yw1-f180.google.com (mail-yw1-f180.google.com [209.85.128.180]) (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 120E019DF4D for ; Thu, 6 Nov 2025 00:26:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388776; cv=none; b=RY3SGgnCZkizfGtljKRJp7zGkYk9jecSiksvh+ovgOA4IyHD6lRLVhMP6t7uxXVxOO7MnNHYBcfQA3Gnlm05NRxFHK8VUSHly7OOyb5k1bbnDZcmcfGyRS3mI0+jgMMC+5yHTugde6uZsniR/RecfBtiIPzhSM/DKNxK0PD5iEo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388776; c=relaxed/simple; bh=1vagyyZCCWaC322iPJ0jzikTtv7ZxpGVPgoAR86lLxU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=A4qC0xu5DAPyk4JTM+ioSkWGwec4woL0A5sWkhPhGPyfTCVlHAobGE+b+vXXKFGJ5avCfz9/O+TdRt0/FapF1RiTxEs5k/P0dKcKiIkXr3RDVoSoL+D++XgiEGzhBtcOD5mrBQnYqVzceSj8h232P5QJTI/RbGSolAa5GvYYjCg= 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=elcd4RZY; arc=none smtp.client-ip=209.85.128.180 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="elcd4RZY" Received: by mail-yw1-f180.google.com with SMTP id 00721157ae682-7866e9e62e1so4057287b3.2 for ; Wed, 05 Nov 2025 16:26:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762388773; x=1762993573; 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=6TevgQTeoZLcNkHLCnCTiMLpnQ43etaT1P8DpvGUggw=; b=elcd4RZYccCwWSOMErwujlMCP18ztwDuT5IftS4a7zQqTJhGwtnnRI2NtH4XpnRVuR /6q5j9qp0FahStGPq2ffJUGjdA65yzKOToUiI708boeKyv5l+8sVQ8oB4hYbzF9cAAyq RNMIS8efMWXBXlHozx6Fv9C23hgdVLvYuHBbY7J3XFe1BqstPzxkD4TSioXvOafXY1Hh L2eB6P1hnGxYUPaBfkff9fv511XIjFDXXgdWHq1z7UHfrLu95C2xfLiNyuw/GLNJlGwz m7Nv5/rJY9L7cI1XadMPDfPeO6XM2k/IGsj5oJYHHpNDxRqjf6upCWnvoZ1wxY+jTvQi GnBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762388773; x=1762993573; 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=6TevgQTeoZLcNkHLCnCTiMLpnQ43etaT1P8DpvGUggw=; b=GucpNULN5IuN+yALqaDIUYO0Trylyk1CxrueFq0Vke9IqCJrEwOGnPqtR6hWMf//OR ZIWfsplFKFqgScWGU4XFKYfXTNr95UoUusUy/UOMVSiDVYCj+u/5OsYhHdhJrv2PinI2 jyj8gxeX50azKdVoma966NP+Pzc9+ORW10AEyAKSGSK13+2na0S67S+x/QHKeQ83JC9y glkN4TBhTlK2Nr7xCm4KEuodB8Uyk/hEzBBfilOnNJhWvUYFHx4S/pFtBY+QJSbkR/Kn WZ+p9NgJ68AbfkLhgShqte7p3H8ip8d62XlNbeVEYKGTyu5LcjyM4c4NomyXYIEgeMKF ZPCQ== X-Forwarded-Encrypted: i=1; AJvYcCWdW9jPbBZcVYzt9ZvQozNhqWisn8inmT7MqW0aT8UyRbI+/bvt1+y/6kq1cUZrzRXtP8Knhq4cjQZJbfU=@vger.kernel.org X-Gm-Message-State: AOJu0YzE/ukrsd1OO7SUkL5BVkHG/BTuWpeIZ3uGQX2Kuvxt6nucD9Rw psuBJrKjIo2msbKicTPCu8GiK9+RCnVl7Mx+6Z27izq1F29l4ZhXrMlQ X-Gm-Gg: ASbGncuqtB99xq+sPpR2CJ6kuuE8rByrFg2n56gi/e4QsLEfs/rwqI9eHR+BIQs2rWS dzDFsAtdvr19GwPrqOCTmJ8xQd0bLVTteyvv0CpWwF1a/8+e4ULEzdTvDEBkoog78GrrGU021yg TsXYSwmUvM330c7Bv6uU21sN1iCgngwzUb2Jca2D7a+5Wzm97jox0R8nOMuSOldRMFMnhjQ7eBH 3cSEXR2C0qgxm063L15PviucKpu11/p97dWnqYHJNOzrX/v8OdOh8D1lkRcxeGWf6AwzHudJEbg uA1vUJhaOq/AgqGGMgQlwiYVUDE2wy5vNr+UxsUsJCbNJ1sXZL1cL+KRbAS9mJDv1/mEXnCuFLZ Iz9bbA7VNrwAaooH4GuSroU1b5CY/ZKHLvKgNDLnSr9BrL6qXDU5123sq2jUuXwf6S+QhGz/NLy V2L21F1fnXiQ== X-Google-Smtp-Source: AGHT+IHvp1gFuqtFzy10m9mJFmg4rE1anfKt+5H7osce0MlN6ZYPG5ynTMrbUc2Tbt/egPhenlcaeQ== X-Received: by 2002:a05:690c:a089:20b0:786:6f81:eb37 with SMTP id 00721157ae682-786a402d456mr47363307b3.0.1762388772799; Wed, 05 Nov 2025 16:26:12 -0800 (PST) Received: from localhost ([2a03:2880:25ff:45::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-787b13ec33dsm3577997b3.17.2025.11.05.16.26.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Nov 2025 16:26:12 -0800 (PST) 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 v3 3/5] psp: add stats from psp spec to driver facing api Date: Wed, 5 Nov 2025 16:26:04 -0800 Message-ID: <20251106002608.1578518-4-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251106002608.1578518-1-daniel.zahka@gmail.com> References: <20251106002608.1578518-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 --- Notes: v3: - remove zero length array from psp_dev_stats Documentation/netlink/specs/psp.yaml | 55 ++++++++++++++++++++++++++++ include/net/psp/types.h | 23 ++++++++++++ include/uapi/linux/psp.h | 8 ++++ net/psp/psp_main.c | 3 +- net/psp/psp_nl.c | 21 ++++++++++- 5 files changed, 108 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..25a9096d4e7d 100644 --- a/include/net/psp/types.h +++ b/include/net/psp/types.h @@ -150,6 +150,22 @@ 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); + }; +}; + /** * struct psp_dev_ops - netdev driver facing PSP callbacks */ @@ -188,6 +204,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..6afd7707ec12 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,17 @@ static int psp_nl_stats_fill(struct psp_dev *psd, struct sk_buff *rsp, const struct genl_info *info) { + unsigned int required_cnt =3D sizeof(struct psp_dev_stats) / 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 +529,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 Fri Dec 19 14:21:15 2025 Received: from mail-yx1-f42.google.com (mail-yx1-f42.google.com [74.125.224.42]) (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 147D21C5D6A for ; Thu, 6 Nov 2025 00:26:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.224.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388777; cv=none; b=qx85V9gNUveDgWdbLyn5sWpDBEu7D342IMeglD2Yd/9oMLx66vaZQEslp9rxtvvHaxoFAuN3c+D/YP5cRRJi1evEZ6klGIDYXeypB/EYDpD1LfZe/21wcJVrIrWYlg57zWojDSYaDIxll58Sk1gVHhL6/3ivCDVz2NbrAmV5Up8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388777; c=relaxed/simple; bh=za45gZn58io3q7G6R6uiLs/BWVajHmLqJcwZnfN5KLw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rQXHBybpuO3zOg3HDMuy0acsZgKoPAoUwRiJpMdWTBj/AOVJ7qE3M3dymmuPRTugX4Tip1eKhuvxBccKjR2N79gPReLWtt/UuscJFEvOGtZYoTTzSQSassVzohftdknrHSY7bssLAadGGMojVx0/ZvuMHLMiD2WbxRwSNoWhMJg= 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=T3d4viBJ; arc=none smtp.client-ip=74.125.224.42 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="T3d4viBJ" Received: by mail-yx1-f42.google.com with SMTP id 956f58d0204a3-63f95dc176fso455853d50.1 for ; Wed, 05 Nov 2025 16:26:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762388774; x=1762993574; 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=s2wQ5QxA+Nt4F/G4CAuMI2bjmJWmfwgXVieJdAcKAY0=; b=T3d4viBJTbj43qAWpPl1nIc2bz7A6+sGBSIQUqg9mWEY6aqqYjoXYgEkUPubCMaq5J 2e7bH2ZwOsusIs7iFum/YzOM1J3N2xxP+Qde6kjH64rtFJUHTX18Q+ODqipJ1ThFyagF BUuvY+xmNdIAGcNXtf4jQWdyo3/jnb3MJRMLTL02jLII0xtnJifJshkX8xrJN14V4tKi qRtFLhPoT0pQZoCuYzF+5EedCQJ3RBa350apbld/lungBaG5643m7m5Fq/fje5lRSYJz GuES+P5k1rIixYmSJvM43ipWOL+nGKydenU8MW9ReI0OZ3Vfnr53RfnBiB4CePwekx1u P12Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762388774; x=1762993574; 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=s2wQ5QxA+Nt4F/G4CAuMI2bjmJWmfwgXVieJdAcKAY0=; b=rFglNpPVqMsXy+YkQR4/9aSZy95L0Curpz6e/eeZ221HEnldJju/W5MuKl7/ar+WMv S4cw5QEg07b2GeY+wfuFNXFrOcEiqo9kJa113uq8MO+cEuy0cTyBL4eQyXyoj0IHJT6a fokb8XR45SCPi0j6qg6R49pFQD2JYGB/HV0jLRwR9Ae3BUvXGhDc/xlJL8iFWuvP8U1R zVo7CYlg+qO7rvoprv7YN5jaNYGlBCRDV1ZfESFVzAlquV1OGBVAdjT+23edKCsfz2wI 1fq0+QbkcYMZ1thJaHQAdPOw12REPoQQzSFwZGXvpNC20g7tVcyB2gzGUCsfeFbQeLVS QKDQ== X-Forwarded-Encrypted: i=1; AJvYcCUoAR/RlAsuS3tVEeE3cA4fvhr40DscnMxTCQLSlu9f/jGw0SswsHyhfw9t1Stn5Om9OzftxEpZMGib1IU=@vger.kernel.org X-Gm-Message-State: AOJu0YzIRt+Xz63vauKgmwkloKsLs0r4XtEbooDZtdOz+HsSMb822EXy Q4j8hA1qU+WgSRn3+qYf3hiCXVoYMd8TLkyaL1Q+43UMNe373jRI3IN/ X-Gm-Gg: ASbGncteWmyEoNFSIzdoA3WFyZsVvNSifK+pulgpvpSUvrec+SZuGLfRBUN7pAvJWsz auVrcE5q3ppvZtyTF72B9+65QfYJIft/Z/eOE+3I6Ocv/zr3f5WoTmM/hw/U9E95rMIta87lBBO xGVZk/jBxzbF6Aw9Emj+Jby8l3n13DOEYRZ5BGy2b97eTf7T+02uvOGZzZIHUe9lbMzp91xD8RN ul95NECBYyjpknabH0NDX3I1seMnvkgzTbBvPfCSE/ZFEu61UwTxhxWpq2s3S9ab+voHwr3lmtD h+NdbzzICIINTo6TzfS46Da1YAnukqxOIcMOZJQ45zEF+y9chIE4Eybq93BoBj5Uqhb3+ZSLFzf k6u5aV9aIVfuY4MnSxThuyvDLLteJ/rwNJZKsr+iaoQBNrW3OmZ3tKN1RKP8+p6rwrdCM6D2KBO 6zgIc8TA39DA== X-Google-Smtp-Source: AGHT+IE59zLZZYyAmzryk94tw8TktRRSTJ6JnEVpxnemBG5Bk+jMcvGOFztXLqAXDxrgMv9zYV/INA== X-Received: by 2002:a05:690e:4082:b0:63d:bfad:6c7 with SMTP id 956f58d0204a3-63fd35b4528mr3942831d50.58.1762388773845; Wed, 05 Nov 2025 16:26:13 -0800 (PST) Received: from localhost ([2a03:2880:25ff:13::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-787b1400351sm3511567b3.20.2025.11.05.16.26.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Nov 2025 16:26:13 -0800 (PST) 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 v3 4/5] net/mlx5e: Add PSP stats support for Rx/Tx flows Date: Wed, 5 Nov 2025 16:26:05 -0800 Message-ID: <20251106002608.1578518-5-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251106002608.1578518-1-daniel.zahka@gmail.com> References: <20251106002608.1578518-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: v3: - simplify error path in accel_psp_fs_init_tx() - avoid casting argument in mlx5e_accel_psp_fs_get_stats_fill() - delete unused member stats member in mlx5e_psp v2: - use %pe to print PTR_ERR() .../mellanox/mlx5/core/en_accel/psp.c | 233 ++++++++++++++++-- .../mellanox/mlx5/core/en_accel/psp.h | 16 ++ .../mellanox/mlx5/core/en_accel/psp_rxtx.c | 1 + .../net/ethernet/mellanox/mlx5/core/en_main.c | 5 + 4 files changed, 240 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..38e7c77cc851 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,12 @@ 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; =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 @@ -669,12 +811,55 @@ static int accel_psp_fs_init_tx(struct mlx5e_psp_fs *= fs) if (!tx_fs) return -ENOMEM; =20 + 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); + kfree(tx_fs); + return PTR_ERR(flow_counter); + } + tx_fs->tx_counter =3D flow_counter; mutex_init(&tx_fs->mutex); tx_fs->ns =3D ns; fs->tx_fs =3D tx_fs; return 0; } =20 +static void +mlx5e_accel_psp_fs_get_stats_fill(struct mlx5e_priv *priv, + struct mlx5e_psp_stats *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); +} + void mlx5_accel_psp_fs_cleanup_tx_tables(struct mlx5e_priv *priv) { if (!priv->psp) @@ -849,12 +1034,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..6b62fef0d9a7 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,27 @@ #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; }; =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 7b7a0060979d..3fdb1de94c9b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -4011,6 +4011,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 Fri Dec 19 14:21:15 2025 Received: from mail-yw1-f175.google.com (mail-yw1-f175.google.com [209.85.128.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 18BA11E00B4 for ; Thu, 6 Nov 2025 00:26:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388778; cv=none; b=bZNNof3aGP4Zza/x/9z2GViEtD1ahbbXo0CHZZs3bnD3xuk1VFnRyJ6sVd970lCH5AEkcMDLKIEW9Tj9fKHgkcgF+6LXlgIuMUUmTAYq0s3o29nCOMcWKAJlKRFVmV/cqvJiR2bq/uQdKfKsyvAooS3eNw+a+XwkRNiddDvuxwE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762388778; c=relaxed/simple; bh=wGvVM7e8xZCbRb4uflWfr7nVVAQ6uh8PxX4m7dh8VMQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hHA+rwpIO+Bu1qAfCdjN0ESil1g5esQv0ljKwEAn2ubjAXAI2xaXAksApYxXlmux1nu6QyfSqLpYD4My/k6JyJ0s/0cFKv2zWflI4X2nwNcsPTojFSXtwTWYaodkLVuH0sXvjSzrIqg/4sc01kwTcahHcwwa3aI06MfyLKlpdU0= 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=DqJ7nCpw; arc=none smtp.client-ip=209.85.128.175 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="DqJ7nCpw" Received: by mail-yw1-f175.google.com with SMTP id 00721157ae682-78677ff31c2so3623147b3.2 for ; Wed, 05 Nov 2025 16:26:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762388775; x=1762993575; 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=rGlD8g27EXt4mLiXT/5plrbsHpmSwLaKSFuPthIm2Z8=; b=DqJ7nCpwpP6G851RirENXTgAFErtvnG9OOA/hzbsZcCkh4i9khLOqF3IsGnx/c/Ck1 cqZ2psqTdLw5hma8Vj/Yfg1CDd03qTFxzKhG0FyZYmwVW44TTxHOJhFai7P5YDWgQZ44 X6Gq9LQd8spsWZUXPMjRdXAv6aI5ZDmcMl7zILarTjb29ZS0/1gJPdPqI71GpC1LZYvv TzaJmm/2b4TKQgJsdiqDSCXN8ipBIiSmtgegQaKKVVy7KxHogIR8hIBk0W5b3/GA0GMv uIet0WA2EweJuvjZEz/kvr+glBG1adMBV8TwBUui+503LMQNm9BshdHR/+AiI+BMXL0k XZ1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762388775; x=1762993575; 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=rGlD8g27EXt4mLiXT/5plrbsHpmSwLaKSFuPthIm2Z8=; b=gZdAAMgKmG7x3Weirongb+HmnDDP7XIyoRn6RKyjGlodg9F1bBXo1hwj6goykvFjzc i5Q/13EqG/xR1ifPIDEJFGNGTgA+KpL7PXJUv6aktOuCwsaASJFyv5L7TJVpxZxKRLqp u/ZmuTGib82OX4veBSskG5KJqo3B7i1G/vVCZvy61yehEOFs/jQXZA69/5sUD2Df1nrg 9dBI1lLgDldX7lfIi1ApBQLyclmnSkcr3UhMQKFXDMZLHg7ASz/442PXTgLXBS2Ms7uc LFnnwC8nEB97g1uQym8lFaiN6knRtZpVNdM1WM2uTj7lHK/EDu+jcPf6HzowLinRfcbF Yriw== X-Forwarded-Encrypted: i=1; AJvYcCVY1BTQ/g26spbnlbkrGIAM2ocZ1IhZS23KerxYlkaJam90qtInZTlPW4YnuDzFH6oURcpTuoQC/pZTJHQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxnJNyjnEovqRWj/P5KNgz81VlGL4RnDZI2sPvykAryrnZVrRTG bdMDAVfnKp3IeCAHbWfon8KzLrGxF/RYvcYjYelQJ5GyGAAbFKWOPpSe X-Gm-Gg: ASbGnctfDh+/elgYOfpYnVDMa4/eJb52wH6DJ1TRC4dZSGwR7MkumHTrM8OFrxaoQzo X2q59/8qSHjxmyL0qlg4rJm93AX0xpHKGQtt/sU72KaRUcE1TFrZo4y5bKsxZX5jqece3CVBk7y BA6m5iQf9EqRid87BDphskbB9dxhjk8NZWP28YS9F64p/bY+k/wJ+quGqZxGRvHtEXiGrpdWoh5 z4g5B7J2Siylhbt+c54G+DQn+5Pd/0LkbpHEVCWjv4LxHIRP5w0hGHKySjK1j3kF5tjc9Yp/QuW pQ1moqwPnk+OmTeCuUklWK7U/ZucYMqUsfqV3VIz2Fw9bAqj7DSsLqZR4XrXY0rlygGZtUSLJFZ y8J201rctOvuCGTT+yIj76AsNcGm2/7xMGQDsbmWMeNGXIclWY0+m+f8qnImciZhE5N/WCPi6Vk 7NRtNmnV1I X-Google-Smtp-Source: AGHT+IHetxRpnG9cF/Gppc13q63FAvtOFyrYEQ3XG9Moiw5OSk5gaWti/6paiCCz38YCOkTOfMqnKg== X-Received: by 2002:a05:690c:4a04:b0:787:a126:562e with SMTP id 00721157ae682-787a126679dmr29411267b3.34.1762388774969; Wed, 05 Nov 2025 16:26:14 -0800 (PST) Received: from localhost ([2a03:2880:25ff:c::]) by smtp.gmail.com with ESMTPSA id 00721157ae682-787b159c58dsm3439457b3.38.2025.11.05.16.26.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Nov 2025 16:26:14 -0800 (PST) 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 v3 5/5] netdevsim: implement psp device stats Date: Wed, 5 Nov 2025 16:26:06 -0800 Message-ID: <20251106002608.1578518-6-daniel.zahka@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251106002608.1578518-1-daniel.zahka@gmail.com> References: <20251106002608.1578518-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..727da06101ca 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, sizeof(struct psp_dev_stats)); + + 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