[dpdk-dev] net/vmxnet3: convert to new rx offload api

Message ID 1525126835-21775-1-git-send-email-llouis@vmware.com (mailing list archive)
State Changes Requested, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Louis Luo April 30, 2018, 10:20 p.m. UTC
  Ethdev RX offloads API has changed since: commit ce17eddefc20
("ethdev: introduce Rx queue offloads API")

This patch adopts the new RX Offload API in vmxnet3 driver.

Signed-off-by: Louis Luo <llouis@vmware.com>
---
 drivers/net/vmxnet3/vmxnet3_ethdev.c | 61 ++++++++++++++++++++++++++----------
 1 file changed, 45 insertions(+), 16 deletions(-)
  

Comments

Yong Wang April 30, 2018, 10:50 p.m. UTC | #1
> -----Original Message-----

> From: Louis Luo [mailto:llouis@vmware.com]

> Sent: Monday, April 30, 2018 3:21 PM

> To: Yong Wang <yongwang@vmware.com>

> Cc: dev@dpdk.org; Louis Luo <llouis@vmware.com>

> Subject: [PATCH] net/vmxnet3: convert to new rx offload api

> 

> Ethdev RX offloads API has changed since: commit ce17eddefc20

> ("ethdev: introduce Rx queue offloads API")

> 

> This patch adopts the new RX Offload API in vmxnet3 driver.

> 

> Signed-off-by: Louis Luo <llouis@vmware.com>


Acked-by: Yong Wang <yongwang@vmware.com>


> ---

>  drivers/net/vmxnet3/vmxnet3_ethdev.c | 61

> ++++++++++++++++++++++++++----------

>  1 file changed, 45 insertions(+), 16 deletions(-)

> 

> diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c

> b/drivers/net/vmxnet3/vmxnet3_ethdev.c

> index 4568521..d9d5bda 100644

> --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c

> +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c

> @@ -42,6 +42,23 @@

> 

>  #define	VMXNET3_TX_MAX_SEG	UINT8_MAX

> 

> +#define VMXNET3_TX_OFFLOAD_CAP		\

> +	(DEV_TX_OFFLOAD_VLAN_INSERT |	\

> +	 DEV_TX_OFFLOAD_IPV4_CKSUM |	\

> +	 DEV_TX_OFFLOAD_TCP_CKSUM |	\

> +	 DEV_TX_OFFLOAD_UDP_CKSUM |	\

> +	 DEV_TX_OFFLOAD_TCP_TSO |	\

> +	 DEV_TX_OFFLOAD_MULTI_SEGS)

> +

> +#define VMXNET3_RX_OFFLOAD_CAP		\

> +	(DEV_RX_OFFLOAD_VLAN_STRIP |	\

> +	 DEV_RX_OFFLOAD_SCATTER |	\

> +	 DEV_RX_OFFLOAD_IPV4_CKSUM |	\

> +	 DEV_RX_OFFLOAD_UDP_CKSUM |	\

> +	 DEV_RX_OFFLOAD_TCP_CKSUM |	\

> +	 DEV_RX_OFFLOAD_TCP_LRO |	\

> +	 DEV_RX_OFFLOAD_JUMBO_FRAME)

> +

>  static int eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev);

>  static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev);

>  static int vmxnet3_dev_configure(struct rte_eth_dev *dev);

> @@ -376,9 +393,25 @@ vmxnet3_dev_configure(struct rte_eth_dev *dev)

>  	const struct rte_memzone *mz;

>  	struct vmxnet3_hw *hw = dev->data->dev_private;

>  	size_t size;

> +	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;

> +	uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;

> 

>  	PMD_INIT_FUNC_TRACE();

> 

> +	if ((rx_offloads & VMXNET3_RX_OFFLOAD_CAP) != rx_offloads) {

> +		RTE_LOG(ERR, PMD, "Requested RX offloads 0x%lx"

> +			" do not match supported 0x%lx\n",

> +			rx_offloads,

> (uint64_t)VMXNET3_RX_OFFLOAD_CAP);

> +		return -ENOTSUP;

> +	}

> +

> +	if ((tx_offloads & VMXNET3_TX_OFFLOAD_CAP) != tx_offloads) {

> +		RTE_LOG(ERR, PMD, "Requested TX offloads 0x%lx"

> +			" do not match supported 0x%lx\n",

> +			tx_offloads, (uint64_t)VMXNET3_TX_OFFLOAD_CAP);

> +		return -ENOTSUP;

> +	}

