From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adrien Mazarguil Subject: [PATCH] net/mlx4: fix undefined behavior of RSS conversion Date: Tue, 22 May 2018 13:26:44 +0200 Message-ID: <20180522112533.2785-1-adrien.mazarguil@6wind.com> References: <20180521154829.6297-2-adrien.mazarguil@6wind.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Ferruh Yigit , dev@dpdk.org To: Shahaf Shuler Return-path: Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by dpdk.org (Postfix) with ESMTP id C86C41F1C for ; Tue, 22 May 2018 13:27:00 +0200 (CEST) Received: by mail-wm0-f68.google.com with SMTP id f8-v6so32574475wmc.4 for ; Tue, 22 May 2018 04:27:00 -0700 (PDT) Content-Disposition: inline In-Reply-To: <20180521154829.6297-2-adrien.mazarguil@6wind.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" As reported by ICC, an array initializer that uses values found in the array being initialized, although semantically correct (GCC and clang do not complain and generate correct code), results in undefined behavior since initialization order is itself undefined. This patch restores the static keyword and initializes array entries with constant expressions as a safety measure. Fixes: f76ccd763422 ("net/mlx4: refactor RSS conversion functions") Reported-by: Ferruh Yigit Signed-off-by: Adrien Mazarguil -- Shahaf, Ferruh, please remove the "Note the loss of the [...]" paragraph of the original commit if this patch gets squashed in it, as it is no longer relevant in that case. --- drivers/net/mlx4/mlx4_flow.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c index ddb7108dc..b40e7e5c3 100644 --- a/drivers/net/mlx4/mlx4_flow.c +++ b/drivers/net/mlx4/mlx4_flow.c @@ -103,6 +103,12 @@ mlx4_conv_rss_types(struct priv *priv, uint64_t types, int verbs_to_dpdk) TCP, UDP, IPV4_TCP, IPV4_UDP, IPV6_TCP, IPV6_TCP_1, IPV6_UDP, IPV6_UDP_1, }; + enum { + VERBS_IPV4 = IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4, + VERBS_IPV6 = IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6, + VERBS_TCP = IBV_RX_HASH_SRC_PORT_TCP | IBV_RX_HASH_DST_PORT_TCP, + VERBS_UDP = IBV_RX_HASH_SRC_PORT_UDP | IBV_RX_HASH_DST_PORT_UDP, + }; static const uint64_t dpdk[] = { [INNER] = 0, [IPV4] = ETH_RSS_IPV4, @@ -121,23 +127,23 @@ mlx4_conv_rss_types(struct priv *priv, uint64_t types, int verbs_to_dpdk) [IPV6_UDP] = ETH_RSS_NONFRAG_IPV6_UDP, [IPV6_UDP_1] = ETH_RSS_IPV6_UDP_EX, }; - const uint64_t verbs[RTE_DIM(dpdk)] = { + static const uint64_t verbs[RTE_DIM(dpdk)] = { [INNER] = IBV_RX_HASH_INNER, - [IPV4] = IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4, - [IPV4_1] = verbs[IPV4], - [IPV4_2] = verbs[IPV4], - [IPV6] = IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6, - [IPV6_1] = verbs[IPV6], - [IPV6_2] = verbs[IPV6], - [IPV6_3] = verbs[IPV6], - [TCP] = IBV_RX_HASH_SRC_PORT_TCP | IBV_RX_HASH_DST_PORT_TCP, - [UDP] = IBV_RX_HASH_SRC_PORT_UDP | IBV_RX_HASH_DST_PORT_UDP, - [IPV4_TCP] = verbs[IPV4] | verbs[TCP], - [IPV4_UDP] = verbs[IPV4] | verbs[UDP], - [IPV6_TCP] = verbs[IPV6] | verbs[TCP], - [IPV6_TCP_1] = verbs[IPV6_TCP], - [IPV6_UDP] = verbs[IPV6] | verbs[UDP], - [IPV6_UDP_1] = verbs[IPV6_UDP], + [IPV4] = VERBS_IPV4, + [IPV4_1] = VERBS_IPV4, + [IPV4_2] = VERBS_IPV4, + [IPV6] = VERBS_IPV6, + [IPV6_1] = VERBS_IPV6, + [IPV6_2] = VERBS_IPV6, + [IPV6_3] = VERBS_IPV6, + [TCP] = VERBS_TCP, + [UDP] = VERBS_UDP, + [IPV4_TCP] = VERBS_IPV4 | VERBS_TCP, + [IPV4_UDP] = VERBS_IPV4 | VERBS_UDP, + [IPV6_TCP] = VERBS_IPV6 | VERBS_TCP, + [IPV6_TCP_1] = VERBS_IPV6 | VERBS_TCP, + [IPV6_UDP] = VERBS_IPV6 | VERBS_UDP, + [IPV6_UDP_1] = VERBS_IPV6 | VERBS_UDP, }; const uint64_t *in = verbs_to_dpdk ? verbs : dpdk; const uint64_t *out = verbs_to_dpdk ? dpdk : verbs; -- 2.11.0