From nobody Tue Feb 10 04:13:05 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 DCA42C77B6E for ; Wed, 12 Apr 2023 19:50:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230367AbjDLTuW (ORCPT ); Wed, 12 Apr 2023 15:50:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38568 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230167AbjDLTtq (ORCPT ); Wed, 12 Apr 2023 15:49:46 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7F63F2D59 for ; Wed, 12 Apr 2023 12:48:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1681328937; 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=F4P5FHgst54Guyz7AOdIGfebsTZwoSbmDnoCPryHKKQ=; b=JcLKbKg57dBH5pVhRFloBT3oGWd/R23CvVdE0FjaWRyQbkLsJpu+ofm+BGFFLzN1TJbeEB 0SHsBYERDiw/uwPAg0aAPj9VbLxrFPHNcpvK87+DPOJ4Xh88FdkvYWwxac44iP1Wl8hr8M IeoAACs/kp/HAqJIu41DlNTmEqZ6UCM= 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-610-iEaY8LyHOrOP00OkaDD2KA-1; Wed, 12 Apr 2023 15:48:52 -0400 X-MC-Unique: iEaY8LyHOrOP00OkaDD2KA-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DB939101A551; Wed, 12 Apr 2023 19:48:46 +0000 (UTC) Received: from firesoul.localdomain (unknown [10.45.242.24]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6D8FA2166B29; Wed, 12 Apr 2023 19:48:46 +0000 (UTC) Received: from [10.1.1.1] (localhost [IPv6:::1]) by firesoul.localdomain (Postfix) with ESMTP id 838AC307372E8; Wed, 12 Apr 2023 21:48:45 +0200 (CEST) Subject: [PATCH bpf V10 3/6] 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: Wed, 12 Apr 2023 21:48:45 +0200 Message-ID: <168132892548.340624.11185734579430124869.stgit@firesoul> In-Reply-To: <168132888942.340624.2449617439220153267.stgit@firesoul> References: <168132888942.340624.2449617439220153267.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.6 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..d9d3b9e1f15a 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)), +}; + +/* 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,