From patchwork Wed Jan 31 22:13:04 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joshua Washington X-Patchwork-Id: 136241 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 ED2D843A26; Wed, 31 Jan 2024 23:14:08 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3D73842D96; Wed, 31 Jan 2024 23:14:05 +0100 (CET) Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) by mails.dpdk.org (Postfix) with ESMTP id 23E2E402E9 for ; Wed, 31 Jan 2024 23:14:03 +0100 (CET) Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-5dbddee3694so156003a12.1 for ; Wed, 31 Jan 2024 14:14:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706739242; x=1707344042; 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=1k5laEoRzxWBqrRDyEFl5ZSMdsBt3lRyZ9CSh7xNtCU=; b=Yseu+uhr/oDtSKC1ZYWR+wLoUFQCCx5GCfflh36xo2TfizkF2fL53WRUSmClxnwEVO 9eQ4u1GnOiXb7ABwVvSSZWfUqx7OSjisgaTL7lbCB4dUlruKow/xjrOgxTvp34wJusuk GFiO1Fz4lClmDUFdPcU68I5qOqIHtspIKmKPY9w6u+SMQn/V8K9n2MjnoJoyYt0ZcRje 0nlI5gqqlk8l6DV0V+2aPlAhbCL6uax4JSOvYbxOmsxgCG0+LgoZit9scFLmwndUfCDS VamLHAmH8I/dOeytzZFUzJIPESO0C5udJY4m6QLhdmpToN8FvhS7SibB8BrN2JHj96S8 I0aA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706739242; x=1707344042; 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=1k5laEoRzxWBqrRDyEFl5ZSMdsBt3lRyZ9CSh7xNtCU=; b=ObSk12kDE/kGfKd20Ap53L4KP0nKHoKXXqEKd+aaEjjB92keZeVo247yujOE3DnUtE WG54exoX1J7+mX+QZSkAX5MKYYHZHTbMrVSyvvJLAz1gzvxtAxsYuK1Ynyb8LXbJ7i1e inRKzZsi+tesT4s7JuURIsj56c3Csdm/RMOHxHUJ0hUVtTJyqWLqj0Wz1PUTt5VmMnWk 1RUp1zdfaHYKIOckYnEq241qa2fQnOBmr4PknEoKCmoacJb0Jpfqnjhr1mD+eHQ9Hn0P LyUCoxHzDUcIo3riLQX19P6TZTDPvG/H7E3mAAP0ItwJheciCwHCAflizE8k06vdZTiq j5lA== X-Gm-Message-State: AOJu0Yy/j8RBQwR1zmc4nNYlnCYsW2FMh7VmkV8/UV/LKZGiT4KJdBMb HuND0l7IjNQ44uEDtrI6fncJn/xcKcRTdsbwooSDdZCChYcFhueEguhrBU3CNhhKH7FGxiwpiF1 63+ROZjgaFg== X-Google-Smtp-Source: AGHT+IHmjJvTQC9wh6ouh0qLU+HPrshLxp+jPL/Z4e1W/wXTlKBJZ5RqeaRVxMKbToKh7B9+Lh58VScNdd7zNg== X-Received: from joshwash.sea.corp.google.com ([2620:15c:11c:202:9a96:68e3:c6ee:7117]) (user=joshwash job=sendgmr) by 2002:a63:2485:0:b0:5ce:2aa:8988 with SMTP id k127-20020a632485000000b005ce02aa8988mr186137pgk.4.1706739242029; Wed, 31 Jan 2024 14:14:02 -0800 (PST) Date: Wed, 31 Jan 2024 14:13:04 -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-2-joshwash@google.com> Subject: [PATCH v5 1/5] net/gve: expose RSS offload support in dev info 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 communicates that the GVE driver supports RSS, along with the RSS offloads supported by the driver. Signed-off-by: Joshua Washington Reviewed-by: Rushil Gupta Reviewed-by: Jeroen de Borst --- drivers/net/gve/gve_ethdev.c | 4 +++- drivers/net/gve/gve_ethdev.h | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c index d162fd3864..6acdb4e13b 100644 --- a/drivers/net/gve/gve_ethdev.c +++ b/drivers/net/gve/gve_ethdev.c @@ -405,7 +405,7 @@ gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->max_mtu = priv->max_mtu; dev_info->min_mtu = RTE_ETHER_MIN_MTU; - dev_info->rx_offload_capa = 0; + dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_RSS_HASH; dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS | RTE_ETH_TX_OFFLOAD_UDP_CKSUM | @@ -442,6 +442,8 @@ gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) .nb_align = 1, }; + dev_info->flow_type_rss_offloads = GVE_RSS_OFFLOAD_ALL; + return 0; } diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h index 9893fcfee6..14c72ec91a 100644 --- a/drivers/net/gve/gve_ethdev.h +++ b/drivers/net/gve/gve_ethdev.h @@ -33,6 +33,14 @@ RTE_MBUF_F_TX_L4_MASK | \ RTE_MBUF_F_TX_TCP_SEG) +#define GVE_RSS_OFFLOAD_ALL ( \ + RTE_ETH_RSS_IPV4 | \ + RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ + RTE_ETH_RSS_IPV6 | \ + RTE_ETH_RSS_IPV6_EX | \ + RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ + RTE_ETH_RSS_IPV6_TCP_EX) + /* A list of pages registered with the device during setup and used by a queue * as buffers */ From patchwork Wed Jan 31 22:13:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joshua Washington X-Patchwork-Id: 136242 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 E149A43A26; Wed, 31 Jan 2024 23:14:15 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8E89842DC3; Wed, 31 Jan 2024 23:14:07 +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 16F4441148 for ; Wed, 31 Jan 2024 23:14:05 +0100 (CET) Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-295b6b50fc7so1337753a91.0 for ; Wed, 31 Jan 2024 14:14:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706739244; x=1707344044; 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=POJhyYL2qt1wwSc/EhBL2uej9Q0Jjst7QY9PmaHru30=; b=KwzYNYuRp0oYkdigflmR4lTCoRD/h4d/+NUxCyNgqG8KjKxHuEbjimdV8QvgL4whV9 v7XqqgM/ueGBgffGwD0TvhelUTICCZ/CH12O6dfwiaKgC2kL8IVX2vBMe6FfP6s5X3IM kKkYnmCsHuUAHtoBomvUZNn4x8557Z8cq1NcQ62bHNpuI/UP3zT1XwiI4Y+914OYJoAK H3C0WeeWGnwhPeekV1+xY+3pDb+5KK1+oVW+z4vC4lAT4hiRYQxdB3NqPzAgI7yhxz3u GCh78dain2E5JjFBqwk/xar9YoIqLUj8YCwE+ONMdtvoRTOxFvzQ6I1+rZvTz+/Rnw5v 2E5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706739244; x=1707344044; 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=POJhyYL2qt1wwSc/EhBL2uej9Q0Jjst7QY9PmaHru30=; b=V0WSc8Br680qQpAzg00hT/K/P0IY1hGAw61Z6JwmFKowJuU+MfHrgQ7Fu2EH7Zz4h7 hF4ViTDKaqumjhRvzv/ltb47G2Zt447p2E//o3pbgwQAYDVrFkHHa4LJEEnGxNUk40Qp IQjuT9xVXHMpzLAvsyF/oP8V0x/Ljwbkqbo40bPChOcjuwyPH6vwMp1cBPhjat3NVW+7 B8LYKH6+JVXh7fbinJCDKd4Ilp1dCoTBqZ1gA1dXNDdYnZbcSXBRQOhTnRqLjROWCLsP srWAw5+md5GcOUFIwACyfNtdG/fF2eQW5laleRpOrL69OBp2wcNvwWRRCje3bWLZHMeq Oaqw== X-Gm-Message-State: AOJu0YxpGreV5hJxm2gTEaUFwe/8PlWoG4rfLgV350yhRD8JIzKJSFUT PWbc7RyZSL24uef0lj66yMcBVzMa9Ngxhpfe7HwSS0sTQoa8UV9mmYFquipV3dx3v9qYBW6ulFI 4BvlXp9etPA== X-Google-Smtp-Source: AGHT+IGbvuOdaxffV1qqHHgIiZ4pMLFkERW6rwK+SIQPOh6sAhzePy4HJf0o5g5S36XSVdGDlh9wwjI27swu8w== X-Received: from joshwash.sea.corp.google.com ([2620:15c:11c:202:9a96:68e3:c6ee:7117]) (user=joshwash job=sendgmr) by 2002:a17:90b:e85:b0:294:60be:1dde with SMTP id fv5-20020a17090b0e8500b0029460be1ddemr44373pjb.3.1706739244215; Wed, 31 Jan 2024 14:14:04 -0800 (PST) Date: Wed, 31 Jan 2024 14:13:05 -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-3-joshwash@google.com> Subject: [PATCH v5 2/5] net/gve: add RSS adminq command 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 change introduces admin queue changes that enable the configuration of RSS parameters for the GVE driver. Signed-off-by: Joshua Washington Reviewed-by: Rushil Gupta Reviewed-by: Jeroen de Borst --- drivers/net/gve/base/gve.h | 15 ++++++++ drivers/net/gve/base/gve_adminq.c | 58 +++++++++++++++++++++++++++++++ drivers/net/gve/base/gve_adminq.h | 29 ++++++++++++++++ drivers/net/gve/gve_ethdev.h | 6 +++- 4 files changed, 107 insertions(+), 1 deletion(-) diff --git a/drivers/net/gve/base/gve.h b/drivers/net/gve/base/gve.h index f7b297e759..9c58fc4238 100644 --- a/drivers/net/gve/base/gve.h +++ b/drivers/net/gve/base/gve.h @@ -51,4 +51,19 @@ enum gve_state_flags_bit { GVE_PRIV_FLAGS_NAPI_ENABLED = 4, }; +enum gve_rss_hash_algorithm { + GVE_RSS_HASH_UNDEFINED = 0, + GVE_RSS_HASH_TOEPLITZ = 1, +}; + +struct gve_rss_config { + uint16_t hash_types; + enum gve_rss_hash_algorithm alg; + uint16_t key_size; + uint16_t indir_size; + uint8_t *key; + uint32_t *indir; +}; + + #endif /* _GVE_H_ */ diff --git a/drivers/net/gve/base/gve_adminq.c b/drivers/net/gve/base/gve_adminq.c index 343bd13d67..629d15cfbe 100644 --- a/drivers/net/gve/base/gve_adminq.c +++ b/drivers/net/gve/base/gve_adminq.c @@ -389,6 +389,9 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv, case GVE_ADMINQ_DECONFIGURE_DEVICE_RESOURCES: priv->adminq_dcfg_device_resources_cnt++; break; + case GVE_ADMINQ_CONFIGURE_RSS: + priv->adminq_cfg_rss_cnt++; + break; case GVE_ADMINQ_SET_DRIVER_PARAMETER: priv->adminq_set_driver_parameter_cnt++; break; @@ -938,3 +941,58 @@ int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, gve_free_dma_mem(&ptype_map_dma_mem); return err; } + +int gve_adminq_configure_rss(struct gve_priv *priv, + struct gve_rss_config *rss_config) +{ + struct gve_dma_mem indirection_table_dma_mem; + struct gve_dma_mem rss_key_dma_mem; + union gve_adminq_command cmd; + __be32 *indir = NULL; + u8 *key = NULL; + int err = 0; + int i; + + if (!rss_config->indir_size || !rss_config->key_size) + return -EINVAL; + + indir = gve_alloc_dma_mem(&indirection_table_dma_mem, + rss_config->indir_size * + sizeof(*rss_config->indir)); + if (!indir) { + err = -ENOMEM; + goto out; + } + for (i = 0; i < rss_config->indir_size; i++) + indir[i] = cpu_to_be32(rss_config->indir[i]); + + key = gve_alloc_dma_mem(&rss_key_dma_mem, + rss_config->key_size * + sizeof(*rss_config->key)); + if (!key) { + err = -ENOMEM; + goto out; + } + memcpy(key, rss_config->key, rss_config->key_size); + + memset(&cmd, 0, sizeof(cmd)); + cmd.opcode = cpu_to_be32(GVE_ADMINQ_CONFIGURE_RSS); + cmd.configure_rss = (struct gve_adminq_configure_rss) { + .hash_types = cpu_to_be16(rss_config->hash_types), + .halg = rss_config->alg, + .hkey_len = cpu_to_be16(rss_config->key_size), + .indir_len = cpu_to_be16(rss_config->indir_size), + .hkey_addr = cpu_to_be64(rss_key_dma_mem.pa), + .indir_addr = cpu_to_be64(indirection_table_dma_mem.pa), + }; + + err = gve_adminq_execute_cmd(priv, &cmd); + +out: + if (indir) + gve_free_dma_mem(&indirection_table_dma_mem); + if (key) + gve_free_dma_mem(&rss_key_dma_mem); + return err; +} + diff --git a/drivers/net/gve/base/gve_adminq.h b/drivers/net/gve/base/gve_adminq.h index f05362f85f..95f4960561 100644 --- a/drivers/net/gve/base/gve_adminq.h +++ b/drivers/net/gve/base/gve_adminq.h @@ -19,6 +19,7 @@ enum gve_adminq_opcodes { GVE_ADMINQ_DESTROY_TX_QUEUE = 0x7, GVE_ADMINQ_DESTROY_RX_QUEUE = 0x8, GVE_ADMINQ_DECONFIGURE_DEVICE_RESOURCES = 0x9, + GVE_ADMINQ_CONFIGURE_RSS = 0xA, GVE_ADMINQ_SET_DRIVER_PARAMETER = 0xB, GVE_ADMINQ_REPORT_STATS = 0xC, GVE_ADMINQ_REPORT_LINK_SPEED = 0xD, @@ -377,6 +378,27 @@ struct gve_adminq_get_ptype_map { __be64 ptype_map_addr; }; +#define GVE_RSS_HASH_IPV4 BIT(0) +#define GVE_RSS_HASH_TCPV4 BIT(1) +#define GVE_RSS_HASH_IPV6 BIT(2) +#define GVE_RSS_HASH_IPV6_EX BIT(3) +#define GVE_RSS_HASH_TCPV6 BIT(4) +#define GVE_RSS_HASH_TCPV6_EX BIT(5) +#define GVE_RSS_HASH_UDPV4 BIT(6) +#define GVE_RSS_HASH_UDPV6 BIT(7) +#define GVE_RSS_HASH_UDPV6_EX BIT(8) + +/* RSS configuration command */ +struct gve_adminq_configure_rss { + __be16 hash_types; + u8 halg; /* hash algorithm */ + u8 reserved; + __be16 hkey_len; + __be16 indir_len; + __be64 hkey_addr; + __be64 indir_addr; +}; + union gve_adminq_command { struct { __be32 opcode; @@ -391,6 +413,7 @@ union gve_adminq_command { struct gve_adminq_describe_device describe_device; struct gve_adminq_register_page_list reg_page_list; struct gve_adminq_unregister_page_list unreg_page_list; + struct gve_adminq_configure_rss configure_rss; struct gve_adminq_set_driver_parameter set_driver_param; struct gve_adminq_report_stats report_stats; struct gve_adminq_report_link_speed report_link_speed; @@ -404,6 +427,8 @@ union gve_adminq_command { GVE_CHECK_UNION_LEN(64, gve_adminq_command); +struct gve_priv; +struct gve_queue_page_list; int gve_adminq_alloc(struct gve_priv *priv); void gve_adminq_free(struct gve_priv *priv); void gve_adminq_release(struct gve_priv *priv); @@ -433,4 +458,8 @@ int gve_adminq_get_ptype_map_dqo(struct gve_priv *priv, int gve_adminq_verify_driver_compatibility(struct gve_priv *priv, u64 driver_info_len, dma_addr_t driver_info_addr); + +int gve_adminq_configure_rss(struct gve_priv *priv, + struct gve_rss_config *rss_config); + #endif /* _GVE_ADMINQ_H */ diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h index 14c72ec91a..f7635e829c 100644 --- a/drivers/net/gve/gve_ethdev.h +++ b/drivers/net/gve/gve_ethdev.h @@ -39,7 +39,10 @@ RTE_ETH_RSS_IPV6 | \ RTE_ETH_RSS_IPV6_EX | \ RTE_ETH_RSS_NONFRAG_IPV6_TCP | \ - RTE_ETH_RSS_IPV6_TCP_EX) + RTE_ETH_RSS_IPV6_TCP_EX | \ + RTE_ETH_RSS_NONFRAG_IPV4_UDP | \ + RTE_ETH_RSS_NONFRAG_IPV6_UDP | \ + RTE_ETH_RSS_IPV6_UDP_EX) /* A list of pages registered with the device during setup and used by a queue * as buffers @@ -264,6 +267,7 @@ struct gve_priv { uint32_t adminq_destroy_tx_queue_cnt; uint32_t adminq_destroy_rx_queue_cnt; uint32_t adminq_dcfg_device_resources_cnt; + uint32_t adminq_cfg_rss_cnt; uint32_t adminq_set_driver_parameter_cnt; uint32_t adminq_report_stats_cnt; uint32_t adminq_report_link_speed_cnt; From patchwork Wed Jan 31 22:13:06 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joshua Washington X-Patchwork-Id: 136243 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 983D043A26; Wed, 31 Jan 2024 23:14:22 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 02BC44026C; Wed, 31 Jan 2024 23:14:10 +0100 (CET) Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) by mails.dpdk.org (Postfix) with ESMTP id EDB7942DC1 for ; Wed, 31 Jan 2024 23:14:06 +0100 (CET) Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-6dfc22e98ccso995405b3a.1 for ; Wed, 31 Jan 2024 14:14:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706739246; x=1707344046; 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=lE83ibws4iol+07GnUwZfVFlpT4qXWCdez5K1s/6jhI=; b=GualzJV+sksNjgk9Y3NZzt3PJ4nlAr1LvnZ1UH911E5ej/FhexXtSvwlY53wBUA5pq RVUCNFhQq3CcxSG5SrP1sA20qjyVAltYeDR6dhGsNkrfHqUdZW2oll9fOu6IpGNkF4W8 4SGRxP7N+wN59vQr//08uxnwNxtfczJjG7cXCaIomx4hIFGH8fqfahSKGIjHcKdxO44E 5blnx8TGGuoIjRlZA9SaDP4pqlgraNg5rMeyhyDrPLrCFQ79ZpZy/5N2wXi0wDycJuGe MLkHgzf2Y08xIrq9dQFdFGeqomiZxfNTpiEV8PWxhsU8Uy/aI2bED8DkPtctDsoTeXRZ I4sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706739246; x=1707344046; 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=lE83ibws4iol+07GnUwZfVFlpT4qXWCdez5K1s/6jhI=; b=hb9Uwlx80+GwKWvDnL6SDDWWmyoJsBAy7vtzBOoehSbT2Anp83QgatpDT9/ePQH+D9 ZSH12THxdFe3hP0YYAtN3JE57KbtnGeM1YqQmBV25zUWblLLfo9CjqEVha3H13ayJJeJ ItYQH2L0ImiIPOGy5b7TAWpFMZxI6jyzTs9ATk3Zjqx5jcI76rKyi5qSVziaBgE5nL7q IePJ1pq1nWW2D0GG2mkq2KpaOnI7mO0CB2YtKftdt3db9zqe0ELCgLW0aoVHQzGbq9+O 7SL8cyVfPjHxlOcS0jlOtnFpv2PM2TSZdmUPT5fCLIQOxo/BZXfABHc4nkSxcnPIjl8P fetQ== X-Gm-Message-State: AOJu0YyHsmBLG5b+O3dVAOL9DA2qVJFp18W7uLuSDnOy6771uipfT1kF GFs+zUIY19IuCv6LrvrDwxPBi2J3xHudjMgyQe6RGcAv6oLv1CH4f5UKBD6lQdnP8+ZmsnyT24j J2S7nACFSjA== X-Google-Smtp-Source: AGHT+IGkVajay56QcvQ9cEVAbsirkBad89+Sb+LbSmq5ztKiZV3MCU3MBh8HyCaAyfD5IYzOAceHzsz1VJF8mA== X-Received: from joshwash.sea.corp.google.com ([2620:15c:11c:202:9a96:68e3:c6ee:7117]) (user=joshwash job=sendgmr) by 2002:aa7:9ec8:0:b0:6de:1b47:8887 with SMTP id r8-20020aa79ec8000000b006de1b478887mr217857pfq.1.1706739246089; Wed, 31 Jan 2024 14:14:06 -0800 (PST) Date: Wed, 31 Jan 2024 14:13:06 -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-4-joshwash@google.com> Subject: [PATCH v5 3/5] net/gve: add gve RSS library 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 change includes a number of helper functions to facilitate RSS configuration on the GVE DPDK driver. These methods are declared in gve_rss.h. Signed-off-by: Joshua Washington Reviewed-by: Rushil Gupta Reviewed-by: Jeroen de Borst --- drivers/net/gve/base/gve_adminq.h | 10 +- drivers/net/gve/gve_ethdev.c | 2 +- drivers/net/gve/gve_ethdev.h | 4 +- drivers/net/gve/gve_rss.c | 206 ++++++++++++++++++++++++++++++ drivers/net/gve/gve_rss.h | 107 ++++++++++++++++ drivers/net/gve/meson.build | 1 + 6 files changed, 319 insertions(+), 11 deletions(-) create mode 100644 drivers/net/gve/gve_rss.c create mode 100644 drivers/net/gve/gve_rss.h diff --git a/drivers/net/gve/base/gve_adminq.h b/drivers/net/gve/base/gve_adminq.h index 95f4960561..24abd945cc 100644 --- a/drivers/net/gve/base/gve_adminq.h +++ b/drivers/net/gve/base/gve_adminq.h @@ -378,15 +378,6 @@ struct gve_adminq_get_ptype_map { __be64 ptype_map_addr; }; -#define GVE_RSS_HASH_IPV4 BIT(0) -#define GVE_RSS_HASH_TCPV4 BIT(1) -#define GVE_RSS_HASH_IPV6 BIT(2) -#define GVE_RSS_HASH_IPV6_EX BIT(3) -#define GVE_RSS_HASH_TCPV6 BIT(4) -#define GVE_RSS_HASH_TCPV6_EX BIT(5) -#define GVE_RSS_HASH_UDPV4 BIT(6) -#define GVE_RSS_HASH_UDPV6 BIT(7) -#define GVE_RSS_HASH_UDPV6_EX BIT(8) /* RSS configuration command */ struct gve_adminq_configure_rss { @@ -428,6 +419,7 @@ union gve_adminq_command { GVE_CHECK_UNION_LEN(64, gve_adminq_command); struct gve_priv; +struct gve_rss_config; struct gve_queue_page_list; int gve_adminq_alloc(struct gve_priv *priv); void gve_adminq_free(struct gve_priv *priv); diff --git a/drivers/net/gve/gve_ethdev.c b/drivers/net/gve/gve_ethdev.c index 6acdb4e13b..936ca22cb9 100644 --- a/drivers/net/gve/gve_ethdev.c +++ b/drivers/net/gve/gve_ethdev.c @@ -442,7 +442,7 @@ gve_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) .nb_align = 1, }; - dev_info->flow_type_rss_offloads = GVE_RSS_OFFLOAD_ALL; + dev_info->flow_type_rss_offloads = GVE_RTE_RSS_OFFLOAD_ALL; return 0; } diff --git a/drivers/net/gve/gve_ethdev.h b/drivers/net/gve/gve_ethdev.h index f7635e829c..bc486cb941 100644 --- a/drivers/net/gve/gve_ethdev.h +++ b/drivers/net/gve/gve_ethdev.h @@ -33,7 +33,7 @@ RTE_MBUF_F_TX_L4_MASK | \ RTE_MBUF_F_TX_TCP_SEG) -#define GVE_RSS_OFFLOAD_ALL ( \ +#define GVE_RTE_RSS_OFFLOAD_ALL ( \ RTE_ETH_RSS_IPV4 | \ RTE_ETH_RSS_NONFRAG_IPV4_TCP | \ RTE_ETH_RSS_IPV6 | \ @@ -290,6 +290,8 @@ struct gve_priv { const struct rte_memzone *stats_report_mem; uint16_t stats_start_idx; /* start index of array of stats written by NIC */ uint16_t stats_end_idx; /* end index of array of stats written by NIC */ + + struct gve_rss_config rss_config; }; static inline bool diff --git a/drivers/net/gve/gve_rss.c b/drivers/net/gve/gve_rss.c new file mode 100644 index 0000000000..931180f8f2 --- /dev/null +++ b/drivers/net/gve/gve_rss.c @@ -0,0 +1,206 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Google LLC + */ + +#include "gve_rss.h" + +int +gve_generate_rss_reta(struct rte_eth_dev *dev, struct gve_rss_config *config) +{ + int i; + if (!config || !config->indir) + return -EINVAL; + + for (i = 0; i < config->indir_size; i++) + config->indir[i] = i % dev->data->nb_rx_queues; + + return 0; +} + + +int +gve_init_rss_config(struct gve_rss_config *gve_rss_conf, + uint16_t key_size, uint16_t indir_size) +{ + int err; + + gve_rss_conf->alg = GVE_RSS_HASH_TOEPLITZ; + + gve_rss_conf->key_size = key_size; + gve_rss_conf->key = rte_zmalloc("rss key", + key_size * sizeof(*gve_rss_conf->key), + RTE_CACHE_LINE_SIZE); + if (!gve_rss_conf->key) + return -ENOMEM; + + gve_rss_conf->indir_size = indir_size; + gve_rss_conf->indir = rte_zmalloc("rss reta", + indir_size * sizeof(*gve_rss_conf->indir), + RTE_CACHE_LINE_SIZE); + if (!gve_rss_conf->indir) { + err = -ENOMEM; + goto err_with_key; + } + + return 0; +err_with_key: + rte_free(gve_rss_conf->key); + return err; +} + +int +gve_init_rss_config_from_priv(struct gve_priv *priv, + struct gve_rss_config *gve_rss_conf) +{ + int err = gve_init_rss_config(gve_rss_conf, priv->rss_config.key_size, + priv->rss_config.indir_size); + if (err) + return err; + + gve_rss_conf->hash_types = priv->rss_config.hash_types; + gve_rss_conf->alg = priv->rss_config.alg; + memcpy(gve_rss_conf->key, priv->rss_config.key, + gve_rss_conf->key_size * sizeof(*gve_rss_conf->key)); + memcpy(gve_rss_conf->indir, priv->rss_config.indir, + gve_rss_conf->indir_size * sizeof(*gve_rss_conf->indir)); + + return 0; +} + +void +gve_free_rss_config(struct gve_rss_config *gve_rss_conf) +{ + rte_free(gve_rss_conf->indir); + gve_rss_conf->indir = NULL; + rte_free(gve_rss_conf->key); + gve_rss_conf->key = NULL; +} + +int +gve_update_priv_rss_config(struct gve_priv *priv, struct gve_rss_config *config) +{ + struct gve_rss_config *priv_config = &priv->rss_config; + int key_bytes, indir_bytes; + + if (!config) + return -EINVAL; + if (config->key_size == 0 || !config->key) + return -EINVAL; + if (config->indir_size == 0 || !config->indir) + return -EINVAL; + + priv_config->hash_types = config->hash_types; + priv_config->alg = config->alg; + + priv_config->key_size = config->key_size; + key_bytes = priv_config->key_size * sizeof(*priv_config->key); + if (!priv_config->key) + priv_config->key = rte_zmalloc("priv rss key", key_bytes, + RTE_CACHE_LINE_SIZE); + else + priv_config->key = rte_realloc(priv_config->key, key_bytes, + RTE_CACHE_LINE_SIZE); + if (!priv_config->key) + return -ENOMEM; + + priv_config->indir_size = config->indir_size; + indir_bytes = priv_config->indir_size * sizeof(*priv_config->indir); + if (!priv_config->indir) + priv_config->indir = rte_zmalloc("priv rss reta", indir_bytes, + RTE_CACHE_LINE_SIZE); + else + priv_config->indir = rte_realloc(priv_config->indir, + indir_bytes, RTE_CACHE_LINE_SIZE); + + if (!priv_config->indir) + return -ENOMEM; + + memcpy(priv_config->indir, config->indir, + config->indir_size * sizeof(*priv_config->indir)); + memcpy(priv_config->key, config->key, + config->key_size * sizeof(*priv_config->key)); + + return 0; +} + +int +gve_update_rss_key(struct gve_priv *priv, struct gve_rss_config *gve_rss_conf, + struct rte_eth_rss_conf *rss_conf) +{ + if (rss_conf->rss_key_len && rss_conf->rss_key) { + gve_rss_conf->key_size = rss_conf->rss_key_len; + memcpy(gve_rss_conf->key, rss_conf->rss_key, + gve_rss_conf->key_size * sizeof(*gve_rss_conf->key)); + } else if (priv->rss_config.key_size && priv->rss_config.key) { + gve_rss_conf->key_size = priv->rss_config.key_size; + memcpy(gve_rss_conf->key, priv->rss_config.key, + gve_rss_conf->key_size * sizeof(*gve_rss_conf->key)); + } else { + PMD_DRV_LOG(ERR, "RSS key must be set as part of initial RSS " + "configuration."); + return -EINVAL; + } + return 0; +} + +int +gve_update_rss_hash_types(struct gve_priv *priv, + struct gve_rss_config *gve_rss_conf, struct rte_eth_rss_conf *rss_conf) +{ + /* Initialize to 0 before modifying. */ + gve_rss_conf->hash_types = 0; + if (rss_conf->rss_hf) + rte_to_gve_rss_hf(rss_conf->rss_hf, gve_rss_conf); + else if (priv->rss_config.key_size && priv->rss_config.key) + gve_rss_conf->hash_types = priv->rss_config.hash_types; + else + gve_rss_conf->hash_types = GVE_RSS_OFFLOAD_DEFAULT; + return 0; +} + +void +rte_to_gve_rss_hf(uint64_t rte_rss_hf, struct gve_rss_config *gve_rss_conf) +{ + if (rte_rss_hf & RTE_ETH_RSS_IPV4) + gve_rss_conf->hash_types |= GVE_RSS_HASH_IPV4; + if (rte_rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_TCP) + gve_rss_conf->hash_types |= GVE_RSS_HASH_TCPV4; + if (rte_rss_hf & RTE_ETH_RSS_IPV6) + gve_rss_conf->hash_types |= GVE_RSS_HASH_IPV6; + if (rte_rss_hf & RTE_ETH_RSS_IPV6_EX) + gve_rss_conf->hash_types |= GVE_RSS_HASH_IPV6_EX; + if (rte_rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_TCP) + gve_rss_conf->hash_types |= GVE_RSS_HASH_TCPV6; + if (rte_rss_hf & RTE_ETH_RSS_IPV6_TCP_EX) + gve_rss_conf->hash_types |= GVE_RSS_HASH_TCPV6_EX; + if (rte_rss_hf & RTE_ETH_RSS_NONFRAG_IPV4_UDP) + gve_rss_conf->hash_types |= GVE_RSS_HASH_UDPV4; + if (rte_rss_hf & RTE_ETH_RSS_NONFRAG_IPV6_UDP) + gve_rss_conf->hash_types |= GVE_RSS_HASH_UDPV6; + if (rte_rss_hf & RTE_ETH_RSS_IPV6_UDP_EX) + gve_rss_conf->hash_types |= GVE_RSS_HASH_UDPV6_EX; +} + +void +gve_to_rte_rss_hf(uint16_t gve_rss_types, struct rte_eth_rss_conf *rss_conf) +{ + if (gve_rss_types & GVE_RSS_HASH_IPV4) + rss_conf->rss_hf |= RTE_ETH_RSS_IPV4; + if (gve_rss_types & GVE_RSS_HASH_TCPV4) + rss_conf->rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_TCP; + if (gve_rss_types & GVE_RSS_HASH_IPV6) + rss_conf->rss_hf |= RTE_ETH_RSS_IPV6; + if (gve_rss_types & GVE_RSS_HASH_IPV6_EX) + rss_conf->rss_hf |= RTE_ETH_RSS_IPV6_EX; + if (gve_rss_types & GVE_RSS_HASH_TCPV6) + rss_conf->rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_TCP; + if (gve_rss_types & GVE_RSS_HASH_TCPV6_EX) + rss_conf->rss_hf |= RTE_ETH_RSS_IPV6_TCP_EX; + if (gve_rss_types & GVE_RSS_HASH_UDPV4) + rss_conf->rss_hf |= RTE_ETH_RSS_NONFRAG_IPV4_UDP; + if (gve_rss_types & GVE_RSS_HASH_UDPV6) + rss_conf->rss_hf |= RTE_ETH_RSS_NONFRAG_IPV6_UDP; + if (gve_rss_types & GVE_RSS_HASH_UDPV6_EX) + rss_conf->rss_hf |= RTE_ETH_RSS_IPV6_UDP_EX; +} + diff --git a/drivers/net/gve/gve_rss.h b/drivers/net/gve/gve_rss.h new file mode 100644 index 0000000000..0cc235a19a --- /dev/null +++ b/drivers/net/gve/gve_rss.h @@ -0,0 +1,107 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2023 Google LLC + */ + +#include "gve_adminq.h" +#include "gve_ethdev.h" + +#define GVE_RSS_HASH_IPV4 BIT(0) +#define GVE_RSS_HASH_TCPV4 BIT(1) +#define GVE_RSS_HASH_IPV6 BIT(2) +#define GVE_RSS_HASH_IPV6_EX BIT(3) +#define GVE_RSS_HASH_TCPV6 BIT(4) +#define GVE_RSS_HASH_TCPV6_EX BIT(5) +#define GVE_RSS_HASH_UDPV4 BIT(6) +#define GVE_RSS_HASH_UDPV6 BIT(7) +#define GVE_RSS_HASH_UDPV6_EX BIT(8) + +#define GVE_RSS_OFFLOAD_DEFAULT ( \ + GVE_RSS_HASH_IPV4 | \ + GVE_RSS_HASH_TCPV4 | \ + GVE_RSS_HASH_IPV6 | \ + GVE_RSS_HASH_IPV6_EX | \ + GVE_RSS_HASH_TCPV6 | \ + GVE_RSS_HASH_TCPV6_EX | \ + GVE_RSS_HASH_UDPV4 | \ + GVE_RSS_HASH_UDPV6 | \ + GVE_RSS_HASH_UDPV6_EX) + +/** + * Generates default RSS redirection table based on the number of queues the + * device is configured with. This assigns hash values to queues in a + * round-robin manner. + */ +int +gve_generate_rss_reta(struct rte_eth_dev *dev, struct gve_rss_config *config); + +/** + * Initializes `gve_rss_conf`, setting the fields to default values and + * allocating memory for the RSS key and redirection table. + */ +int +gve_init_rss_config(struct gve_rss_config *gve_rss_conf, + uint16_t key_size, uint16_t indir_size); + +/** + * Initializes `gve_rss_conf` based on the RSS configuration stored in `priv`. + */ +int +gve_init_rss_config_from_priv(struct gve_priv *priv, + struct gve_rss_config *gve_rss_conf); + +/** + * Frees RSS key and redriection table pointers stored in `gve_rss_conf`. + */ +void +gve_free_rss_config(struct gve_rss_config *gve_rss_conf); + +/** + * Updates the rss_config stored in `priv` with the contents of `config`. + */ +int +gve_update_priv_rss_config(struct gve_priv *priv, + struct gve_rss_config *config); + +/** + * Updates the RSS key stored in `gve_rss_conf`. It is prioritized as follows: + * 1) retrieve from `rss_conf`, if non-null + * 2) retrieve from `priv`, if non-null + * If keys from both sources are unset, return -EINVAL. + */ +int +gve_update_rss_key(struct gve_priv *priv, struct gve_rss_config *gve_rss_conf, + struct rte_eth_rss_conf *rss_conf); + +/** + * Updates the RSS hash types stored in `gve_rss_conf`. It is prioritized as + * follows: + * 1) retrieve from `rss_conf`, if set + * 2) retrieve from priv, if RSS has been configured + * 3) set default RSS offload + */ +int +gve_update_rss_hash_types(struct gve_priv *priv, + struct gve_rss_config *gve_rss_conf, struct rte_eth_rss_conf *rss_conf); + +/** + * Ensures that only supported RSS hash fields are set in `rte_rss_hf`. + */ +static inline int +gve_validate_rss_hf(uint64_t rte_rss_hf) { + return rte_rss_hf & ~GVE_RTE_RSS_OFFLOAD_ALL; +} + +/** + * Converts RSS hash types from RTE values to GVE values, storing them in + * `gve_rss_conf`. + */ +void +rte_to_gve_rss_hf(uint64_t rte_rss_hf, struct gve_rss_config *gve_rss_conf); + +/** + * Converts RSS hash types from GVE values to RTE values, storing them in + * `rss_conf`. + */ +void +gve_to_rte_rss_hf(uint16_t gve_rss_types, struct rte_eth_rss_conf *rss_conf); + diff --git a/drivers/net/gve/meson.build b/drivers/net/gve/meson.build index 61d195009c..6da13a8406 100644 --- a/drivers/net/gve/meson.build +++ b/drivers/net/gve/meson.build @@ -15,5 +15,6 @@ sources = files( 'gve_tx_dqo.c', 'gve_ethdev.c', 'gve_version.c', + 'gve_rss.c', ) includes += include_directories('base') 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) From patchwork Wed Jan 31 22:13:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joshua Washington X-Patchwork-Id: 136245 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 23AAB43A26; Wed, 31 Jan 2024 23:14:38 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E48EE42DDC; Wed, 31 Jan 2024 23:14:13 +0100 (CET) Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) by mails.dpdk.org (Postfix) with ESMTP id 68C8942DCB for ; Wed, 31 Jan 2024 23:14:10 +0100 (CET) Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-6041c45ce1cso527867b3.1 for ; Wed, 31 Jan 2024 14:14:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1706739250; x=1707344050; 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=pWegFo2mXANUvf5i4pDtGVcxN5FDU1BHvUx/e0NQpYk=; b=IAsgKlBi+YODD+2QffuMa7nR0ctjrTil7MksUc/2DoWmMDcN1lT8RA301w1XO0qp1n h9ybUuIdPlxkighdu3jbqg0ygV/AD/H301DO/PLiEkEhqINUqRG43eJoT2LpznzyGMS6 A6H3Gnbn48iFU/FAQ3izojIryGCKw0LwYfoq4muWeemBNQlNezuc9PZK/DwgmP/qBa1y liyaFb5zCLvKbjexsZ5g/ejfhEDnmd5fEka0+IJYz89oHNgHuR7CCbmBxrYlZRLWvklb hOOkc1DMVBJjcxTompKPzDv4uTj9qxKDPurHRIsh6tr/HkuOnUjm2Gop0xjZ4Yw5xHuf vVWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706739250; x=1707344050; 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=pWegFo2mXANUvf5i4pDtGVcxN5FDU1BHvUx/e0NQpYk=; b=pSL5jXglKwkxsyRMGe+eFc8sCX2kIGlMw7YJrLldJIvXo1hL59VyCdoUsw98givNAy mCyD7eec1gPlzKciC64MuH6uiHwZX5d0LLkybF3/iMJAy9/wtMwbIkUQeaELuG/A3bj+ fPAzeKUJoJFQktfEPa7P7HiOxu4jv0mdO45Csaxt8aRpAxMIDknIv9D/3bWlOnsKEOLB yPyxJxmtPko0FQcE8OL45VMXbjYCUqBLOsNCOOZfdsndjmgjxPO+kurVZ4JnnSBHwn5c RKvofRACDXN7edFn1PVobWh5Z+G0TA4m7JjhoxMP/SIlxIX5NB6gg52PPuKcsi4xvRqU VMpg== X-Gm-Message-State: AOJu0YzZ0VNnzdpe6w0rB9J1/ii/Rd4x0D0ZXs262AtsmNfgWtAHKjSu UtSbpdv5mdqXswEHa0OhugsYZjIzCggZpM5QBeYwdkBPnoT77CNsvwjSvoYrqtjupiFVhVlx1r8 DutW83iaiYg== X-Google-Smtp-Source: AGHT+IEnOEW2qji7tzQd5E4K6bk6jrybQsGRC1WqaMp1mKyq5/IVJvvB9Ay9sgH3LAPlVv6uaeZkexTCxxNqjA== X-Received: from joshwash.sea.corp.google.com ([2620:15c:11c:202:9a96:68e3:c6ee:7117]) (user=joshwash job=sendgmr) by 2002:a05:690c:f8d:b0:5ff:b07b:fb83 with SMTP id df13-20020a05690c0f8d00b005ffb07bfb83mr67683ywb.4.1706739249820; Wed, 31 Jan 2024 14:14:09 -0800 (PST) Date: Wed, 31 Jan 2024 14:13:08 -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-6-joshwash@google.com> Subject: [PATCH v5 5/5] net/gve: add 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 --- doc/guides/nics/features/gve.ini | 1 + doc/guides/nics/gve.rst | 8 +++ drivers/net/gve/gve_ethdev.c | 95 ++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) diff --git a/doc/guides/nics/features/gve.ini b/doc/guides/nics/features/gve.ini index 4381b1565f..8dfa229bb0 100644 --- a/doc/guides/nics/features/gve.ini +++ b/doc/guides/nics/features/gve.ini @@ -10,6 +10,7 @@ MTU update = Y TSO = Y RSS hash = Y RSS key update = Y +RSS reta 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 908b2aab11..69e4eaabdb 100644 --- a/doc/guides/nics/gve.rst +++ b/doc/guides/nics/gve.rst @@ -71,6 +71,7 @@ Supported features of the GVE PMD are: - Tx multi-segments (Scatter Tx) - Tx UDP/TCP/SCTP Checksum - RSS hash configuration +- RSS redirection table query and update Currently, only GQI_QPL and GQI_RDA queue format are supported in PMD. Jumbo Frame is not supported in PMD for now. @@ -92,3 +93,10 @@ 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. +As stated above, the RSS redirection table has exactly 128 entries. The RSS hash +must be configured before the redirection table can be updated using the standard +interface. Because the initial RSS hash creates a default redirection table, the +redirection table will be available for querying upon initial hash configuration. +When performing redirection table updates, it is possible to update individual +table entries. + 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