From patchwork Mon Oct 18 10:20:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 101957 X-Patchwork-Delegate: maxime.coquelin@redhat.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 663D0A0C43; Mon, 18 Oct 2021 12:21:18 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AF874410E9; Mon, 18 Oct 2021 12:21:14 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id EEB1D40DF5 for ; Mon, 18 Oct 2021 12:21:12 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634552472; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=XTib+ZvKN0NhdoGHOz/V0ctm/es05FCREyqKP+F4X4Y=; b=UC++XTALgjxv7WBYQjeyI1mN04gJ3nO7GGBfZ6fV7AFCwK0Nka8Z03txnaJE+0Z2U65E7P Grre1chdojErDgwnaQOlh8aQHRqEMed5jC6ywXsHvAsF6VlOOPTDwfX6dHJZTT/+8Sf4nq Mku1JiTjhVF2mVBNPa/ov/RXWOKibhY= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-350-8BsdYNUvPV2S279-ELc2Gw-1; Mon, 18 Oct 2021 06:21:09 -0400 X-MC-Unique: 8BsdYNUvPV2S279-ELc2Gw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9B8351009444; Mon, 18 Oct 2021 10:21:07 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id BB4A222719; Mon, 18 Oct 2021 10:21:04 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, amorenoz@redhat.com, david.marchand@redhat.com, andrew.rybchenko@oktetlabs.ru, ferruh.yigit@intel.com, michaelba@nvidia.com, viacheslavo@nvidia.com, xiaoyun.li@intel.com Cc: nelio.laranjeiro@6wind.com, yvugenfi@redhat.com, ybendito@redhat.com, Maxime Coquelin Date: Mon, 18 Oct 2021 12:20:41 +0200 Message-Id: <20211018102045.255831-2-maxime.coquelin@redhat.com> In-Reply-To: <20211018102045.255831-1-maxime.coquelin@redhat.com> References: <20211018102045.255831-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v5 1/5] net/virtio: add initial RSS support 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 Sender: "dev" Provide the capability to update the hash key, hash types and RETA table on the fly (without needing to stop/start the device). However, the key length and the number of RETA entries are fixed to 40B and 128 entries respectively. This is done in order to simplify the design, but may be revisited later as the Virtio spec provides this flexibility. Note that only VIRTIO_NET_F_RSS support is implemented, VIRTIO_NET_F_HASH_REPORT, which would enable reporting the packet RSS hash calculated by the device into mbuf.rss, is not yet supported. Regarding the default RSS configuration, it has been chosen to use the default Intel ixgbe key as default key, and default RETA is a simple modulo between the hash and the number of Rx queues. Signed-off-by: Maxime Coquelin Reviewed-by: Chenbo Xia --- doc/guides/nics/features/virtio.ini | 3 + doc/guides/nics/virtio.rst | 3 + doc/guides/rel_notes/release_21_11.rst | 6 + drivers/net/virtio/virtio.h | 31 +- drivers/net/virtio/virtio_ethdev.c | 394 ++++++++++++++++++++++++- drivers/net/virtio/virtio_ethdev.h | 3 +- drivers/net/virtio/virtqueue.h | 25 ++ 7 files changed, 456 insertions(+), 9 deletions(-) diff --git a/doc/guides/nics/features/virtio.ini b/doc/guides/nics/features/virtio.ini index 48f6f393b1..a5eab4932f 100644 --- a/doc/guides/nics/features/virtio.ini +++ b/doc/guides/nics/features/virtio.ini @@ -14,6 +14,9 @@ Promiscuous mode = Y Allmulticast mode = Y Unicast MAC filter = Y Multicast MAC filter = Y +RSS hash = P +RSS key update = Y +RSS reta update = Y VLAN filter = Y Basic stats = Y Stats per queue = Y diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst index 82ce7399ce..98e0d012b7 100644 --- a/doc/guides/nics/virtio.rst +++ b/doc/guides/nics/virtio.rst @@ -73,6 +73,9 @@ In this release, the virtio PMD driver provides the basic functionality of packe * Virtio supports using port IO to get PCI resource when UIO module is not available. +* Virtio supports RSS Rx mode with 40B configurable hash key length, 128 + configurable RETA entries and configurable hash types. + Prerequisites ------------- diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index ec2a788789..6e2c7df4b9 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -194,6 +194,12 @@ New Features * Added tests to verify tunnel header verification in IPsec inbound. * Added tests to verify inner checksum. +* **Added initial RSS support to Virtio PMD.** + + Initial support for RSS receive mode has been added to the Virtio PMD, + with the capability for the application to configure the hash key, the + RETA and the hash types. Virtio hash reporting is yet to be added. + Removed Items ------------- diff --git a/drivers/net/virtio/virtio.h b/drivers/net/virtio/virtio.h index e78b2e429e..7118e5d24c 100644 --- a/drivers/net/virtio/virtio.h +++ b/drivers/net/virtio/virtio.h @@ -30,6 +30,7 @@ #define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce device on the network */ #define VIRTIO_NET_F_MQ 22 /* Device supports Receive Flow Steering */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 23 /* Set MAC address */ +#define VIRTIO_NET_F_RSS 60 /* RSS supported */ /* * Do we get callbacks when the ring is completely used, @@ -100,6 +101,29 @@ */ #define VIRTIO_MAX_INDIRECT ((int)(rte_mem_page_size() / 16)) +/* Virtio RSS hash types */ +#define VIRTIO_NET_HASH_TYPE_IPV4 (1 << 0) +#define VIRTIO_NET_HASH_TYPE_TCPV4 (1 << 1) +#define VIRTIO_NET_HASH_TYPE_UDPV4 (1 << 2) +#define VIRTIO_NET_HASH_TYPE_IPV6 (1 << 3) +#define VIRTIO_NET_HASH_TYPE_TCPV6 (1 << 4) +#define VIRTIO_NET_HASH_TYPE_UDPV6 (1 << 5) +#define VIRTIO_NET_HASH_TYPE_IP_EX (1 << 6) +#define VIRTIO_NET_HASH_TYPE_TCP_EX (1 << 7) +#define VIRTIO_NET_HASH_TYPE_UDP_EX (1 << 8) + +#define VIRTIO_NET_HASH_TYPE_MASK ( \ + VIRTIO_NET_HASH_TYPE_IPV4 | \ + VIRTIO_NET_HASH_TYPE_TCPV4 | \ + VIRTIO_NET_HASH_TYPE_UDPV4 | \ + VIRTIO_NET_HASH_TYPE_IPV6 | \ + VIRTIO_NET_HASH_TYPE_TCPV6 | \ + VIRTIO_NET_HASH_TYPE_UDPV6 | \ + VIRTIO_NET_HASH_TYPE_IP_EX | \ + VIRTIO_NET_HASH_TYPE_TCP_EX | \ + VIRTIO_NET_HASH_TYPE_UDP_EX) + + /* * Maximum number of virtqueues per device. */ @@ -157,7 +181,9 @@ struct virtio_net_config { * Any other value stands for unknown. */ uint8_t duplex; - + uint8_t rss_max_key_size; + uint16_t rss_max_indirection_table_length; + uint32_t supported_hash_types; } __rte_packed; struct virtio_hw { @@ -190,6 +216,9 @@ struct virtio_hw { rte_spinlock_t state_lock; struct rte_mbuf **inject_pkts; uint16_t max_queue_pairs; + uint32_t rss_hash_types; + uint16_t *rss_reta; + uint8_t *rss_key; uint64_t req_guest_features; struct virtnet_ctl *cvq; bool use_va; diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index aff791fbd0..a8e2bf3e1a 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -51,6 +51,16 @@ static int virtio_dev_info_get(struct rte_eth_dev *dev, static int virtio_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete); static int virtio_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask); +static int virtio_dev_rss_hash_update(struct rte_eth_dev *dev, + struct rte_eth_rss_conf *rss_conf); +static int virtio_dev_rss_hash_conf_get(struct rte_eth_dev *dev, + struct rte_eth_rss_conf *rss_conf); +static int virtio_dev_rss_reta_update(struct rte_eth_dev *dev, + struct rte_eth_rss_reta_entry64 *reta_conf, + uint16_t reta_size); +static int virtio_dev_rss_reta_query(struct rte_eth_dev *dev, + struct rte_eth_rss_reta_entry64 *reta_conf, + uint16_t reta_size); static void virtio_set_hwaddr(struct virtio_hw *hw); static void virtio_get_hwaddr(struct virtio_hw *hw); @@ -347,20 +357,51 @@ virtio_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl, } static int -virtio_set_multiple_queues(struct rte_eth_dev *dev, uint16_t nb_queues) +virtio_set_multiple_queues_rss(struct rte_eth_dev *dev, uint16_t nb_queues) { struct virtio_hw *hw = dev->data->dev_private; struct virtio_pmd_ctrl ctrl; - int dlen[1]; + struct virtio_net_ctrl_rss rss; + int dlen, ret; + + rss.hash_types = hw->rss_hash_types & VIRTIO_NET_HASH_TYPE_MASK; + rss.indirection_table_mask = VIRTIO_NET_RSS_RETA_SIZE - 1; + rss.unclassified_queue = 0; + memcpy(rss.indirection_table, hw->rss_reta, VIRTIO_NET_RSS_RETA_SIZE * sizeof(uint16_t)); + rss.max_tx_vq = nb_queues; + rss.hash_key_length = VIRTIO_NET_RSS_KEY_SIZE; + memcpy(rss.hash_key_data, hw->rss_key, VIRTIO_NET_RSS_KEY_SIZE); + + ctrl.hdr.class = VIRTIO_NET_CTRL_MQ; + ctrl.hdr.cmd = VIRTIO_NET_CTRL_MQ_RSS_CONFIG; + memcpy(ctrl.data, &rss, sizeof(rss)); + + dlen = sizeof(rss); + + ret = virtio_send_command(hw->cvq, &ctrl, &dlen, 1); + if (ret) { + PMD_INIT_LOG(ERR, "RSS multiqueue configured but send command failed"); + return -EINVAL; + } + + return 0; +} + +static int +virtio_set_multiple_queues_auto(struct rte_eth_dev *dev, uint16_t nb_queues) +{ + struct virtio_hw *hw = dev->data->dev_private; + struct virtio_pmd_ctrl ctrl; + int dlen; int ret; ctrl.hdr.class = VIRTIO_NET_CTRL_MQ; ctrl.hdr.cmd = VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET; memcpy(ctrl.data, &nb_queues, sizeof(uint16_t)); - dlen[0] = sizeof(uint16_t); + dlen = sizeof(uint16_t); - ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1); + ret = virtio_send_command(hw->cvq, &ctrl, &dlen, 1); if (ret) { PMD_INIT_LOG(ERR, "Multiqueue configured but send command " "failed, this is too late now..."); @@ -370,6 +411,17 @@ virtio_set_multiple_queues(struct rte_eth_dev *dev, uint16_t nb_queues) return 0; } +static int +virtio_set_multiple_queues(struct rte_eth_dev *dev, uint16_t nb_queues) +{ + struct virtio_hw *hw = dev->data->dev_private; + + if (virtio_with_feature(hw, VIRTIO_NET_F_RSS)) + return virtio_set_multiple_queues_rss(dev, nb_queues); + else + return virtio_set_multiple_queues_auto(dev, nb_queues); +} + static uint16_t virtio_get_nr_vq(struct virtio_hw *hw) { @@ -708,6 +760,16 @@ virtio_alloc_queues(struct rte_eth_dev *dev) static void virtio_queues_unbind_intr(struct rte_eth_dev *dev); +static void +virtio_free_rss(struct virtio_hw *hw) +{ + rte_free(hw->rss_key); + hw->rss_key = NULL; + + rte_free(hw->rss_reta); + hw->rss_reta = NULL; +} + int virtio_dev_close(struct rte_eth_dev *dev) { @@ -738,6 +800,7 @@ virtio_dev_close(struct rte_eth_dev *dev) virtio_reset(hw); virtio_dev_free_mbufs(dev); virtio_free_queues(hw); + virtio_free_rss(hw); return VIRTIO_OPS(hw)->dev_close(hw); } @@ -976,6 +1039,10 @@ static const struct eth_dev_ops virtio_eth_dev_ops = { .rx_queue_intr_enable = virtio_dev_rx_queue_intr_enable, .rx_queue_intr_disable = virtio_dev_rx_queue_intr_disable, .tx_queue_setup = virtio_dev_tx_queue_setup, + .rss_hash_update = virtio_dev_rss_hash_update, + .rss_hash_conf_get = virtio_dev_rss_hash_conf_get, + .reta_update = virtio_dev_rss_reta_update, + .reta_query = virtio_dev_rss_reta_query, /* collect stats per queue */ .queue_stats_mapping_set = virtio_dev_queue_stats_mapping_set, .vlan_filter_set = virtio_vlan_filter_set, @@ -1719,6 +1786,291 @@ virtio_configure_intr(struct rte_eth_dev *dev) return 0; } + +static uint64_t +ethdev_to_virtio_rss_offloads(uint64_t ethdev_hash_types) +{ + uint64_t virtio_hash_types = 0; + + if (ethdev_hash_types & (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | ETH_RSS_NONFRAG_IPV4_OTHER)) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_IPV4; + + if (ethdev_hash_types & ETH_RSS_NONFRAG_IPV4_TCP) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_TCPV4; + + if (ethdev_hash_types & ETH_RSS_NONFRAG_IPV4_UDP) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_UDPV4; + + if (ethdev_hash_types & (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_OTHER)) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_IPV6; + + if (ethdev_hash_types & ETH_RSS_NONFRAG_IPV6_TCP) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_TCPV6; + + if (ethdev_hash_types & ETH_RSS_NONFRAG_IPV6_UDP) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_UDPV6; + + if (ethdev_hash_types & ETH_RSS_IPV6_EX) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_IP_EX; + + if (ethdev_hash_types & ETH_RSS_IPV6_TCP_EX) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_TCP_EX; + + if (ethdev_hash_types & ETH_RSS_IPV6_UDP_EX) + virtio_hash_types |= VIRTIO_NET_HASH_TYPE_UDP_EX; + + return virtio_hash_types; +} + +static uint64_t +virtio_to_ethdev_rss_offloads(uint64_t virtio_hash_types) +{ + uint64_t rss_offloads = 0; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_IPV4) + rss_offloads |= ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | ETH_RSS_NONFRAG_IPV4_OTHER; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_TCPV4) + rss_offloads |= ETH_RSS_NONFRAG_IPV4_TCP; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_UDPV4) + rss_offloads |= ETH_RSS_NONFRAG_IPV4_UDP; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_IPV6) + rss_offloads |= ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_OTHER; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_TCPV6) + rss_offloads |= ETH_RSS_NONFRAG_IPV6_TCP; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_UDPV6) + rss_offloads |= ETH_RSS_NONFRAG_IPV6_UDP; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_IP_EX) + rss_offloads |= ETH_RSS_IPV6_EX; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_TCP_EX) + rss_offloads |= ETH_RSS_IPV6_TCP_EX; + + if (virtio_hash_types & VIRTIO_NET_HASH_TYPE_UDP_EX) + rss_offloads |= ETH_RSS_IPV6_UDP_EX; + + return rss_offloads; +} + +static int +virtio_dev_get_rss_config(struct virtio_hw *hw, uint32_t *rss_hash_types) +{ + struct virtio_net_config local_config; + struct virtio_net_config *config = &local_config; + + virtio_read_dev_config(hw, + offsetof(struct virtio_net_config, rss_max_key_size), + &config->rss_max_key_size, + sizeof(config->rss_max_key_size)); + if (config->rss_max_key_size < VIRTIO_NET_RSS_KEY_SIZE) { + PMD_INIT_LOG(ERR, "Invalid device RSS max key size (%u)", + config->rss_max_key_size); + return -EINVAL; + } + + virtio_read_dev_config(hw, + offsetof(struct virtio_net_config, + rss_max_indirection_table_length), + &config->rss_max_indirection_table_length, + sizeof(config->rss_max_indirection_table_length)); + if (config->rss_max_indirection_table_length < VIRTIO_NET_RSS_RETA_SIZE) { + PMD_INIT_LOG(ERR, "Invalid device RSS max reta size (%u)", + config->rss_max_indirection_table_length); + return -EINVAL; + } + + virtio_read_dev_config(hw, + offsetof(struct virtio_net_config, supported_hash_types), + &config->supported_hash_types, + sizeof(config->supported_hash_types)); + if ((config->supported_hash_types & VIRTIO_NET_HASH_TYPE_MASK) == 0) { + PMD_INIT_LOG(ERR, "Invalid device RSS hash types (0x%x)", + config->supported_hash_types); + return -EINVAL; + } + + *rss_hash_types = config->supported_hash_types & VIRTIO_NET_HASH_TYPE_MASK; + + PMD_INIT_LOG(DEBUG, "Device RSS config:"); + PMD_INIT_LOG(DEBUG, "\t-Max key size: %u", config->rss_max_key_size); + PMD_INIT_LOG(DEBUG, "\t-Max reta size: %u", config->rss_max_indirection_table_length); + PMD_INIT_LOG(DEBUG, "\t-Supported hash types: 0x%x", *rss_hash_types); + + return 0; +} + +static int +virtio_dev_rss_hash_update(struct rte_eth_dev *dev, + struct rte_eth_rss_conf *rss_conf) +{ + struct virtio_hw *hw = dev->data->dev_private; + uint16_t nb_queues; + + if (!virtio_with_feature(hw, VIRTIO_NET_F_RSS)) + return -ENOTSUP; + + if (rss_conf->rss_hf & ~virtio_to_ethdev_rss_offloads(VIRTIO_NET_HASH_TYPE_MASK)) + return -EINVAL; + + hw->rss_hash_types = ethdev_to_virtio_rss_offloads(rss_conf->rss_hf); + + if (rss_conf->rss_key && rss_conf->rss_key_len) { + if (rss_conf->rss_key_len != VIRTIO_NET_RSS_KEY_SIZE) { + PMD_INIT_LOG(ERR, "Driver only supports %u RSS key length", + VIRTIO_NET_RSS_KEY_SIZE); + return -EINVAL; + } + memcpy(hw->rss_key, rss_conf->rss_key, VIRTIO_NET_RSS_KEY_SIZE); + } + + nb_queues = RTE_MAX(dev->data->nb_rx_queues, dev->data->nb_tx_queues); + return virtio_set_multiple_queues_rss(dev, nb_queues); +} + +static int +virtio_dev_rss_hash_conf_get(struct rte_eth_dev *dev, + struct rte_eth_rss_conf *rss_conf) +{ + struct virtio_hw *hw = dev->data->dev_private; + + if (!virtio_with_feature(hw, VIRTIO_NET_F_RSS)) + return -ENOTSUP; + + if (rss_conf->rss_key && rss_conf->rss_key_len >= VIRTIO_NET_RSS_KEY_SIZE) + memcpy(rss_conf->rss_key, hw->rss_key, VIRTIO_NET_RSS_KEY_SIZE); + rss_conf->rss_key_len = VIRTIO_NET_RSS_KEY_SIZE; + rss_conf->rss_hf = virtio_to_ethdev_rss_offloads(hw->rss_hash_types); + + return 0; +} + +static int virtio_dev_rss_reta_update(struct rte_eth_dev *dev, + struct rte_eth_rss_reta_entry64 *reta_conf, + uint16_t reta_size) +{ + struct virtio_hw *hw = dev->data->dev_private; + uint16_t nb_queues; + int idx, pos, i; + + if (!virtio_with_feature(hw, VIRTIO_NET_F_RSS)) + return -ENOTSUP; + + if (reta_size != VIRTIO_NET_RSS_RETA_SIZE) + return -EINVAL; + + for (i = 0; i < reta_size; i++) { + idx = i / RTE_RETA_GROUP_SIZE; + pos = i % RTE_RETA_GROUP_SIZE; + + if (((reta_conf[idx].mask >> pos) & 0x1) == 0) + continue; + + hw->rss_reta[i] = reta_conf[idx].reta[pos]; + } + + nb_queues = RTE_MAX(dev->data->nb_rx_queues, dev->data->nb_tx_queues); + return virtio_set_multiple_queues_rss(dev, nb_queues); +} + +static int virtio_dev_rss_reta_query(struct rte_eth_dev *dev, + struct rte_eth_rss_reta_entry64 *reta_conf, + uint16_t reta_size) +{ + struct virtio_hw *hw = dev->data->dev_private; + int idx, i; + + if (!virtio_with_feature(hw, VIRTIO_NET_F_RSS)) + return -ENOTSUP; + + if (reta_size != VIRTIO_NET_RSS_RETA_SIZE) + return -EINVAL; + + for (i = 0; i < reta_size; i++) { + idx = i / RTE_RETA_GROUP_SIZE; + reta_conf[idx].reta[i % RTE_RETA_GROUP_SIZE] = hw->rss_reta[i]; + } + + return 0; +} + +/* + * As default RSS hash key, it uses the default key of the + * Intel IXGBE devices. It can be updated by the application + * with any 40B key value. + */ +static uint8_t rss_intel_key[VIRTIO_NET_RSS_KEY_SIZE] = { + 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, + 0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0, + 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4, + 0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C, + 0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA, +}; + +static int +virtio_dev_rss_init(struct rte_eth_dev *eth_dev) +{ + struct virtio_hw *hw = eth_dev->data->dev_private; + uint16_t nb_rx_queues = eth_dev->data->nb_rx_queues; + struct rte_eth_rss_conf *rss_conf; + int ret, i; + + rss_conf = ð_dev->data->dev_conf.rx_adv_conf.rss_conf; + + ret = virtio_dev_get_rss_config(hw, &hw->rss_hash_types); + if (ret) + return ret; + + if (rss_conf->rss_hf) { + /* Ensure requested hash types are supported by the device */ + if (rss_conf->rss_hf & ~virtio_to_ethdev_rss_offloads(hw->rss_hash_types)) + return -EINVAL; + + hw->rss_hash_types = ethdev_to_virtio_rss_offloads(rss_conf->rss_hf); + } + + if (!hw->rss_key) { + /* Setup default RSS key if not already setup by the user */ + hw->rss_key = rte_malloc_socket("rss_key", + VIRTIO_NET_RSS_KEY_SIZE, 0, + eth_dev->device->numa_node); + if (!hw->rss_key) { + PMD_INIT_LOG(ERR, "Failed to allocate RSS key"); + return -1; + } + + if (rss_conf->rss_key && rss_conf->rss_key_len) { + if (rss_conf->rss_key_len != VIRTIO_NET_RSS_KEY_SIZE) { + PMD_INIT_LOG(ERR, "Driver only supports %u RSS key length", + VIRTIO_NET_RSS_KEY_SIZE); + return -EINVAL; + } + memcpy(hw->rss_key, rss_conf->rss_key, VIRTIO_NET_RSS_KEY_SIZE); + } else { + memcpy(hw->rss_key, rss_intel_key, VIRTIO_NET_RSS_KEY_SIZE); + } + } + + if (!hw->rss_reta) { + /* Setup default RSS reta if not already setup by the user */ + hw->rss_reta = rte_malloc_socket("rss_reta", + VIRTIO_NET_RSS_RETA_SIZE * sizeof(uint16_t), 0, + eth_dev->device->numa_node); + if (!hw->rss_reta) { + PMD_INIT_LOG(ERR, "Failed to allocate RSS reta"); + return -1; + } + for (i = 0; i < VIRTIO_NET_RSS_RETA_SIZE; i++) + hw->rss_reta[i] = i % nb_rx_queues; + } + + return 0; +} + #define DUPLEX_UNKNOWN 0xff /* reset device and renegotiate features if needed */ static int @@ -1806,14 +2158,15 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) config->status = 0; } - if (virtio_with_feature(hw, VIRTIO_NET_F_MQ)) { + if (virtio_with_feature(hw, VIRTIO_NET_F_MQ) || + virtio_with_feature(hw, VIRTIO_NET_F_RSS)) { virtio_read_dev_config(hw, offsetof(struct virtio_net_config, max_virtqueue_pairs), &config->max_virtqueue_pairs, sizeof(config->max_virtqueue_pairs)); } else { PMD_INIT_LOG(DEBUG, - "VIRTIO_NET_F_MQ is not supported"); + "Neither VIRTIO_NET_F_MQ nor VIRTIO_NET_F_RSS are supported"); config->max_virtqueue_pairs = 1; } @@ -1845,6 +2198,11 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features) VLAN_TAG_LEN - hw->vtnet_hdr_size; } + hw->rss_hash_types = 0; + if (virtio_with_feature(hw, VIRTIO_NET_F_RSS)) + if (virtio_dev_rss_init(eth_dev)) + return -1; + PMD_INIT_LOG(DEBUG, "config->max_virtqueue_pairs=%d", config->max_virtqueue_pairs); PMD_INIT_LOG(DEBUG, "config->status=%d", config->status); @@ -2087,7 +2445,7 @@ virtio_dev_configure(struct rte_eth_dev *dev) PMD_INIT_LOG(DEBUG, "configure"); req_features = VIRTIO_PMD_DEFAULT_GUEST_FEATURES; - if (rxmode->mq_mode != ETH_MQ_RX_NONE) { + if (rxmode->mq_mode != ETH_MQ_RX_NONE && rxmode->mq_mode != ETH_MQ_RX_RSS) { PMD_DRV_LOG(ERR, "Unsupported Rx multi queue mode %d", rxmode->mq_mode); @@ -2107,6 +2465,9 @@ virtio_dev_configure(struct rte_eth_dev *dev) return ret; } + if (rxmode->mq_mode == ETH_MQ_RX_RSS) + req_features |= (1ULL << VIRTIO_NET_F_RSS); + if ((rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) && (rxmode->max_rx_pkt_len > hw->max_mtu + ether_hdr_len)) req_features &= ~(1ULL << VIRTIO_NET_F_MTU); @@ -2141,6 +2502,12 @@ virtio_dev_configure(struct rte_eth_dev *dev) return ret; } + if ((rxmode->mq_mode & ETH_MQ_RX_RSS_FLAG) && + !virtio_with_feature(hw, VIRTIO_NET_F_RSS)) { + PMD_DRV_LOG(ERR, "RSS support requested but not supported by the device"); + return -ENOTSUP; + } + if ((rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM)) && !virtio_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM)) { @@ -2538,6 +2905,7 @@ static int virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) { uint64_t tso_mask, host_features; + uint32_t rss_hash_types = 0; struct virtio_hw *hw = dev->data->dev_private; dev_info->speed_capa = virtio_dev_speed_capa_get(hw->speed); @@ -2578,6 +2946,18 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) (1ULL << VIRTIO_NET_F_HOST_TSO6); if ((host_features & tso_mask) == tso_mask) dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO; + if (host_features & (1ULL << VIRTIO_NET_F_RSS)) { + virtio_dev_get_rss_config(hw, &rss_hash_types); + dev_info->hash_key_size = VIRTIO_NET_RSS_KEY_SIZE; + dev_info->reta_size = VIRTIO_NET_RSS_RETA_SIZE; + dev_info->flow_type_rss_offloads = + virtio_to_ethdev_rss_offloads(rss_hash_types); + } else { + dev_info->hash_key_size = 0; + dev_info->reta_size = 0; + dev_info->flow_type_rss_offloads = 0; + } + if (host_features & (1ULL << VIRTIO_F_RING_PACKED)) { /* diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h index 40be484218..c08f382791 100644 --- a/drivers/net/virtio/virtio_ethdev.h +++ b/drivers/net/virtio/virtio_ethdev.h @@ -45,7 +45,8 @@ 1u << VIRTIO_NET_F_GUEST_TSO6 | \ 1u << VIRTIO_NET_F_CSUM | \ 1u << VIRTIO_NET_F_HOST_TSO4 | \ - 1u << VIRTIO_NET_F_HOST_TSO6) + 1u << VIRTIO_NET_F_HOST_TSO6 | \ + 1ULL << VIRTIO_NET_F_RSS) extern const struct eth_dev_ops virtio_user_secondary_eth_dev_ops; diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index 5baac221f7..3268bcec70 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -201,6 +201,28 @@ struct virtio_net_ctrl_mac { #define VIRTIO_NET_CTRL_VLAN_ADD 0 #define VIRTIO_NET_CTRL_VLAN_DEL 1 +/** + * RSS control + * + * The RSS feature configuration message is sent by the driver when + * VIRTIO_NET_F_RSS has been negotiated. It provides the device with + * hash types to use, hash key and indirection table. In this + * implementation, the driver only supports fixed key length (40B) + * and indirection table size (128 entries). + */ +#define VIRTIO_NET_RSS_RETA_SIZE 128 +#define VIRTIO_NET_RSS_KEY_SIZE 40 + +struct virtio_net_ctrl_rss { + uint32_t hash_types; + uint16_t indirection_table_mask; + uint16_t unclassified_queue; + uint16_t indirection_table[VIRTIO_NET_RSS_RETA_SIZE]; + uint16_t max_tx_vq; + uint8_t hash_key_length; + uint8_t hash_key_data[VIRTIO_NET_RSS_KEY_SIZE]; +}; + /* * Control link announce acknowledgement * @@ -292,7 +314,10 @@ struct virtqueue { /* If multiqueue is provided by host, then we suppport it. */ #define VIRTIO_NET_CTRL_MQ 4 + #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET 0 +#define VIRTIO_NET_CTRL_MQ_RSS_CONFIG 1 + #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN 1 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX 0x8000 From patchwork Mon Oct 18 10:20:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 101958 X-Patchwork-Delegate: maxime.coquelin@redhat.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 5F988A0C43; Mon, 18 Oct 2021 12:21:24 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EABFD410EE; Mon, 18 Oct 2021 12:21:23 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mails.dpdk.org (Postfix) with ESMTP id 6B840410EA for ; Mon, 18 Oct 2021 12:21:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634552482; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pHnpagovSaRj8dTa4UBfe6Z8eI78ikkD8q27de4u5l8=; b=ecmprKd2O50JKTwMNml3vYh/Xy496WV2UPgCHIeuprcoZjzM5NrD8F26ZM4DrJeERHt/wp L0LTblqPQb9ICJOiaJrVdcHTgreYz51er0F6+imWrLCH/byJxM9WjVEAc2jzjydvY9q6/4 G6LTTO7U540EE6N760XPUCGDhlHQvIw= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-269-mxD-BHISN_qNwWSReIFHlg-1; Mon, 18 Oct 2021 06:21:19 -0400 X-MC-Unique: mxD-BHISN_qNwWSReIFHlg-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 69B6980A5C2; Mon, 18 Oct 2021 10:21:17 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id E731C70911; Mon, 18 Oct 2021 10:21:07 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, amorenoz@redhat.com, david.marchand@redhat.com, andrew.rybchenko@oktetlabs.ru, ferruh.yigit@intel.com, michaelba@nvidia.com, viacheslavo@nvidia.com, xiaoyun.li@intel.com Cc: nelio.laranjeiro@6wind.com, yvugenfi@redhat.com, ybendito@redhat.com, Maxime Coquelin , stable@dpdk.org Date: Mon, 18 Oct 2021 12:20:42 +0200 Message-Id: <20211018102045.255831-3-maxime.coquelin@redhat.com> In-Reply-To: <20211018102045.255831-1-maxime.coquelin@redhat.com> References: <20211018102045.255831-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v5 2/5] app/testpmd: fix RSS key length 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 Sender: "dev" port_rss_hash_key_update() initializes rss_conf with the RSS key configuration provided by the user, but it calls rte_eth_dev_rss_hash_conf_get() before calling rte_eth_dev_rss_hash_update(), which overrides the parsed RSS config. While the RSS key value is set again after, this is not the case of the key length. It could cause out of bounds access if the key length parsed is smaller than the one read from rte_eth_dev_rss_hash_conf_get(). This patch restores the key length before the rte_eth_dev_rss_hash_update() call to ensure the RSS key value/length pair is consistent. Fixes: 8205e241b2b0 ("app/testpmd: add missing type to RSS hash commands") Cc: stable@dpdk.org Signed-off-by: Maxime Coquelin Acked-by: Xiaoyun Li Reviewed-by: Chenbo Xia --- app/test-pmd/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index f83a1abb09..63468cc1ea 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -3016,7 +3016,7 @@ port_rss_hash_key_update(portid_t port_id, char rss_type[], uint8_t *hash_key, unsigned int i; rss_conf.rss_key = NULL; - rss_conf.rss_key_len = hash_key_len; + rss_conf.rss_key_len = 0; rss_conf.rss_hf = 0; for (i = 0; rss_type_table[i].str; i++) { if (!strcmp(rss_type_table[i].str, rss_type)) @@ -3025,6 +3025,7 @@ port_rss_hash_key_update(portid_t port_id, char rss_type[], uint8_t *hash_key, diag = rte_eth_dev_rss_hash_conf_get(port_id, &rss_conf); if (diag == 0) { rss_conf.rss_key = hash_key; + rss_conf.rss_key_len = hash_key_len; diag = rte_eth_dev_rss_hash_update(port_id, &rss_conf); } if (diag == 0) From patchwork Mon Oct 18 10:20:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 101959 X-Patchwork-Delegate: maxime.coquelin@redhat.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 00A85A0C43; Mon, 18 Oct 2021 12:21:31 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8865A410E4; Mon, 18 Oct 2021 12:21:30 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 664AC410E4 for ; Mon, 18 Oct 2021 12:21:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634552489; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e+/npz9HXzkhvZ4Tj5HQHtVogpYvbtotYFVp4pzhqcw=; b=NmKTr11+GoFvRjxcpqEjc59ol85kEidQwbCJmg43Ke48927OhJHzcT+cQ5zqBRRZ901UpA V4xL9f564bb5oU56SsX9lu+XjkMTk6opOfgicFTej89wtnKXwF1T9+8H8h1yFYgQ1jk0pD ph0vKuJBNFWHgCwj+iLIiIPI9c+6k20= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-18-Ta2L5AOPP5O2zTkB12AI2g-1; Mon, 18 Oct 2021 06:21:26 -0400 X-MC-Unique: Ta2L5AOPP5O2zTkB12AI2g-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 918D618414A2; Mon, 18 Oct 2021 10:21:24 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id B515F5BB0D; Mon, 18 Oct 2021 10:21:17 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, amorenoz@redhat.com, david.marchand@redhat.com, andrew.rybchenko@oktetlabs.ru, ferruh.yigit@intel.com, michaelba@nvidia.com, viacheslavo@nvidia.com, xiaoyun.li@intel.com Cc: nelio.laranjeiro@6wind.com, yvugenfi@redhat.com, ybendito@redhat.com, Maxime Coquelin , stable@dpdk.org Date: Mon, 18 Oct 2021 12:20:43 +0200 Message-Id: <20211018102045.255831-4-maxime.coquelin@redhat.com> In-Reply-To: <20211018102045.255831-1-maxime.coquelin@redhat.com> References: <20211018102045.255831-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v5 3/5] app/testpmd: fix RSS type display 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 Sender: "dev" This patch fixes the display of the RSS hash types configured in the port, which displayed "all" even if only a single type was configured Fixes: 3c90743dd3b9 ("app/testpmd: support more types for flow RSS") Cc: stable@dpdk.org Signed-off-by: Maxime Coquelin Acked-by: Xiaoyun Li Reviewed-by: Chenbo Xia --- app/test-pmd/config.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 63468cc1ea..18c3c3d369 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -2995,7 +2995,9 @@ port_rss_hash_conf_show(portid_t port_id, int show_rss_key) } printf("RSS functions:\n "); for (i = 0; rss_type_table[i].str; i++) { - if (rss_hf & rss_type_table[i].rss_type) + if (rss_type_table[i].rss_type == 0) + continue; + if ((rss_hf & rss_type_table[i].rss_type) == rss_type_table[i].rss_type) printf("%s ", rss_type_table[i].str); } printf("\n"); From patchwork Mon Oct 18 10:20:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 101960 X-Patchwork-Delegate: maxime.coquelin@redhat.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 88E7AA0C43; Mon, 18 Oct 2021 12:21:36 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B18FD410F1; Mon, 18 Oct 2021 12:21:33 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 82F4C410FA for ; Mon, 18 Oct 2021 12:21:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634552492; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0dNRH1vPDsxbhMkK7dwZww8f+qet1VtfM40Vpc0fTgM=; b=DJGTHOnUz5tw7KgppRdGgqXraw/DgYHezZFHwdOJizC6AJRxT+UrZEGL//C9skYfjwT5vC nedZ8dXLWev1Prqe4VUQcJoPEpCrQtTKV0vjOrr83eI6q/+FeDjqVfrshqJkoKWstzOd3a DtRJMTl0I0JWPLY+blXID66/W44VC5I= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-460-lVj9EbVYO3Sw6XgP5sor8g-1; Mon, 18 Oct 2021 06:21:29 -0400 X-MC-Unique: lVj9EbVYO3Sw6XgP5sor8g-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BCC431018720; Mon, 18 Oct 2021 10:21:27 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id E672F22719; Mon, 18 Oct 2021 10:21:24 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, amorenoz@redhat.com, david.marchand@redhat.com, andrew.rybchenko@oktetlabs.ru, ferruh.yigit@intel.com, michaelba@nvidia.com, viacheslavo@nvidia.com, xiaoyun.li@intel.com Cc: nelio.laranjeiro@6wind.com, yvugenfi@redhat.com, ybendito@redhat.com, Maxime Coquelin , stable@dpdk.org Date: Mon, 18 Oct 2021 12:20:44 +0200 Message-Id: <20211018102045.255831-5-maxime.coquelin@redhat.com> In-Reply-To: <20211018102045.255831-1-maxime.coquelin@redhat.com> References: <20211018102045.255831-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v5 4/5] net/mlx5: fix RSS RETA update 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 Sender: "dev" This patch fixes RETA updating for entries above 64. Without ithat, these entries are never updated as calculated mask value will always be 0. Fixes: 634efbc2c8c0 ("mlx5: support RETA query and update") Cc: stable@dpdk.org Cc: nelio.laranjeiro@6wind.com Signed-off-by: Maxime Coquelin Acked-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5_rss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/mlx5/mlx5_rss.c b/drivers/net/mlx5/mlx5_rss.c index c32129cdc2..6dc52acee0 100644 --- a/drivers/net/mlx5/mlx5_rss.c +++ b/drivers/net/mlx5/mlx5_rss.c @@ -211,7 +211,7 @@ mlx5_dev_rss_reta_update(struct rte_eth_dev *dev, for (idx = 0, i = 0; (i != reta_size); ++i) { idx = i / RTE_RETA_GROUP_SIZE; pos = i % RTE_RETA_GROUP_SIZE; - if (((reta_conf[idx].mask >> i) & 0x1) == 0) + if (((reta_conf[idx].mask >> pos) & 0x1) == 0) continue; MLX5_ASSERT(reta_conf[idx].reta[pos] < priv->rxqs_n); (*priv->reta_idx)[i] = reta_conf[idx].reta[pos]; From patchwork Mon Oct 18 10:20:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 101961 X-Patchwork-Delegate: maxime.coquelin@redhat.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 E84CAA0C43; Mon, 18 Oct 2021 12:21:47 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D77C840683; Mon, 18 Oct 2021 12:21:47 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id B5AA240142 for ; Mon, 18 Oct 2021 12:21:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1634552506; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JEDSDymHuwf0Wp2NM8wtCHodrm/zjyyztemjxn1h/V4=; b=NCCsPjgPrHdStyMhOtdaN57nIZWZfExankjpiEKRx8MoT6CFQmCsIlYVb0jrHHU1gWmk/U Ku2blSrUSNKFK7KW+g8aBSFNaUk0NNHnhZy3W/PX7IMca1dCVQix7lAvvG/9A/70zCeVz5 KJnRDmSmUeL2aGsvImTe0+3MDx9GQak= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-60-GCQpW-zDNha36i5gsTgrjQ-1; Mon, 18 Oct 2021 06:21:45 -0400 X-MC-Unique: GCQpW-zDNha36i5gsTgrjQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AD90CA0CAB; Mon, 18 Oct 2021 10:21:43 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.39.208.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1FB105BB0D; Mon, 18 Oct 2021 10:21:27 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, amorenoz@redhat.com, david.marchand@redhat.com, andrew.rybchenko@oktetlabs.ru, ferruh.yigit@intel.com, michaelba@nvidia.com, viacheslavo@nvidia.com, xiaoyun.li@intel.com Cc: nelio.laranjeiro@6wind.com, yvugenfi@redhat.com, ybendito@redhat.com, Maxime Coquelin Date: Mon, 18 Oct 2021 12:20:45 +0200 Message-Id: <20211018102045.255831-6-maxime.coquelin@redhat.com> In-Reply-To: <20211018102045.255831-1-maxime.coquelin@redhat.com> References: <20211018102045.255831-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH v5 5/5] app/testpmd: add missing flow types in port info 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 Sender: "dev" This patch adds missing IPv6-Ex and GTPU flow types to port info command. It also add the same definitions to str2flowtype(), used to configure flow director. Signed-off-by: Maxime Coquelin Acked-by: Xiaoyun Li --- app/test-pmd/cmdline.c | 4 ++++ app/test-pmd/config.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index b8f06063d2..5f45f1816e 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -10445,6 +10445,10 @@ str2flowtype(char *string) {"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP}, {"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER}, {"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD}, + {"ipv6-ex", RTE_ETH_FLOW_IPV6_EX}, + {"ipv6-tcp-ex", RTE_ETH_FLOW_IPV6_TCP_EX}, + {"ipv6-udp-ex", RTE_ETH_FLOW_IPV6_UDP_EX}, + {"gtpu", RTE_ETH_FLOW_GTPU}, }; for (i = 0; i < RTE_DIM(flowtype_str); i++) { diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 18c3c3d369..649ba4a850 100644 --- a/app/test-pmd/config.c +++ b/app/test-pmd/config.c @@ -4690,11 +4690,15 @@ flowtype_to_str(uint16_t flow_type) {"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP}, {"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER}, {"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD}, + {"ipv6-ex", RTE_ETH_FLOW_IPV6_EX}, + {"ipv6-tcp-ex", RTE_ETH_FLOW_IPV6_TCP_EX}, + {"ipv6-udp-ex", RTE_ETH_FLOW_IPV6_UDP_EX}, {"port", RTE_ETH_FLOW_PORT}, {"vxlan", RTE_ETH_FLOW_VXLAN}, {"geneve", RTE_ETH_FLOW_GENEVE}, {"nvgre", RTE_ETH_FLOW_NVGRE}, {"vxlan-gpe", RTE_ETH_FLOW_VXLAN_GPE}, + {"gtpu", RTE_ETH_FLOW_GTPU}, }; for (i = 0; i < RTE_DIM(flowtype_str_table); i++) {