On 4/12/2019 7:13 PM, Yong Wang wrote:
> -----Original Message-----
> From: Eduard Serra Miralles <ese...@vmware.com>
> Date: Wednesday, April 10, 2019 at 9:44 PM
> To: Yong Wang <yongw...@vmware.com>
> Cc: "dev@dpdk.org" <dev@dpdk.org>, Eduard Serra Miralles <ese...@vmware.com>
> Subject: [PATCH] net/vmxnet3: v4 boot and guest UDP RSS configuration
> 
>     From: Eduard Serra <ese...@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 <ese...@vmware.com>
>     ---
> 
> Acked-by: Yong Wang <yongw...@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.

Reply via email to