[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