From patchwork Fri Jan 26 17:33:14 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joshua Washington X-Patchwork-Id: 136186 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 C0241439D4; Fri, 26 Jan 2024 18:34:02 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7B59142E41; Fri, 26 Jan 2024 18:33:39 +0100 (CET) Received: from mail-pg1-f201.google.com (mail-pg1-f201.google.com [209.85.215.201]) by mails.dpdk.org (Postfix) with ESMTP id 7AA0042E51 for ; Fri, 26 Jan 2024 18:33:38 +0100 (CET) Received: by mail-pg1-f201.google.com with SMTP id 41be03b00d2f7-5ce632b2adfso747873a12.0 for ; Fri, 26 Jan 2024 09:33:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706290417; x=1706895217; 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=SW3JZkFSSD1naxRvmY8VsdB4LML2W8ItAZao49jLPo0=; b=ySPr8l9p9f0icycPeXfWpfbjfG7xY90WdOAKR7kAUB/9WRUNkZ51f2OvgB0+TyyKXi dWRslHw8rqa3YinfA9khkDntaxYm1lCsDMxPzswvCm5bW6NFtu663kM7Fvebevw0oyfL H8W4MCqQV1vzIJVCJPqQRpm+TrNKNDy1GtSxl1fiUPXIq1GjvhTUR1An22VsOmz0O9E2 atAhGvund0zcVD932QKR9FjA75jnzqf8/Zgs2pZNLIaVWh5bnsXBFzAFSORUMCvuXelu jzW18Wd+uFXdNzeTpAp93zqCtooRCoO/fFmam7OyG1eUOVH7mbfNWqjSzb/MCGzYl+5m qk8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706290417; x=1706895217; 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=SW3JZkFSSD1naxRvmY8VsdB4LML2W8ItAZao49jLPo0=; b=QvT6T5I+Gj3j8vBtpjEDoBoMMkHOLIcpttrvSbrajII5P723b06bZOymvpz7PVNIb+ 8H1qFhnZoYIvTcrQRLyTXpVxr8RqdsKLY18yCJBPsug/x6DjWhfvlP7DvNkzcHeLu0R3 Y0weWI7j0N67p17PdR+cydVLJEjP3q/YfHFmLFlygyfDFjJah05l4inU3ssd4kKFq1ZK F8HHJOlqvBrZaJgbKk9ydPZe4/Ku/rYgZY5FjxKAWhbRhy9byHLiRFjexn7tOtRIxei7 jrtfbl2qtQ+F68fEedk6UZFNnKZYAulWtfqmYP+ZlYc58AWiiVghHWsfijrzK4nHI7A2 UD+Q== X-Gm-Message-State: AOJu0YwfXbtTw5t+ybY2zMrRj7KZeJb4/p2+r4RhGuGqQ41/gL++DWj9 aaQe/ToPviDape4iwnzQhRyf0iWS9p+EXfmljnDtef9XfTc4R3PkVcitKABftfLZrFhbgYfddl6 Uq8uUu9R9qA== X-Google-Smtp-Source: AGHT+IHHDM1lIUN1WN0CdKeULx9z4pz/wXUPgsuJBtHlycMUU3JYH6k8ITwXa+NDvZyXUTY4GKFCWhY136JW3w== X-Received: from joshwash.sea.corp.google.com ([2620:15c:11c:202:32b0:8478:d496:bc49]) (user=joshwash job=sendgmr) by 2002:a65:6699:0:b0:5d8:42ef:9fe4 with SMTP id b25-20020a656699000000b005d842ef9fe4mr479pgw.3.1706290417655; Fri, 26 Jan 2024 09:33:37 -0800 (PST) Date: Fri, 26 Jan 2024 09:33:14 -0800 In-Reply-To: <20240126173317.2779230-1-joshwash@google.com> Mime-Version: 1.0 References: <20240124001501.446195-1-joshwash@google.com> <20240126173317.2779230-1-joshwash@google.com> X-Mailer: git-send-email 2.43.0.429.g432eaa2c6b-goog Message-ID: <20240126173317.2779230-6-joshwash@google.com> Subject: [PATCH v4 5/7] net/gve: RSS redirection table 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 introduces support for updating the RSS redirection table in the GVE PMD through the implementation of rss_reta_update and rss_reta_query. Due to an infrastructure limitation, the RSS hash key must be manually configured before the redirection table can be updated or queried. The redirection table is expected to be exactly 128 bytes. Signed-off-by: Joshua Washington Reviewed-by: Rushil Gupta Reviewed-by: Jeroen de Borst --- drivers/net/gve/gve_ethdev.c | 95 ++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c index 2a68d31808..3b8ec5872d 100644 --- a/drivers/net/gve/gve_ethdev.c +++ b/drivers/net/gve/gve_ethdev.c @@ -770,6 +770,97 @@ gve_rss_hash_conf_get(struct rte_eth_dev *dev, return 0; } +static int +gve_rss_reta_update(struct rte_eth_dev *dev, + struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size) +{ + struct gve_priv *priv = dev->data->dev_private; + struct gve_rss_config gve_rss_conf; + int table_id; + int err; + int i; + + /* RSS key must be set before the redirection table can be set. */ + if (!priv->rss_config.key || priv->rss_config.key_size == 0) { + PMD_DRV_LOG(ERR, "RSS hash key msut be set before the " + "redirection table can be updated."); + return -ENOTSUP; + } + + if (reta_size != GVE_RSS_INDIR_SIZE) { + PMD_DRV_LOG(ERR, "Redirection table must have %hu elements", + (uint16_t)GVE_RSS_INDIR_SIZE); + return -EINVAL; + } + + err = gve_init_rss_config_from_priv(priv, &gve_rss_conf); + if (err) { + PMD_DRV_LOG(ERR, "Error allocating new RSS config."); + return err; + } + + table_id = 0; + for (i = 0; i < priv->rss_config.indir_size; i++) { + int table_entry = i % RTE_ETH_RETA_GROUP_SIZE; + if (reta_conf[table_id].mask & (1ULL << table_entry)) + gve_rss_conf.indir[i] = + reta_conf[table_id].reta[table_entry]; + + if (table_entry == RTE_ETH_RETA_GROUP_SIZE - 1) + table_id++; + } + + err = gve_adminq_configure_rss(priv, &gve_rss_conf); + if (err) + PMD_DRV_LOG(ERR, "Problem configuring RSS with device."); + else + gve_update_priv_rss_config(priv, &gve_rss_conf); + + gve_free_rss_config(&gve_rss_conf); + return err; +} + +static int +gve_rss_reta_query(struct rte_eth_dev *dev, + struct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size) +{ + struct gve_priv *priv = dev->data->dev_private; + int table_id; + int i; + + if (!(dev->data->dev_conf.rxmode.offloads & + RTE_ETH_RX_OFFLOAD_RSS_HASH)) { + PMD_DRV_LOG(ERR, "RSS not configured."); + return -ENOTSUP; + } + + /* RSS key must be set before the redirection table can be queried. */ + if (!priv->rss_config.key) { + PMD_DRV_LOG(ERR, "RSS hash key must be set before the " + "redirection table can be initialized."); + return -ENOTSUP; + } + + if (reta_size != priv->rss_config.indir_size) { + PMD_DRV_LOG(ERR, "RSS redirection table must have %d entries.", + priv->rss_config.indir_size); + return -EINVAL; + } + + table_id = 0; + for (i = 0; i < priv->rss_config.indir_size; i++) { + int table_entry = i % RTE_ETH_RETA_GROUP_SIZE; + if (reta_conf[table_id].mask & (1ULL << table_entry)) + reta_conf[table_id].reta[table_entry] = + priv->rss_config.indir[i]; + + if (table_entry == RTE_ETH_RETA_GROUP_SIZE - 1) + table_id++; + } + + return 0; +} + static const struct eth_dev_ops gve_eth_dev_ops = { .dev_configure = gve_dev_configure, .dev_start = gve_dev_start, @@ -792,6 +883,8 @@ static const struct eth_dev_ops gve_eth_dev_ops = { .xstats_get_names = gve_xstats_get_names, .rss_hash_update = gve_rss_hash_update, .rss_hash_conf_get = gve_rss_hash_conf_get, + .reta_update = gve_rss_reta_update, + .reta_query = gve_rss_reta_query, }; static const struct eth_dev_ops gve_eth_dev_ops_dqo = { @@ -816,6 +909,8 @@ static const struct eth_dev_ops gve_eth_dev_ops_dqo = { .xstats_get_names = gve_xstats_get_names, .rss_hash_update = gve_rss_hash_update, .rss_hash_conf_get = gve_rss_hash_conf_get, + .reta_update = gve_rss_reta_update, + .reta_query = gve_rss_reta_query, }; static void