> +

>  	if (dev->data->nb_tx_queues > VMXNET3_MAX_TX_QUEUES ||

>  	    dev->data->nb_rx_queues > VMXNET3_MAX_RX_QUEUES) {

>  		PMD_INIT_LOG(ERR, "ERROR: Number of queues not

> supported");

> @@ -567,6 +600,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev

> *dev)

>  	uint32_t mtu = dev->data->mtu;

>  	Vmxnet3_DriverShared *shared = hw->shared;

>  	Vmxnet3_DSDevRead *devRead = &shared->devRead;

> +	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;

>  	uint32_t i;

>  	int ret;

> 

> @@ -644,10 +678,10 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev

> *dev)

>  	devRead->rxFilterConf.rxMode = 0;

> 

>  	/* Setting up feature flags */

> -	if (dev->data->dev_conf.rxmode.hw_ip_checksum)

> +	if (rx_offloads & DEV_RX_OFFLOAD_CHECKSUM)

>  		devRead->misc.uptFeatures |= VMXNET3_F_RXCSUM;

> 

> -	if (dev->data->dev_conf.rxmode.enable_lro) {

> +	if (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO) {

>  		devRead->misc.uptFeatures |= VMXNET3_F_LRO;

>  		devRead->misc.maxNumRxSG = 0;

>  	}

> @@ -1050,17 +1084,10 @@ vmxnet3_dev_info_get(struct rte_eth_dev *dev

> __rte_unused,

>  		.nb_mtu_seg_max = VMXNET3_MAX_TXD_PER_PKT,

>  	};

> 

> -	dev_info->rx_offload_capa =

> -		DEV_RX_OFFLOAD_VLAN_STRIP |

> -		DEV_RX_OFFLOAD_UDP_CKSUM |

> -		DEV_RX_OFFLOAD_TCP_CKSUM |

> -		DEV_RX_OFFLOAD_TCP_LRO;

> -

> -	dev_info->tx_offload_capa =

> -		DEV_TX_OFFLOAD_VLAN_INSERT |

> -		DEV_TX_OFFLOAD_TCP_CKSUM |

> -		DEV_TX_OFFLOAD_UDP_CKSUM |

> -		DEV_TX_OFFLOAD_TCP_TSO;

> +	dev_info->rx_offload_capa = VMXNET3_RX_OFFLOAD_CAP;

> +	dev_info->rx_queue_offload_capa = 0;

> +	dev_info->tx_offload_capa = VMXNET3_TX_OFFLOAD_CAP;

> +	dev_info->tx_queue_offload_capa = 0;

>  }

> 

>  static const uint32_t *

> @@ -1154,8 +1181,9 @@ vmxnet3_dev_promiscuous_disable(struct

> rte_eth_dev *dev)

>  {

>  	struct vmxnet3_hw *hw = dev->data->dev_private;

>  	uint32_t *vf_table = hw->shared->devRead.rxFilterConf.vfTable;

> +	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;

> 

> -	if (dev->data->dev_conf.rxmode.hw_vlan_filter)

> +	if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)

>  		memcpy(vf_table, hw->shadow_vfta,

> VMXNET3_VFT_TABLE_SIZE);

>  	else

>  		memset(vf_table, 0xff, VMXNET3_VFT_TABLE_SIZE);

> @@ -1217,9 +1245,10 @@ vmxnet3_dev_vlan_offload_set(struct

> rte_eth_dev *dev, int mask)

>  	struct vmxnet3_hw *hw = dev->data->dev_private;

>  	Vmxnet3_DSDevRead *devRead = &hw->shared->devRead;

>  	uint32_t *vf_table = devRead->rxFilterConf.vfTable;

> +	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;

> 

>  	if (mask & ETH_VLAN_STRIP_MASK) {

> -		if (dev->data->dev_conf.rxmode.hw_vlan_strip)

> +		if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP)

>  			devRead->misc.uptFeatures |= UPT1_F_RXVLAN;

>  		else

>  			devRead->misc.uptFeatures &= ~UPT1_F_RXVLAN;

> @@ -1229,7 +1258,7 @@ vmxnet3_dev_vlan_offload_set(struct

> rte_eth_dev *dev, int mask)

