From patchwork Wed Jan 24 00:14:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joshua Washington X-Patchwork-Id: 136088 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 B40F7439AD; Wed, 24 Jan 2024 01:15:35 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AA87042DE6; Wed, 24 Jan 2024 01:15:14 +0100 (CET) Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) by mails.dpdk.org (Postfix) with ESMTP id 0F53542DD7 for ; Wed, 24 Jan 2024 01:15:14 +0100 (CET) Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-29072b2ac68so1591623a91.1 for ; Tue, 23 Jan 2024 16:15:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706055313; x=1706660113; 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=sRU+XTq0Ie53lOfqNSafM/Z5bS7hwwFGGU3uLu4nNbtGfJcU7teRSYuj+1E9pFx3lj Ja5GdfD7ByR25sLERXcaIIK0vjE84kLhOOUGhVY0vM/aw2Ug1lZF35Oc6H5DJxjdR3Rb lLfoBcvwpseaFMuSL2F24+dHNr1cSQ3ls9bIZq3q7X5kfsTZHxaoI3nrNDpjA87PTL0V vX0/CsEn0MSsZ5E+JMyZEqDia/xF5Q7ABLLrx/6GmYcHoL+AXxkXu0VUbypEOiL3ZXGF LhQRZzjiZ8nR/jM2LywoSklkckUEPnPmgd9PzgKhnHUYJQMjyQ1iGy8xDhaWXqBfl4d4 OKTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706055313; x=1706660113; 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=Pb1MrIxEnCf0ZA1wscfRaHwOmFbue5VMZ6gcJGzH3d20AGd0ppZ4p7ImJ2jGKMXrA8 Td89fktDAW0P8bujX6Gf8zYGkUf/uBOt18H981TNU0yen4pjcP5LqV8PCP4szRudqRM6 vqLum0VmDPiGJbWITDlNKea1c8dxjAk567GMO3ctOxnoAejdjeyDR1sxE/belFow6oQD YNkJPe+tTMqYaJlKlaMgsvMOq2Rmt8WWB5QwrMXJ2vupOXAag3AV9wGSbixBUkO6zfdu SOZZOGzcM/6L+pSGusNS3lu+tpUBoXLPZcdb0Awjwa+nLeG65B+3wCLcrN9y6abVTtxE l2aQ== X-Gm-Message-State: AOJu0YwJ5WoFBemAkB8OCpn+hDj+bTo+ZD1oHVu/uw4FUICOhrAb6WkN qhVnNFSEAKHKgKMOYiKuXeOuK9z73oX1Ev7ePTOiMICe4GUBaD6BXWlrjQJaehyNdSEwVfg44hZ GCFPWwU44XQ== X-Google-Smtp-Source: AGHT+IHDCA2T5nXWeyPGE8jVeqLk7lb7XZMOnBqxohNmpdM039TdSoU54JPuS9PxkZ8vEjNPzQHzszplIVYvsg== X-Received: from joshwash.sea.corp.google.com ([2620:15c:11c:202:b9a2:fa74:abc3:bc47]) (user=joshwash job=sendgmr) by 2002:a17:90a:708b:b0:290:b28e:5bb3 with SMTP id g11-20020a17090a708b00b00290b28e5bb3mr16266pjk.1.1706055313137; Tue, 23 Jan 2024 16:15:13 -0800 (PST) Date: Tue, 23 Jan 2024 16:14:58 -0800 In-Reply-To: <20240124001501.446195-1-joshwash@google.com> Mime-Version: 1.0 References: <20240123175831.3219292-1-joshwash@google.com> <20240124001501.446195-1-joshwash@google.com> X-Mailer: git-send-email 2.43.0.429.g432eaa2c6b-goog Message-ID: <20240124001501.446195-6-joshwash@google.com> Subject: [PATCH v3 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