From patchwork Tue Jan 23 17:58:28 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joshua Washington X-Patchwork-Id: 136074 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 061D9439AA; Tue, 23 Jan 2024 18:59:22 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2500A41611; Tue, 23 Jan 2024 18:58:55 +0100 (CET) Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) by mails.dpdk.org (Postfix) with ESMTP id 3497742DD0 for ; Tue, 23 Jan 2024 18:58:52 +0100 (CET) Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-5ff85fabbecso61011307b3.3 for ; Tue, 23 Jan 2024 09:58:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706032731; x=1706637531; 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=EJuN+tW/zyBTQLHGt8knX75S1qK+JM8l6q6Qp80Jmpk=; b=Mx+KGsgwK+rrxj+Gv3htNUNbP70uCZWVGohjZEZI2JxocuBgAvpmnxbCmZN9xHrDXc BJxKufTYhaTiSITR7eaWJ99ekkf6CNiEXvi5dNfGEt2Kh1iqsXFM0tBAE6x72LD2G9l1 jAbDTfBPx9Xfu/VZhPiUNbdVUT0+ekUXR+tgcJdT5juIBhym6WvYdrPQlOgYugHCH5et thhs07VxDh67Wti6O2skI//RaRfyzr1CISy9tijC5+84xmQ623WNYTYICXeZU+sFIaD5 H7uSqbHVehMqUO/Qjtdpo6+56En9B+FdzmSX18DnLgEv6Di2ymzdg1Qs7B3wIJ+H/Cjp fegw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706032731; x=1706637531; 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=EJuN+tW/zyBTQLHGt8knX75S1qK+JM8l6q6Qp80Jmpk=; b=MQtPqG2QhNp4m6fr2n7+5jzooDKK0fyzoBtYSS6SgLqYWLSIO2E6/AxU+1Y3ukA2Kx PQ/3gKZ/QLNwxHiRndHLxcoRc+3/Rv+XqZDJIQCccaRIKx8agprRckKYh1kyeva9Sj/T FI1rd9FCEE3eCveQhXusj/2GPlASv4Z+INbNohxex+pn9FBhGernw6Mo3PwXjt+rBhbJ 6X+eeg437faA0enCYcSD1imSEWFc+1BXYhMITLzvE/sio9mLdD46xfhj7SKx4VRrtKmd BbXMeLWlUeSFyta1LflHXudcPvsFrwAbXysfPjK/sORXJyrRI1ujncjWUKW2i4gof62E 4cUA== X-Gm-Message-State: AOJu0YyqUQWiqtihMoIU4w9t3+cBloS+JO8Qg4hDpQfZR+/wjWRTITDk uPx/XRr/Pl/lyfAhnrPfPzMasDRhnSga4l4yKZSsxfVP117RoxhmiTwPN05NUUwkPVZKbVjU58c Q8uhZWLUflg== X-Google-Smtp-Source: AGHT+IFP7r9+5hdayWN+mk+aTTzHK6tvXlFsp9GZhcWipz6vpx9iPczV+ouhgSKujl1DHlEGZXrtXmpeqtReCg== X-Received: from joshwash.sea.corp.google.com ([2620:15c:11c:202:b9a2:fa74:abc3:bc47]) (user=joshwash job=sendgmr) by 2002:a81:5705:0:b0:5ff:770a:15d6 with SMTP id l5-20020a815705000000b005ff770a15d6mr2118491ywb.1.1706032731629; Tue, 23 Jan 2024 09:58:51 -0800 (PST) Date: Tue, 23 Jan 2024 09:58:28 -0800 In-Reply-To: <20240123175831.3219292-1-joshwash@google.com> Mime-Version: 1.0 References: <20240123175831.3219292-1-joshwash@google.com> X-Mailer: git-send-email 2.43.0.429.g432eaa2c6b-goog Message-ID: <20240123175831.3219292-6-joshwash@google.com> Subject: [PATCH v2 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..9c39ce286a 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", + 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