From patchwork Wed Jan 31 22:13:07 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joshua Washington X-Patchwork-Id: 136244 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8E22643A26; Wed, 31 Jan 2024 23:14:31 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AFE0442DD8; Wed, 31 Jan 2024 23:14:12 +0100 (CET) Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) by mails.dpdk.org (Postfix) with ESMTP id C3A6342DC5 for ; Wed, 31 Jan 2024 23:14:08 +0100 (CET) Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-1d8e7857e11so2624125ad.0 for ; Wed, 31 Jan 2024 14:14:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706739248; x=1707344048; darn=dpdk.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=L3+N8pDDEhbSnokeWzgwRZBeXRsUtfOfGoBLILscGTs=; b=2B6uuZZdhUfA86PngQyIR/ivPpj5+bYqUd2lTXabCWxSEiK5uRJCQNc9O5rYH3hwm2 EsHNZUeH+U3pnMN3bWuAdV63bepM4d5qNuelEvdBmrevqWiK2LecrFBAJFqpTDyS0UNO /UV4GfYOUrui2lDgxTFldd8R9sYumOeGqSiRq0ujKETQrvtZ7ghFw6I9KObPY8B8OS6Z L7kgIdm3uPqWUtWWWXB49Cn3LA68VoE/sABMBMXhPqCeGb9TQ87gEEsKOnfSEZ6/NjgT 0qOXj2q7qoE84xPoiIPSF8vw6zE0aCbVNOuPgAKy3arFOX+6cYs0t4s5Bj9YDvUlAifz 3r+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706739248; x=1707344048; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=L3+N8pDDEhbSnokeWzgwRZBeXRsUtfOfGoBLILscGTs=; b=WB1GAaeCQWy31Xj1/gssnnwqjYxoK7KH4Nslzs4dDYRkAuDhnorsFaS3UCK1b/Uv4I fGwvuCo5TQIGpWLSwfXRdiknfOk5SSC1rxSZWesO6mAGdYxd5GJ++1875Ag5b+FfJ0Cc D7Cxox4PE+VkfO9sM9SHpyVVGGZ/jTFOd6z8Sl2GM+KwueVoKLjeiH4ZrbQUyD8Lnb4u u5lX7dxfOZsI4V7Rp4Hcb9JgcPhYb8WACpJJ44J4mDweV1LLgC9jj9lC84xSb7jj+MeV JBfawhpKUBmmUhNWzcLT/7/MgdnCIQ5yT5gL9aa2psRfEs5RAdcAnZacKTRRpAYEHNlY zJSg== X-Gm-Message-State: AOJu0YwkEWs8bPFaogaX9Apwub/Z0v9jFgkeZ93sK4mD/gxOmOT9trWx wbWmqC9aN/m8z0Hbr5qE6hpPBjTNIbrlyRFl4wd23GU3aZ5ge9R3xPzS7J72zx1WR2duIKl+JZI b1cEO7BpcWQ== X-Google-Smtp-Source: AGHT+IFHKLeAm2NyFPIBp91G9A2+HstA75OqAR9YN9p4JxJ41aWYKSM1109BQsii/y4z6TFgkjGcUpZeUgBmiA== X-Received: from joshwash.sea.corp.google.com ([2620:15c:11c:202:9a96:68e3:c6ee:7117]) (user=joshwash job=sendgmr) by 2002:a17:903:208b:b0:1d8:e4b8:95d1 with SMTP id d11-20020a170903208b00b001d8e4b895d1mr8234plc.2.1706739247984; Wed, 31 Jan 2024 14:14:07 -0800 (PST) Date: Wed, 31 Jan 2024 14:13:07 -0800 In-Reply-To: <20240131221308.2208815-1-joshwash@google.com> Mime-Version: 1.0 References: <20240126173317.2779230-2-joshwash@google.com> <20240131221308.2208815-1-joshwash@google.com> X-Mailer: git-send-email 2.43.0.429.g432eaa2c6b-goog Message-ID: <20240131221308.2208815-5-joshwash@google.com> Subject: [PATCH v5 4/5] net/gve: add RSS configuration update support From: Joshua Washington To: Junfeng Guo , Jeroen de Borst , Rushil Gupta , Joshua Washington Cc: dev@dpdk.org, Ferruh Yigit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This patch adds support for updating the RSS hash key and hash fields in the GVE PMD through the implementation of rss_hash_update and rss_hash_conf_get. The RSS hash key for gVNIC is required to be 40 bytes. On initial configuration of the RSS hash key, the RSS redirection table will be set to a static default, using a round-robin approach for all queues. Note, however, that this patch does not include support for setting the redirection table explicitly. In dev_configure, if the static redirection table has been set, it will be updated to reflect the new queue count, if it has changed. The RSS key must be set before any other RSS configuration can happen. As such, an attempt to set the hash types before the key is configured will fail. Signed-off-by: Joshua Washington Reviewed-by: Rushil Gupta Reviewed-by: Jeroen de Borst --- doc/guides/nics/features/gve.ini | 1 + doc/guides/nics/gve.rst | 20 +++-- drivers/net/gve/gve_ethdev.c | 132 ++++++++++++++++++++++++++++++- drivers/net/gve/gve_ethdev.h | 3 + 4 files changed, 148 insertions(+), 8 deletions(-) diff --git a/doc/guides/nics/features/gve.ini b/doc/guides/nics/features/gve.ini index 838edd456a..4381b1565f 100644 --- a/doc/guides/nics/features/gve.ini +++ b/doc/guides/nics/features/gve.ini @@ -9,6 +9,7 @@ Link status = Y MTU update = Y TSO = Y RSS hash = Y +RSS key update = Y L4 checksum offload = Y Basic stats = Y Linux = Y diff --git a/doc/guides/nics/gve.rst b/doc/guides/nics/gve.rst index 1c3eaf03ef..908b2aab11 100644 --- a/doc/guides/nics/gve.rst +++ b/doc/guides/nics/gve.rst @@ -70,6 +70,7 @@ Supported features of the GVE PMD are: - Link state information - Tx multi-segments (Scatter Tx) - Tx UDP/TCP/SCTP Checksum +- RSS hash configuration Currently, only GQI_QPL and GQI_RDA queue format are supported in PMD. Jumbo Frame is not supported in PMD for now. @@ -77,10 +78,17 @@ It'll be added in a future DPDK release. Also, only GQI_QPL queue format is in use on GCP since GQI_RDA hasn't been released in production. -Currently, setting MTU with value larger than 1460 is not supported. +RSS +^^^ + +GVE RSS can be enabled and configured using the standard interfaces. The driver +does not support querying the initial RSS configuration. + +The RSS hash key must be exactly 40 bytes. Upon RSS hash configuration, a +default redirection table will be set using a round-robin assignment of hash +values to queues. The default GVE redirection table has 128 entries. + +Note that the initial configuration requires a hash key to be provided if one +had not been provided before. Attempting to set hash types alone without the +existence of a set key will result in a failed request. -Currently, only "RSS hash" is force enabled -so that the backend hardware device calculated hash values -could be shared with applications. -But for RSS, there is no such API to config RSS hash function or RETA table. -So, limited RSS is supported only with default config/setting. diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c index 936ca22cb9..2a68d31808 100644 --- a/drivers/net/gve/gve_ethdev.c +++ b/drivers/net/gve/gve_ethdev.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(C) 2022 Intel Corporation + * Copyright(C) 2022-2023 Intel Corporation + * Copyright(C) 2023 Google LLC */ #include "gve_ethdev.h" @@ -8,6 +9,7 @@ #include "base/gve_osdep.h" #include "gve_version.h" #include "rte_ether.h" +#include "gve_rss.h" static void gve_write_version(uint8_t *driver_version_register) @@ -88,12 +90,31 @@ gve_dev_configure(struct rte_eth_dev *dev) { struct gve_priv *priv = dev->data->dev_private; - if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) + if (dev->data->dev_conf.rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) { dev->data->dev_conf.rxmode.offloads |= RTE_ETH_RX_OFFLOAD_RSS_HASH; + priv->rss_config.alg = GVE_RSS_HASH_TOEPLITZ; + } if (dev->data->dev_conf.rxmode.offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO) priv->enable_rsc = 1; + /* Reset RSS RETA in case number of queues changed. */ + if (priv->rss_config.indir) { + struct gve_rss_config update_reta_config; + gve_init_rss_config_from_priv(priv, &update_reta_config); + gve_generate_rss_reta(dev, &update_reta_config); + + int err = gve_adminq_configure_rss(priv, &update_reta_config); + if (err) + PMD_DRV_LOG(ERR, + "Could not reconfigure RSS redirection table."); + else + gve_update_priv_rss_config(priv, &update_reta_config); + + gve_free_rss_config(&update_reta_config); + return err; + } + return 0; } @@ -443,6 +464,8 @@ gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) }; dev_info->flow_type_rss_offloads = GVE_RTE_RSS_OFFLOAD_ALL; + dev_info->hash_key_size = GVE_RSS_HASH_KEY_SIZE; + dev_info->reta_size = GVE_RSS_INDIR_SIZE; return 0; } @@ -646,6 +669,107 @@ gve_xstats_get_names(struct rte_eth_dev *dev, return count; } + +static int +gve_rss_hash_update(struct rte_eth_dev *dev, + struct rte_eth_rss_conf *rss_conf) +{ + struct gve_priv *priv = dev->data->dev_private; + struct gve_rss_config gve_rss_conf; + int rss_reta_size; + int err; + + if (gve_validate_rss_hf(rss_conf->rss_hf)) { + PMD_DRV_LOG(ERR, "Unsupported hash function."); + return -EINVAL; + } + + if (rss_conf->algorithm != RTE_ETH_HASH_FUNCTION_TOEPLITZ && + rss_conf->algorithm != RTE_ETH_HASH_FUNCTION_DEFAULT) { + PMD_DRV_LOG(ERR, "Device only supports Toeplitz algorithm."); + return -EINVAL; + } + + if (rss_conf->rss_key_len) { + if (rss_conf->rss_key_len != GVE_RSS_HASH_KEY_SIZE) { + PMD_DRV_LOG(ERR, + "Invalid hash key size. Only RSS hash key size " + "of %u supported", GVE_RSS_HASH_KEY_SIZE); + return -EINVAL; + } + + if (!rss_conf->rss_key) { + PMD_DRV_LOG(ERR, "RSS key must be non-null."); + return -EINVAL; + } + } else { + if (!priv->rss_config.key_size) { + PMD_DRV_LOG(ERR, "RSS key must be initialized before " + "any other configuration."); + return -EINVAL; + } + rss_conf->rss_key_len = priv->rss_config.key_size; + } + + rss_reta_size = priv->rss_config.indir ? + priv->rss_config.indir_size : + GVE_RSS_INDIR_SIZE; + err = gve_init_rss_config(&gve_rss_conf, rss_conf->rss_key_len, + rss_reta_size); + if (err) + return err; + + gve_rss_conf.alg = GVE_RSS_HASH_TOEPLITZ; + err = gve_update_rss_hash_types(priv, &gve_rss_conf, rss_conf); + if (err) + goto err; + err = gve_update_rss_key(priv, &gve_rss_conf, rss_conf); + if (err) + goto err; + + /* Set redirection table to default or preexisting. */ + if (!priv->rss_config.indir) + gve_generate_rss_reta(dev, &gve_rss_conf); + else + memcpy(gve_rss_conf.indir, priv->rss_config.indir, + gve_rss_conf.indir_size * sizeof(*priv->rss_config.indir)); + + err = gve_adminq_configure_rss(priv, &gve_rss_conf); + if (!err) + gve_update_priv_rss_config(priv, &gve_rss_conf); + +err: + gve_free_rss_config(&gve_rss_conf); + return err; +} + +static int +gve_rss_hash_conf_get(struct rte_eth_dev *dev, + struct rte_eth_rss_conf *rss_conf) +{ + struct gve_priv *priv = dev->data->dev_private; + + if (!(dev->data->dev_conf.rxmode.offloads & + RTE_ETH_RX_OFFLOAD_RSS_HASH)) { + PMD_DRV_LOG(ERR, "RSS not configured."); + return -ENOTSUP; + } + + + gve_to_rte_rss_hf(priv->rss_config.hash_types, rss_conf); + rss_conf->rss_key_len = priv->rss_config.key_size; + if (rss_conf->rss_key) { + if (!priv->rss_config.key) { + PMD_DRV_LOG(ERR, "Unable to retrieve default RSS hash key."); + return -ENOTSUP; + } + memcpy(rss_conf->rss_key, priv->rss_config.key, + rss_conf->rss_key_len * sizeof(*rss_conf->rss_key)); + } + + return 0; +} + static const struct eth_dev_ops gve_eth_dev_ops = { .dev_configure = gve_dev_configure, .dev_start = gve_dev_start, @@ -666,6 +790,8 @@ static const struct eth_dev_ops gve_eth_dev_ops = { .mtu_set = gve_dev_mtu_set, .xstats_get = gve_xstats_get, .xstats_get_names = gve_xstats_get_names, + .rss_hash_update = gve_rss_hash_update, + .rss_hash_conf_get = gve_rss_hash_conf_get, }; static const struct eth_dev_ops gve_eth_dev_ops_dqo = { @@ -688,6 +814,8 @@ static const struct eth_dev_ops gve_eth_dev_ops_dqo = { .mtu_set = gve_dev_mtu_set, .xstats_get = gve_xstats_get, .xstats_get_names = gve_xstats_get_names, + .rss_hash_update = gve_rss_hash_update, + .rss_hash_conf_get = gve_rss_hash_conf_get, }; static void diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h index bc486cb941..d713657d10 100644 --- a/drivers/net/gve/gve_ethdev.h +++ b/drivers/net/gve/gve_ethdev.h @@ -29,6 +29,9 @@ #define GVE_RX_MIN_BUF_SIZE_GQI 2048 #define GVE_RX_MAX_BUF_SIZE_GQI 4096 +#define GVE_RSS_HASH_KEY_SIZE 40 +#define GVE_RSS_INDIR_SIZE 128 + #define GVE_TX_CKSUM_OFFLOAD_MASK ( \ RTE_MBUF_F_TX_L4_MASK | \ RTE_MBUF_F_TX_TCP_SEG)