>  	}

> 

>  	if (mask & ETH_VLAN_FILTER_MASK) {

> -		if (dev->data->dev_conf.rxmode.hw_vlan_filter)

> +		if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)

>  			memcpy(vf_table, hw->shadow_vfta,

> VMXNET3_VFT_TABLE_SIZE);

>  		else

>  			memset(vf_table, 0xff, VMXNET3_VFT_TABLE_SIZE);

> --

> 2.7.4
  
Ferruh Yigit May 1, 2018, 2:58 p.m. UTC | #2
On 4/30/2018 11:20 PM, Louis Luo wrote:
> Ethdev RX offloads API has changed since: commit ce17eddefc20
> ("ethdev: introduce Rx queue offloads API")
> 
> This patch adopts the new RX Offload API in vmxnet3 driver.
>
> Signed-off-by: Louis Luo <llouis@vmware.com>

Hi Louis,

Overall patch looks good, only there is 32bits build error because of logging,
more details below.

Can you please send a new version of the patch, keeping Yong's ack.

<...>

> @@ -376,9 +393,25 @@ vmxnet3_dev_configure(struct rte_eth_dev *dev)
>  	const struct rte_memzone *mz;
>  	struct vmxnet3_hw *hw = dev->data->dev_private;
>  	size_t size;
> +	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
> +	uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
>  
>  	PMD_INIT_FUNC_TRACE();
>  
> +	if ((rx_offloads & VMXNET3_RX_OFFLOAD_CAP) != rx_offloads) {
> +		RTE_LOG(ERR, PMD, "Requested RX offloads 0x%lx"
> +			" do not match supported 0x%lx\n",
> +			rx_offloads, (uint64_t)VMXNET3_RX_OFFLOAD_CAP);

%lx usage causing build error with 32bit build [1], please prefer PRIx64.

[1]
 argument of type "uint64_t={__uint64_t={unsigned long long}}" is incompatible
with format "%lx", expecting argument of type "unsigned long"

<...>
  
Louis Luo May 1, 2018, 5:32 p.m. UTC | #3
Hi Ferruh,

Thanks for your review! Initially I did use PRIx64 there, but checkpatch.sh always failed and complained about it for Camel case. So I just replaced it with %lx. I will change it back and resend the review.

Thanks,
Louis

On 5/1/18, 7:58 AM, "Ferruh Yigit" <ferruh.yigit@intel.com> wrote:

    On 4/30/2018 11:20 PM, Louis Luo wrote:
    > Ethdev RX offloads API has changed since: commit ce17eddefc20

    > ("ethdev: introduce Rx queue offloads API")

    > 

    > This patch adopts the new RX Offload API in vmxnet3 driver.

    >

    > Signed-off-by: Louis Luo <llouis@vmware.com>

    
    Hi Louis,
    
    Overall patch looks good, only there is 32bits build error because of logging,
    more details below.
    
    Can you please send a new version of the patch, keeping Yong's ack.
    
    <...>
    
    > @@ -376,9 +393,25 @@ vmxnet3_dev_configure(struct rte_eth_dev *dev)

    >  	const struct rte_memzone *mz;

    >  	struct vmxnet3_hw *hw = dev->data->dev_private;

    >  	size_t size;

    > +	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;

    > +	uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;

    >  

    >  	PMD_INIT_FUNC_TRACE();

    >  

    > +	if ((rx_offloads & VMXNET3_RX_OFFLOAD_CAP) != rx_offloads) {

    > +		RTE_LOG(ERR, PMD, "Requested RX offloads 0x%lx"

    > +			" do not match supported 0x%lx\n",

    > +			rx_offloads, (uint64_t)VMXNET3_RX_OFFLOAD_CAP);

    
    %lx usage causing build error with 32bit build [1], please prefer PRIx64.
    
    [1]
     argument of type "uint64_t={__uint64_t={unsigned long long}}" is incompatible
    with format "%lx", expecting argument of type "unsigned long"
    
    <...>
  
Ferruh Yigit May 2, 2018, 9:16 a.m. UTC | #4
On 5/1/2018 6:32 PM, Louis Luo wrote:
> Hi Ferruh,
> 
> Thanks for your review! Initially I did use PRIx64 there, but checkpatch.sh always failed and complained about it for Camel case. So I just replaced it with %lx. I will change it back and resend the review.

Hi Louis,

You are right checkpatch complains about it as CamelCase syntax but that is OK
to ignore this warning for PRI... usage, in favor of fixing 32bits build.

> 
> Thanks,
> Louis
> 
> On 5/1/18, 7:58 AM, "Ferruh Yigit" <ferruh.yigit@intel.com> wrote:
> 
>     On 4/30/2018 11:20 PM, Louis Luo wrote:
>     > Ethdev RX offloads API has changed since: commit ce17eddefc20
>     > ("ethdev: introduce Rx queue offloads API")
>     > 
>     > This patch adopts the new RX Offload API in vmxnet3 driver.
>     >
>     > Signed-off-by: Louis Luo <llouis@vmware.com>
>     
>     Hi Louis,
>     
>     Overall patch looks good, only there is 32bits build error because of logging,
>     more details below.
>     
>     Can you please send a new version of the patch, keeping Yong's ack.
>     
>     <...>
>     
>     > @@ -376,9 +393,25 @@ vmxnet3_dev_configure(struct rte_eth_dev *dev)
>     >  	const struct rte_memzone *mz;
>     >  	struct vmxnet3_hw *hw = dev->data->dev_private;
>     >  	size_t size;
>     > +	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
>     > +	uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
>     >  
>     >  	PMD_INIT_FUNC_TRACE();
>     >  
>     > +	if ((rx_offloads & VMXNET3_RX_OFFLOAD_CAP) != rx_offloads) {
>     > +		RTE_LOG(ERR, PMD, "Requested RX offloads 0x%lx"
>     > +			" do not match supported 0x%lx\n",
>     > +			rx_offloads, (uint64_t)VMXNET3_RX_OFFLOAD_CAP);
>     
>     %lx usage causing build error with 32bit build [1], please prefer PRIx64.
>     
>     [1]
>      argument of type "uint64_t={__uint64_t={unsigned long long}}" is incompatible
>     with format "%lx", expecting argument of type "unsigned long"
>     
>     <...>
>     
>
  

Patch

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 4568521..d9d5bda 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -42,6 +42,23 @@ 
 
 #define	VMXNET3_TX_MAX_SEG	UINT8_MAX
 
+#define VMXNET3_TX_OFFLOAD_CAP		\
+	(DEV_TX_OFFLOAD_VLAN_INSERT |	\
+	 DEV_TX_OFFLOAD_IPV4_CKSUM |	\
+	 DEV_TX_OFFLOAD_TCP_CKSUM |	\
+	 DEV_TX_OFFLOAD_UDP_CKSUM |	\
+	 DEV_TX_OFFLOAD_TCP_TSO |	\
+	 DEV_TX_OFFLOAD_MULTI_SEGS)
+
+#define VMXNET3_RX_OFFLOAD_CAP		\
+	(DEV_RX_OFFLOAD_VLAN_STRIP |	\
+	 DEV_RX_OFFLOAD_SCATTER |	\
+	 DEV_RX_OFFLOAD_IPV4_CKSUM |	\
+	 DEV_RX_OFFLOAD_UDP_CKSUM |	\
+	 DEV_RX_OFFLOAD_TCP_CKSUM |	\
+	 DEV_RX_OFFLOAD_TCP_LRO |	\
+	 DEV_RX_OFFLOAD_JUMBO_FRAME)
+
 static int eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev);
 static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev);
 static int vmxnet3_dev_configure(struct rte_eth_dev *dev);
@@ -376,9 +393,25 @@  vmxnet3_dev_configure(struct rte_eth_dev *dev)
 	const struct rte_memzone *mz;
 	struct vmxnet3_hw *hw = dev->data->dev_private;
 	size_t size;
+	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
+	uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
 
 	PMD_INIT_FUNC_TRACE();
 
+	if ((rx_offloads & VMXNET3_RX_OFFLOAD_CAP) != rx_offloads) {
+		RTE_LOG(ERR, PMD, "Requested RX offloads 0x%lx"
+			" do not match supported 0x%lx\n",
+			rx_offloads, (uint64_t)VMXNET3_RX_OFFLOAD_CAP);
+		return -ENOTSUP;
+	}
+
+	if ((tx_offloads & VMXNET3_TX_OFFLOAD_CAP) != tx_offloads) {
+		RTE_LOG(ERR, PMD, "Requested TX offloads 0x%lx"
+			" do not match supported 0x%lx\n",
+			tx_offloads, (uint64_t)VMXNET3_TX_OFFLOAD_CAP);
+		return -ENOTSUP;
+	}
+
 	if (dev->data->nb_tx_queues > VMXNET3_MAX_TX_QUEUES ||
 	    dev->data->nb_rx_queues > VMXNET3_MAX_RX_QUEUES) {
 		PMD_INIT_LOG(ERR, "ERROR: Number of queues not supported");
@@ -567,6 +600,7 @@  vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
 	uint32_t mtu = dev->data->mtu;
 	Vmxnet3_DriverShared *shared = hw->shared;
 	Vmxnet3_DSDevRead *devRead = &shared->devRead;
+	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
 	uint32_t i;
 	int ret;
 
@@ -644,10 +678,10 @@  vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
 	devRead->rxFilterConf.rxMode = 0;
 
 	/* Setting up feature flags */
-	if (dev->data->dev_conf.rxmode.hw_ip_checksum)
+	if (rx_offloads & DEV_RX_OFFLOAD_CHECKSUM)
 		devRead->misc.uptFeatures |= VMXNET3_F_RXCSUM;
 
-	if (dev->data->dev_conf.rxmode.enable_lro) {
+	if (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO) {
 		devRead->misc.uptFeatures |= VMXNET3_F_LRO;
 		devRead->misc.maxNumRxSG = 0;
 	}
@@ -1050,17 +1084,10 @@  vmxnet3_dev_info_get(struct rte_eth_dev *dev __rte_unused,
 		.nb_mtu_seg_max = VMXNET3_MAX_TXD_PER_PKT,
 	};
 
-	dev_info->rx_offload_capa =
-		DEV_RX_OFFLOAD_VLAN_STRIP |
-		DEV_RX_OFFLOAD_UDP_CKSUM |
-		DEV_RX_OFFLOAD_TCP_CKSUM |
-		DEV_RX_OFFLOAD_TCP_LRO;
-
-	dev_info->tx_offload_capa =
-		DEV_TX_OFFLOAD_VLAN_INSERT |
-		DEV_TX_OFFLOAD_TCP_CKSUM |
-		DEV_TX_OFFLOAD_UDP_CKSUM |
-		DEV_TX_OFFLOAD_TCP_TSO;
+	dev_info->rx_offload_capa = VMXNET3_RX_OFFLOAD_CAP;
+	dev_info->rx_queue_offload_capa = 0;
+	dev_info->tx_offload_capa = VMXNET3_TX_OFFLOAD_CAP;
+	dev_info->tx_queue_offload_capa = 0;
 }
 
 static const uint32_t *
@@ -1154,8 +1181,9 @@  vmxnet3_dev_promiscuous_disable(struct rte_eth_dev *dev)
 {
 	struct vmxnet3_hw *hw = dev->data->dev_private;
 	uint32_t *vf_table = hw->shared->devRead.rxFilterConf.vfTable;
+	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
 
-	if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+	if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
 		memcpy(vf_table, hw->shadow_vfta, VMXNET3_VFT_TABLE_SIZE);
 	else
 		memset(vf_table, 0xff, VMXNET3_VFT_TABLE_SIZE);
@@ -1217,9 +1245,10 @@  vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 	struct vmxnet3_hw *hw = dev->data->dev_private;
 	Vmxnet3_DSDevRead *devRead = &hw->shared->devRead;
 	uint32_t *vf_table = devRead->rxFilterConf.vfTable;
+	uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
 
 	if (mask & ETH_VLAN_STRIP_MASK) {
-		if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+		if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
 			devRead->misc.uptFeatures |= UPT1_F_RXVLAN;
 		else
 			devRead->misc.uptFeatures &= ~UPT1_F_RXVLAN;
@@ -1229,7 +1258,7 @@  vmxnet3_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)
 	}
 
 	if (mask & ETH_VLAN_FILTER_MASK) {
-		if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+		if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
 			memcpy(vf_table, hw->shadow_vfta, VMXNET3_VFT_TABLE_SIZE);
 		else
 			memset(vf_table, 0xff, VMXNET3_VFT_TABLE_SIZE);