[dpdk-dev] [PATCH] net/vmxnet3: v4 boot and guest UDP RSS configuration
Ferruh Yigit
ferruh.yigit at intel.com
Tue Apr 16 18:08:54 CEST 2019
On 4/12/2019 7:13 PM, Yong Wang wrote:
> -----Original Message-----
> From: Eduard Serra Miralles <eserra at vmware.com>
> Date: Wednesday, April 10, 2019 at 9:44 PM
> To: Yong Wang <yongwang at vmware.com>
> Cc: "dev at dpdk.org" <dev at dpdk.org>, Eduard Serra Miralles <eserra at vmware.com>
> Subject: [PATCH] net/vmxnet3: v4 boot and guest UDP RSS configuration
>
> From: Eduard Serra <eserra at vmware.com>
>
> This patch introduces:
> - VMxnet3 v4 negotiation and,
> - entirely guest-driven UDP RSS support.
>
> VMxnet3 v3 already has UDP RSS support, however it
> depends on hypervisor provisioning on the VM through
> ESX specific flags, which are not transparent or known
> to the guest later on.
>
> Vmxnet3 v4 introduces a new API transaction which allows
> configuring RSS entirely from the guest. This API must be
> invoked after device shared mem region init.
>
> IPv4 ESP RSS (SPI based) is also available, but currently
> there are no ESP RSS definitions on rte_eth layer to
> handle that.
>
> Signed-off-by: Eduard Serra <eserra at vmware.com>
> ---
>
> Acked-by: Yong Wang <yongwang at vmware.com>
>
> One comment below.
>
> drivers/net/vmxnet3/vmxnet3_ethdev.c | 21 +++++++++++++++++-
> drivers/net/vmxnet3/vmxnet3_ethdev.h | 8 +++++++
> drivers/net/vmxnet3/vmxnet3_rxtx.c | 41 ++++++++++++++++++++++++++++++++++++
> 3 files changed, 69 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> index 93e5de9..846d7fd 100644
> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
> @@ -266,7 +266,11 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
> ver = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_VRRS);
> PMD_INIT_LOG(DEBUG, "Hardware version : %d", ver);
>
> - if (ver & (1 << VMXNET3_REV_3)) {
> + if (ver & (1 << VMXNET3_REV_4)) {
> + VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
> + 1 << VMXNET3_REV_4);
> + hw->version = VMXNET3_REV_4 + 1;
> + } else if (ver & (1 << VMXNET3_REV_3)) {
> VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
> 1 << VMXNET3_REV_3);
> hw->version = VMXNET3_REV_3 + 1;
> @@ -764,6 +768,15 @@ vmxnet3_dev_start(struct rte_eth_dev *dev)
> PMD_INIT_LOG(DEBUG, "Failed to setup memory region\n");
> }
>
> + if (VMXNET3_VERSION_GE_4(hw)) {
> + /* Check for additional RSS */
> + ret = vmxnet3_v4_rss_configure(dev);
> + if (ret != VMXNET3_SUCCESS) {
> + PMD_INIT_LOG(ERR, "Failed to configure v4 RSS");
> + return ret;
> + }
> + }
> +
> /* Disable interrupts */
> vmxnet3_disable_intr(hw);
>
> @@ -1141,6 +1154,8 @@ static void
> vmxnet3_dev_info_get(struct rte_eth_dev *dev __rte_unused,
> struct rte_eth_dev_info *dev_info)
> {
> + struct vmxnet3_hw *hw = dev->data->dev_private;
> +
> dev_info->max_rx_queues = VMXNET3_MAX_RX_QUEUES;
> dev_info->max_tx_queues = VMXNET3_MAX_TX_QUEUES;
> dev_info->min_rx_bufsize = 1518 + RTE_PKTMBUF_HEADROOM;
> @@ -1150,6 +1165,10 @@ vmxnet3_dev_info_get(struct rte_eth_dev *dev __rte_unused,
>
> dev_info->flow_type_rss_offloads = VMXNET3_RSS_OFFLOAD_ALL;
>
> + if (VMXNET3_VERSION_GE_4(hw)) {
> + dev_info->flow_type_rss_offloads |= VMXNET3_V4_RSS_MASK;
> + }
> +
> dev_info->rx_desc_lim = (struct rte_eth_desc_lim) {
> .nb_max = VMXNET3_RX_RING_MAX_SIZE,
> .nb_min = VMXNET3_DEF_RX_RING_SIZE,
> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h b/drivers/net/vmxnet3/vmxnet3_ethdev.h
> index 5bc3a84..319d739 100644
> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
> @@ -34,6 +34,10 @@
> ETH_RSS_IPV6 | \
> ETH_RSS_NONFRAG_IPV6_TCP)
>
> +#define VMXNET3_V4_RSS_MASK ( \
> + ETH_RSS_NONFRAG_IPV4_UDP | \
> + ETH_RSS_NONFRAG_IPV6_UDP)
> +
> /* RSS configuration structure - shared with device through GPA */
> typedef struct VMXNET3_RSSConf {
> uint16_t hashType;
> @@ -103,10 +107,12 @@ struct vmxnet3_hw {
> UPT1_RxStats snapshot_rx_stats[VMXNET3_MAX_RX_QUEUES];
> };
>
> +#define VMXNET3_REV_4 3 /* Vmxnet3 Rev. 4 */
> #define VMXNET3_REV_3 2 /* Vmxnet3 Rev. 3 */
> #define VMXNET3_REV_2 1 /* Vmxnet3 Rev. 2 */
> #define VMXNET3_REV_1 0 /* Vmxnet3 Rev. 1 */
>
> +#define VMXNET3_VERSION_GE_4(hw) ((hw)->version >= VMXNET3_REV_4 + 1)
> #define VMXNET3_VERSION_GE_3(hw) ((hw)->version >= VMXNET3_REV_3 + 1)
> #define VMXNET3_VERSION_GE_2(hw) ((hw)->version >= VMXNET3_REV_2 + 1)
>
> @@ -162,6 +168,8 @@ void vmxnet3_dev_clear_queues(struct rte_eth_dev *dev);
> void vmxnet3_dev_rx_queue_release(void *rxq);
> void vmxnet3_dev_tx_queue_release(void *txq);
>
> +int vmxnet3_v4_rss_configure(struct rte_eth_dev *dev);
> +
> int vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
> uint16_t nb_rx_desc, unsigned int socket_id,
> const struct rte_eth_rxconf *rx_conf,
> diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c
> index d30914a..9d80646 100644
> --- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
> +++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
> @@ -1292,6 +1292,47 @@ static uint8_t rss_intel_key[40] = {
> };
>
> /*
> + * Additional RSS configurations based on vmxnet v4+ APIs
> + */
> +int
> +vmxnet3_v4_rss_configure(struct rte_eth_dev *dev)
> +{
> + struct vmxnet3_hw *hw = dev->data->dev_private;
> + Vmxnet3_DriverShared *shared = hw->shared;
> + Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo;
> + struct rte_eth_rss_conf *port_rss_conf;
> + uint64_t rss_hf;
> + uint32_t ret;
> +
> + PMD_INIT_FUNC_TRACE();
> +
> + cmdInfo->setRSSFields = 0;
> + port_rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf;
> + rss_hf = port_rss_conf->rss_hf &
> + (VMXNET3_V4_RSS_MASK | VMXNET3_RSS_OFFLOAD_ALL);
> +
> + if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP)
> + cmdInfo->setRSSFields |= VMXNET3_RSS_FIELDS_TCPIP4;
> + if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP)
> + cmdInfo->setRSSFields |= VMXNET3_RSS_FIELDS_TCPIP6;
> + if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP)
> + cmdInfo->setRSSFields |= VMXNET3_RSS_FIELDS_UDPIP4;
> + if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP)
> + cmdInfo->setRSSFields |= VMXNET3_RSS_FIELDS_UDPIP6;
> + /* TODO: ESP RSS is currently not define in rte_eth layer */
>
> Let's just remove this as it has nothing to do with this change.
Reminder that this patch is waiting for this change request.
More information about the dev
mailing list