From patchwork Thu Nov 23 17:38:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrien Mazarguil X-Patchwork-Id: 31609 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 764C5377A; Thu, 23 Nov 2017 18:38:17 +0100 (CET) Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by dpdk.org (Postfix) with ESMTP id EDD2D2C39 for ; Thu, 23 Nov 2017 18:38:14 +0100 (CET) Received: by mail-wm0-f65.google.com with SMTP id v186so18046056wma.2 for ; Thu, 23 Nov 2017 09:38:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=Q4/Jhalf2CMcT7KdtnQPcA8PQ/56qgjeH7SZ/7Vk1FE=; b=ayLOxOUiApq3lr8b7XErHJm95YNv8V3eeECDv5qVSLBjFtKkHp+1FgsMsumOM4m4se qdN5JebgOLgCFeBL6k4WdtKlT+Vl385ytrsciNkFOLH3LkIVU3JiSgMs9TSue9vvoikX z5EhXVj3fUa2aC2mbzCdKvJja1ggNbZcG6zsW7Z6ZN3EcUx+ChxHwQQv+PdopkZmhk7f OaTC9ZLkkTThTwN8Se6gVeIToxUCMQX5H5jH6ZZiDO0xBJyyg/5wQa/BQuSZpgZSgdRj 8MmE8NbSQISurJ2ttrv2cl0MICdR587Di6kZGvx3pr1Cd9jMCM0oyCWJOR6lhYv+CUvV +XmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=Q4/Jhalf2CMcT7KdtnQPcA8PQ/56qgjeH7SZ/7Vk1FE=; b=lV2lQTSxgirGIx0AepEFnWlQ4c4rPgqnda0RjsGiBQGykiQ0Bo0bhl69qAEiW1hQMm cdWjkk9SHkAXypAwnh0LyVZPwPCm46sSODzHi/wXDIMbyN3HtASEXmVTSDLNQl+AIBmY 14Gs3N9i1j46QwO4e9gHdzb6BuBRfQhtRxL7DyV1Aq/+O09Jo4Hv3VnBdxu3xoGK4AGo di0hX8ktC6+MYM2mqdQ7Lz/f9MgD0Fv+HO17KiIXsdOfEMoKr4GhSOJRj3Mql2kCPNpD tqDVMfj0WqMbQrJPPagseuxVnk08yzDJaz4ReaOwjpCD4AtLAyK2dk3BaUqs0S/68hnP mlNQ== X-Gm-Message-State: AJaThX6BSTyeo6fzHCmt+buSWMKQ1vxoXRDwVk7O4Wqnh1VzVfmeFv5d agYInBW8D0SKiLrQFSdp7q93ZQ== X-Google-Smtp-Source: AGs4zMb+8d/mVdQhBMojQBCVAI0KYDelazoPR7yEeoqMLeWdXPMUhATQpfc+iOHyis6tHvBUdzSaXA== X-Received: by 10.80.244.16 with SMTP id r16mr35600796edm.26.1511458694380; Thu, 23 Nov 2017 09:38:14 -0800 (PST) Received: from 6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id w13sm6669901eda.63.2017.11.23.09.38.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 23 Nov 2017 09:38:13 -0800 (PST) Date: Thu, 23 Nov 2017 18:38:02 +0100 From: Adrien Mazarguil To: Shahaf Shuler Cc: Ferruh Yigit , dev@dpdk.org, stable@dpdk.org, Neil Horman Message-ID: <20171123172640.28827-5-adrien.mazarguil@6wind.com> References: <1511272929-17955-1-git-send-email-adrien.mazarguil@6wind.com> <20171123172640.28827-1-adrien.mazarguil@6wind.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20171123172640.28827-1-adrien.mazarguil@6wind.com> X-Mailer: git-send-email 2.11.0 Subject: [dpdk-dev] [PATCH v2 4/5] net/mlx4: restore UDP RSS by probing capabilities X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Until now, UDP RSS support could not be relied on due to a problem in the Linux kernel implementation and mlx4 RSS capabilities were not reported at all, hence the PMD had to make assumptions. Since both issues will be addressed simultaneously in Linux 4.15 (related patches already upstream) and likely backported afterward, UDP RSS support can be enabled by probing RSS capabilities. Signed-off-by: Adrien Mazarguil Acked-by: Neil Horman --- drivers/net/mlx4/mlx4.c | 20 ++++++++++++++++++++ drivers/net/mlx4/mlx4.h | 1 + drivers/net/mlx4/mlx4_flow.c | 27 +++++++++++++++------------ drivers/net/mlx4/mlx4_flow.h | 1 + 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index f9e4f9d73..025b88766 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -426,6 +426,7 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) int err = 0; struct ibv_context *attr_ctx = NULL; struct ibv_device_attr device_attr; + struct ibv_device_attr_ex device_attr_ex; struct mlx4_conf conf = { .ports.present = 0, }; @@ -499,6 +500,11 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) /* Use all ports when none are defined */ if (!conf.ports.enabled) conf.ports.enabled = conf.ports.present; + /* Retrieve extended device attributes. */ + if (ibv_query_device_ex(attr_ctx, NULL, &device_attr_ex)) { + rte_errno = ENODEV; + goto error; + } for (i = 0; i < device_attr.phys_port_cnt; i++) { uint32_t port = i + 1; /* ports are indexed from one */ struct ibv_context *ctx = NULL; @@ -573,6 +579,20 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev) PCI_DEVICE_ID_MELLANOX_CONNECTX3PRO); DEBUG("L2 tunnel checksum offloads are %ssupported", (priv->hw_csum_l2tun ? "" : "not ")); + priv->hw_rss_sup = device_attr_ex.rss_caps.rx_hash_fields_mask; + if (!priv->hw_rss_sup) { + WARN("no RSS capabilities reported; disabling support" + " for UDP RSS"); + /* Fake support for all possible RSS hash fields. */ + priv->hw_rss_sup = ~UINT64_C(0); + priv->hw_rss_sup = mlx4_conv_rss_hf(priv, -1); + /* Filter out known unsupported fields. */ + priv->hw_rss_sup &= + ~(uint64_t)(IBV_RX_HASH_SRC_PORT_UDP | + IBV_RX_HASH_DST_PORT_UDP); + } + DEBUG("supported RSS hash fields mask: %016" PRIx64, + priv->hw_rss_sup); /* Configure the first MAC address by default. */ if (mlx4_get_mac(priv, &mac.addr_bytes)) { ERROR("cannot get MAC address, is mlx4_en loaded?" diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 77218580e..e5ab934c1 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h @@ -128,6 +128,7 @@ struct priv { uint32_t isolated:1; /**< Toggle isolated mode. */ uint32_t hw_csum:1; /**< Checksum offload is supported. */ uint32_t hw_csum_l2tun:1; /**< Checksum support for L2 tunnels. */ + uint64_t hw_rss_sup; /**< Supported RSS hash fields (Verbs format). */ struct rte_intr_handle intr_handle; /**< Port interrupt handle. */ struct mlx4_drop *drop; /**< Shared resources for drop flow rules. */ LIST_HEAD(, mlx4_rss) rss; /**< Shared targets for Rx flow rules. */ diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c index 7397dde26..a41d99dd8 100644 --- a/drivers/net/mlx4/mlx4_flow.c +++ b/drivers/net/mlx4/mlx4_flow.c @@ -108,6 +108,8 @@ struct mlx4_drop { * This function returns the supported (default) set when @p rss_hf has * special value (uint64_t)-1. * + * @param priv + * Pointer to private structure. * @param rss_hf * Hash fields in DPDK format (see struct rte_eth_rss_conf). * @@ -115,8 +117,8 @@ struct mlx4_drop { * A valid Verbs RSS hash fields mask for mlx4 on success, (uint64_t)-1 * otherwise and rte_errno is set. */ -static uint64_t -mlx4_conv_rss_hf(uint64_t rss_hf) +uint64_t +mlx4_conv_rss_hf(struct priv *priv, uint64_t rss_hf) { enum { IPV4, IPV6, TCP, UDP, }; const uint64_t in[] = { @@ -136,11 +138,9 @@ mlx4_conv_rss_hf(uint64_t rss_hf) [TCP] = (ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_IPV6_TCP_EX), - /* - * UDP support is temporarily disabled due to an - * implementation issue in the kernel. - */ - [UDP] = 0, + [UDP] = (ETH_RSS_NONFRAG_IPV4_UDP | + ETH_RSS_NONFRAG_IPV6_UDP | + ETH_RSS_IPV6_UDP_EX), }; const uint64_t out[RTE_DIM(in)] = { [IPV4] = IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4, @@ -157,10 +157,12 @@ mlx4_conv_rss_hf(uint64_t rss_hf) seen |= rss_hf & in[i]; conv |= out[i]; } - if (rss_hf == (uint64_t)-1) - return conv; - if (!(rss_hf & ~seen)) - return conv; + if ((conv & priv->hw_rss_sup) == conv) { + if (rss_hf == (uint64_t)-1) + return conv; + if (!(rss_hf & ~seen)) + return conv; + } rte_errno = ENOTSUP; return (uint64_t)-1; } @@ -803,7 +805,8 @@ mlx4_flow_prepare(struct priv *priv, goto exit_action_not_supported; } flow->rss = mlx4_rss_get - (priv, mlx4_conv_rss_hf(rss_conf->rss_hf), + (priv, + mlx4_conv_rss_hf(priv, rss_conf->rss_hf), rss_conf->rss_key, rss->num, rss->queue); if (!flow->rss) { msg = "either invalid parameters or not enough" diff --git a/drivers/net/mlx4/mlx4_flow.h b/drivers/net/mlx4/mlx4_flow.h index 651fd37b6..b10c4f552 100644 --- a/drivers/net/mlx4/mlx4_flow.h +++ b/drivers/net/mlx4/mlx4_flow.h @@ -75,6 +75,7 @@ struct rte_flow { /* mlx4_flow.c */ +uint64_t mlx4_conv_rss_hf(struct priv *priv, uint64_t rss_hf); int mlx4_flow_sync(struct priv *priv, struct rte_flow_error *error); void mlx4_flow_clean(struct priv *priv); int mlx4_filter_ctrl(struct rte_eth_dev *dev,