From nobody Wed Feb 11 16:49:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1619FC7619A for ; Sat, 8 Apr 2023 19:27:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229615AbjDHT1H (ORCPT ); Sat, 8 Apr 2023 15:27:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59040 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229898AbjDHT0x (ORCPT ); Sat, 8 Apr 2023 15:26:53 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4A0FCBBBE for ; Sat, 8 Apr 2023 12:25:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1680981902; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i3MHHqoOS7n/QXgQznavf8gFNBnx4z6OXd+WEJfItp8=; b=PvEeRrgO4bD5iwqCXqZtnl7pPZGOEOZglASXEEg9RQvFVMBU3UWTFF1jA59ZAmsh9L0fgL AqkK7U1EOZFgJncizOC5J8IBKKXmCLy29e/wTL2zgPFZ0Lc/uUaxAZrQQ2+BaTdTlvl7DE 45kAeOKMUHK/AVNbcXGnk3lWRnRJVqc= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-597-EatmRXSMPrCruMM2aeOZ3A-1; Sat, 08 Apr 2023 15:24:59 -0400 X-MC-Unique: EatmRXSMPrCruMM2aeOZ3A-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id EB58B185A78F; Sat, 8 Apr 2023 19:24:57 +0000 (UTC) Received: from firesoul.localdomain (unknown [10.45.242.3]) by smtp.corp.redhat.com (Postfix) with ESMTP id 80AB214171BF; Sat, 8 Apr 2023 19:24:57 +0000 (UTC) Received: from [10.1.1.1] (localhost [IPv6:::1]) by firesoul.localdomain (Postfix) with ESMTP id 96876307372E8; Sat, 8 Apr 2023 21:24:56 +0200 (CEST) Subject: [PATCH bpf V7 4/7] mlx5: bpf_xdp_metadata_rx_hash add xdp rss hash type From: Jesper Dangaard Brouer To: bpf@vger.kernel.org, Stanislav Fomichev , =?utf-8?q?Toke_H=C3=B8iland-J=C3=B8rgensen?= Cc: Jesper Dangaard Brouer , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, martin.lau@kernel.org, ast@kernel.org, daniel@iogearbox.net, alexandr.lobakin@intel.com, larysa.zaremba@intel.com, xdp-hints@xdp-project.net, anthony.l.nguyen@intel.com, yoong.siang.song@intel.com, boon.leong.ong@intel.com, intel-wired-lan@lists.osuosl.org, pabeni@redhat.com, jesse.brandeburg@intel.com, kuba@kernel.org, edumazet@google.com, john.fastabend@gmail.com, hawk@kernel.org, davem@davemloft.net, tariqt@nvidia.com, saeedm@nvidia.com, leon@kernel.org, linux-rdma@vger.kernel.org Date: Sat, 08 Apr 2023 21:24:56 +0200 Message-ID: <168098189656.96582.16141211495116669329.stgit@firesoul> In-Reply-To: <168098183268.96582.7852359418481981062.stgit@firesoul> References: <168098183268.96582.7852359418481981062.stgit@firesoul> User-Agent: StGit/1.4 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.7 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Update API for bpf_xdp_metadata_rx_hash() with arg for xdp rss hash type via mapping table. The mlx5 hardware can also identify and RSS hash IPSEC. This indicate hash includes SPI (Security Parameters Index) as part of IPSEC hash. Extend xdp core enum xdp_rss_hash_type with IPSEC hash type. Fixes: bc8d405b1ba9 ("net/mlx5e: Support RX XDP metadata") Signed-off-by: Jesper Dangaard Brouer Acked-by: Toke H=C3=B8iland-J=C3=B8rgensen Acked-by: Stanislav Fomichev --- drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c | 60 ++++++++++++++++++= ++++ include/linux/mlx5/device.h | 14 ++++- include/net/xdp.h | 2 + 3 files changed, 73 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c b/drivers/net= /ethernet/mellanox/mlx5/core/en/xdp.c index efe609f8e3aa..97ef1df94d50 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c @@ -34,6 +34,7 @@ #include #include "en/xdp.h" #include "en/params.h" +#include =20 int mlx5e_xdp_max_mtu(struct mlx5e_params *params, struct mlx5e_xsk_param = *xsk) { @@ -169,15 +170,72 @@ static int mlx5e_xdp_rx_timestamp(const struct xdp_md= *ctx, u64 *timestamp) return 0; } =20 +/* Mapping HW RSS Type bits CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 into 4-bit= s*/ +#define RSS_TYPE_MAX_TABLE 16 /* 4-bits max 16 entries */ +#define RSS_L4 GENMASK(1, 0) +#define RSS_L3 GENMASK(3, 2) /* Same as CQE_RSS_HTYPE_IP */ + +/* Valid combinations of CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 sorted numeri= cal */ +enum mlx5_rss_hash_type { + RSS_TYPE_NO_HASH =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IP_NONE) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), + RSS_TYPE_L3_IPV4 =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), + RSS_TYPE_L4_IPV4_TCP =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), + RSS_TYPE_L4_IPV4_UDP =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), + RSS_TYPE_L4_IPV4_IPSEC =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), + RSS_TYPE_L3_IPV6 =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), + RSS_TYPE_L4_IPV6_TCP =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), + RSS_TYPE_L4_IPV6_UDP =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), + RSS_TYPE_L4_IPV6_IPSEC =3D (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), +} mlx5_rss_hash_type; + +/* Invalid combinations will simply return zero, allows no boundary checks= */ +static const enum xdp_rss_hash_type mlx5_xdp_rss_type[RSS_TYPE_MAX_TABLE] = =3D { + [RSS_TYPE_NO_HASH] =3D XDP_RSS_TYPE_NONE, + [1] =3D XDP_RSS_TYPE_NONE, /* Implicit zero */ + [2] =3D XDP_RSS_TYPE_NONE, /* Implicit zero */ + [3] =3D XDP_RSS_TYPE_NONE, /* Implicit zero */ + [RSS_TYPE_L3_IPV4] =3D XDP_RSS_TYPE_L3_IPV4, + [RSS_TYPE_L4_IPV4_TCP] =3D XDP_RSS_TYPE_L4_IPV4_TCP, + [RSS_TYPE_L4_IPV4_UDP] =3D XDP_RSS_TYPE_L4_IPV4_UDP, + [RSS_TYPE_L4_IPV4_IPSEC] =3D XDP_RSS_TYPE_L4_IPV4_IPSEC, + [RSS_TYPE_L3_IPV6] =3D XDP_RSS_TYPE_L3_IPV6, + [RSS_TYPE_L4_IPV6_TCP] =3D XDP_RSS_TYPE_L4_IPV6_TCP, + [RSS_TYPE_L4_IPV6_UDP] =3D XDP_RSS_TYPE_L4_IPV6_UDP, + [RSS_TYPE_L4_IPV6_IPSEC] =3D XDP_RSS_TYPE_L4_IPV6_IPSEC, + [12] =3D XDP_RSS_TYPE_NONE, /* Implicit zero */ + [13] =3D XDP_RSS_TYPE_NONE, /* Implicit zero */ + [14] =3D XDP_RSS_TYPE_NONE, /* Implicit zero */ + [15] =3D XDP_RSS_TYPE_NONE, /* Implicit zero */ +}; + static int mlx5e_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash, enum xdp_rss_hash_type *rss_type) { const struct mlx5e_xdp_buff *_ctx =3D (void *)ctx; + const struct mlx5_cqe64 *cqe =3D _ctx->cqe; + u32 hash_type, l4_type, ip_type, lookup; =20 if (unlikely(!(_ctx->xdp.rxq->dev->features & NETIF_F_RXHASH))) return -ENODATA; =20 - *hash =3D be32_to_cpu(_ctx->cqe->rss_hash_result); + *hash =3D be32_to_cpu(cqe->rss_hash_result); + + hash_type =3D cqe->rss_hash_type; + BUILD_BUG_ON(CQE_RSS_HTYPE_IP !=3D RSS_L3); /* same mask */ + ip_type =3D hash_type & CQE_RSS_HTYPE_IP; + l4_type =3D FIELD_GET(CQE_RSS_HTYPE_L4, hash_type); + lookup =3D ip_type | l4_type; + *rss_type =3D mlx5_xdp_rss_type[lookup]; + return 0; } =20 diff --git a/include/linux/mlx5/device.h b/include/linux/mlx5/device.h index 71b06ebad402..1db19a9d26e3 100644 --- a/include/linux/mlx5/device.h +++ b/include/linux/mlx5/device.h @@ -36,6 +36,7 @@ #include #include #include +#include =20 #if defined(__LITTLE_ENDIAN) #define MLX5_SET_HOST_ENDIANNESS 0 @@ -980,14 +981,23 @@ enum { }; =20 enum { - CQE_RSS_HTYPE_IP =3D 0x3 << 2, + CQE_RSS_HTYPE_IP =3D GENMASK(3, 2), /* cqe->rss_hash_type[3:2] - IP destination selected for hash * (00 =3D none, 01 =3D IPv4, 10 =3D IPv6, 11 =3D Reserved) */ - CQE_RSS_HTYPE_L4 =3D 0x3 << 6, + CQE_RSS_IP_NONE =3D 0x0, + CQE_RSS_IPV4 =3D 0x1, + CQE_RSS_IPV6 =3D 0x2, + CQE_RSS_RESERVED =3D 0x3, + + CQE_RSS_HTYPE_L4 =3D GENMASK(7, 6), /* cqe->rss_hash_type[7:6] - L4 destination selected for hash * (00 =3D none, 01 =3D TCP. 10 =3D UDP, 11 =3D IPSEC.SPI */ + CQE_RSS_L4_NONE =3D 0x0, + CQE_RSS_L4_TCP =3D 0x1, + CQE_RSS_L4_UDP =3D 0x2, + CQE_RSS_L4_IPSEC =3D 0x3, }; =20 enum { diff --git a/include/net/xdp.h b/include/net/xdp.h index a76c4ea203ea..76aa748e7923 100644 --- a/include/net/xdp.h +++ b/include/net/xdp.h @@ -460,10 +460,12 @@ enum xdp_rss_hash_type { XDP_RSS_TYPE_L4_IPV4_TCP =3D XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L= 4_TCP, XDP_RSS_TYPE_L4_IPV4_UDP =3D XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L= 4_UDP, XDP_RSS_TYPE_L4_IPV4_SCTP =3D XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L= 4_SCTP, + XDP_RSS_TYPE_L4_IPV4_IPSEC =3D XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L= 4_IPSEC, =20 XDP_RSS_TYPE_L4_IPV6_TCP =3D XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L= 4_TCP, XDP_RSS_TYPE_L4_IPV6_UDP =3D XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L= 4_UDP, XDP_RSS_TYPE_L4_IPV6_SCTP =3D XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L= 4_SCTP, + XDP_RSS_TYPE_L4_IPV6_IPSEC =3D XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L= 4_IPSEC, =20 XDP_RSS_TYPE_L4_IPV6_TCP_EX =3D XDP_RSS_TYPE_L4_IPV6_TCP | XDP_RSS_L3_D= YNHDR, XDP_RSS_TYPE_L4_IPV6_UDP_EX =3D XDP_RSS_TYPE_L4_IPV6_UDP | XDP_RSS_L3_D= YNHDR,