[dpdk-dev,v1] net/tap: return empty port offload capabilities

Message ID 1524672957-4018-1-git-send-email-ophirmu@mellanox.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers

Checks

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

Commit Message

Ophir Munk April 25, 2018, 4:15 p.m. UTC
  Fix report on port offload capabilities to be 0 (no capabilities).
Before this commit port capabilities were a clone of queue
capabilities, however the current TAP offload capabilities (e.g.
checksum calculation) are per queue and are not specific per port.

Fixes: 95ae196ae10b ("net/tap: use new Rx offloads API")
Fixes: 818fe14a9891 ("net/tap: use new Tx offloads API")
Cc: stable@dpdk.org

Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
---
 drivers/net/tap/rte_eth_tap.c | 21 ++++++---------------
 1 file changed, 6 insertions(+), 15 deletions(-)
  

Comments

Ferruh Yigit April 25, 2018, 4:31 p.m. UTC | #1
On 4/25/2018 5:15 PM, Ophir Munk wrote:
> Fix report on port offload capabilities to be 0 (no capabilities).
> Before this commit port capabilities were a clone of queue
> capabilities, however the current TAP offload capabilities (e.g.
> checksum calculation) are per queue and are not specific per port.

Overall looks good to me, thanks.

Is error log in tap_tx_queue_setup() still valid:
  RTE_LOG(ERR, PMD,
          "%p: Tx queue offloads 0x%" PRIx64
          " don't match port offloads 0x%" PRIx64
          " or supported offloads 0x%" PRIx64,
          (void *)dev, tx_conf->offloads,
          dev->data->dev_conf.txmode.offloads,
          tap_tx_offload_get_port_capa());

There is no match expected, this path can be hit when requested offload out of
reported capabilities, but either log or printed values give much information
about real error cause.

Similar in tap_rx_queue_setup(), at least it does:
 (tap_rx_offload_get_port_capa() | tap_rx_offload_get_queue_capa())



> 
> Fixes: 95ae196ae10b ("net/tap: use new Rx offloads API")
> Fixes: 818fe14a9891 ("net/tap: use new Tx offloads API")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
> ---
>  drivers/net/tap/rte_eth_tap.c | 21 ++++++---------------
>  1 file changed, 6 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
> index fe62ab3..aea73b1 100644
> --- a/drivers/net/tap/rte_eth_tap.c
> +++ b/drivers/net/tap/rte_eth_tap.c
> @@ -269,14 +269,9 @@ static uint64_t
>  tap_rx_offload_get_port_capa(void)
>  {
>  	/*
> -	 * In order to support legacy apps,
> -	 * report capabilities also as port capabilities.
> +	 * No specific port Rx offload capabilities.
>  	 */
> -	return DEV_RX_OFFLOAD_SCATTER |
> -	       DEV_RX_OFFLOAD_IPV4_CKSUM |
> -	       DEV_RX_OFFLOAD_UDP_CKSUM |
> -	       DEV_RX_OFFLOAD_TCP_CKSUM |
> -	       DEV_RX_OFFLOAD_CRC_STRIP;
> +	return 0;
>  }
>  
>  static uint64_t
> @@ -403,14 +398,9 @@ static uint64_t
>  tap_tx_offload_get_port_capa(void)
>  {
>  	/*
> -	 * In order to support legacy apps,
> -	 * report capabilities also as port capabilities.
> +	 * No specific port Tx offload capabilities.
>  	 */
> -	return DEV_TX_OFFLOAD_MULTI_SEGS |
> -	       DEV_TX_OFFLOAD_IPV4_CKSUM |
> -	       DEV_TX_OFFLOAD_UDP_CKSUM |
> -	       DEV_TX_OFFLOAD_TCP_CKSUM |
> -	       DEV_TX_OFFLOAD_TCP_TSO;
> +	return 0;
>  }
>  
>  static uint64_t
> @@ -787,7 +777,8 @@ tap_dev_stop(struct rte_eth_dev *dev)
>  static int
>  tap_dev_configure(struct rte_eth_dev *dev)
>  {
> -	uint64_t supp_tx_offloads = tap_tx_offload_get_port_capa();
> +	uint64_t supp_tx_offloads = tap_tx_offload_get_port_capa() |
> +				tap_tx_offload_get_queue_capa();
>  	uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
>  
>  	if ((tx_offloads & supp_tx_offloads) != tx_offloads) {
>
  
Thomas Monjalon April 25, 2018, 4:47 p.m. UTC | #2
25/04/2018 18:15, Ophir Munk:
> Fix report on port offload capabilities to be 0 (no capabilities).
> Before this commit port capabilities were a clone of queue
> capabilities, however the current TAP offload capabilities (e.g.
> checksum calculation) are per queue and are not specific per port.

I did not follow what is the problem exactly.
But this change looks wrong to me.
Please look at the thread
	"Survey for final decision about per-port offload API"
	http://dpdk.org/ml/archives/dev/2018-March/094459.html
It says:
	"every queue capabilities must be reported as port capabilities"
  
Ferruh Yigit April 25, 2018, 5:13 p.m. UTC | #3
On 4/25/2018 5:47 PM, Thomas Monjalon wrote:
> 25/04/2018 18:15, Ophir Munk:
>> Fix report on port offload capabilities to be 0 (no capabilities).
>> Before this commit port capabilities were a clone of queue
>> capabilities, however the current TAP offload capabilities (e.g.
>> checksum calculation) are per queue and are not specific per port.
> 
> I did not follow what is the problem exactly.
> But this change looks wrong to me.
> Please look at the thread
> 	"Survey for final decision about per-port offload API"
> 	http://dpdk.org/ml/archives/dev/2018-March/094459.html
> It says:
> 	"every queue capabilities must be reported as port capabilities"

That logic is correct in capability reporting [1].

The problem here is the offload verify function assumes the
tap_rx_offload_get_port_capa() is the only port level offloads. Returning queue
level offloads in this function breaks the verify logic.

I think the reason of this issue is undocumented smart verify function
implementation (copied from mlx5 driver) [2], since it is not easy to understand
it is easy to confuse.


[1]
dev_info->rx_queue_offload_capa = tap_rx_offload_get_queue_capa();
dev_info->rx_offload_capa = tap_rx_offload_get_port_capa() |
                            dev_info->rx_queue_offload_capa;

[2]
static bool
tap_rxq_are_offloads_valid(struct rte_eth_dev *dev, uint64_t offloads)
{
        uint64_t port_offloads = dev->data->dev_conf.rxmode.offloads;
        uint64_t queue_supp_offloads = tap_rx_offload_get_queue_capa();
        uint64_t port_supp_offloads = tap_rx_offload_get_port_capa();

        if ((offloads & (queue_supp_offloads | port_supp_offloads)) !=
            offloads)
                return false;
        if ((port_offloads ^ offloads) & port_supp_offloads)
                return false;
        return true;
}
  
Ophir Munk April 26, 2018, 11:09 a.m. UTC | #4
Hi Ferruh,
Thanks for your review.
v2 was sent to mailing list that updates the log message and the commit message (based on Thomas comment that all queues capabilities must be reported as port capabilities)

> -----Original Message-----

> From: Ferruh Yigit [mailto:ferruh.yigit@intel.com]

> Sent: Wednesday, April 25, 2018 7:32 PM

> To: Ophir Munk <ophirmu@mellanox.com>; dev@dpdk.org; Pascal Mazon

> <pascal.mazon@6wind.com>

> Cc: Thomas Monjalon <thomas@monjalon.net>; Olga Shern

> <olgas@mellanox.com>; stable@dpdk.org

> Subject: Re: [PATCH v1] net/tap: return empty port offload capabilities

> 

> On 4/25/2018 5:15 PM, Ophir Munk wrote:

> > Fix report on port offload capabilities to be 0 (no capabilities).

> > Before this commit port capabilities were a clone of queue

> > capabilities, however the current TAP offload capabilities (e.g.

> > checksum calculation) are per queue and are not specific per port.

> 

> Overall looks good to me, thanks.

> 

> Is error log in tap_tx_queue_setup() still valid:

>   RTE_LOG(ERR, PMD,

>           "%p: Tx queue offloads 0x%" PRIx64

>           " don't match port offloads 0x%" PRIx64

>           " or supported offloads 0x%" PRIx64,

>           (void *)dev, tx_conf->offloads,

>           dev->data->dev_conf.txmode.offloads,

>           tap_tx_offload_get_port_capa());

> 

> There is no match expected, this path can be hit when requested offload out

> of reported capabilities, but either log or printed values give much

> information about real error cause.

> 

> Similar in tap_rx_queue_setup(), at least it does:

>  (tap_rx_offload_get_port_capa() | tap_rx_offload_get_queue_capa())

> 

> 

> 

> >

> > Fixes: 95ae196ae10b ("net/tap: use new Rx offloads API")

> > Fixes: 818fe14a9891 ("net/tap: use new Tx offloads API")

> > Cc: stable@dpdk.org

> >

> > Signed-off-by: Ophir Munk <ophirmu@mellanox.com>

> > ---

> >  drivers/net/tap/rte_eth_tap.c | 21 ++++++---------------

> >  1 file changed, 6 insertions(+), 15 deletions(-)

> >

> > diff --git a/drivers/net/tap/rte_eth_tap.c

> > b/drivers/net/tap/rte_eth_tap.c index fe62ab3..aea73b1 100644

> > --- a/drivers/net/tap/rte_eth_tap.c

> > +++ b/drivers/net/tap/rte_eth_tap.c

> > @@ -269,14 +269,9 @@ static uint64_t

> >  tap_rx_offload_get_port_capa(void)

> >  {

> >  	/*

> > -	 * In order to support legacy apps,

> > -	 * report capabilities also as port capabilities.

> > +	 * No specific port Rx offload capabilities.

> >  	 */

> > -	return DEV_RX_OFFLOAD_SCATTER |

> > -	       DEV_RX_OFFLOAD_IPV4_CKSUM |

> > -	       DEV_RX_OFFLOAD_UDP_CKSUM |

> > -	       DEV_RX_OFFLOAD_TCP_CKSUM |

> > -	       DEV_RX_OFFLOAD_CRC_STRIP;

> > +	return 0;

> >  }

> >

> >  static uint64_t

> > @@ -403,14 +398,9 @@ static uint64_t

> >  tap_tx_offload_get_port_capa(void)

> >  {

> >  	/*

> > -	 * In order to support legacy apps,

> > -	 * report capabilities also as port capabilities.

> > +	 * No specific port Tx offload capabilities.

> >  	 */

> > -	return DEV_TX_OFFLOAD_MULTI_SEGS |

> > -	       DEV_TX_OFFLOAD_IPV4_CKSUM |

> > -	       DEV_TX_OFFLOAD_UDP_CKSUM |

> > -	       DEV_TX_OFFLOAD_TCP_CKSUM |

> > -	       DEV_TX_OFFLOAD_TCP_TSO;

> > +	return 0;

> >  }

> >

> >  static uint64_t

> > @@ -787,7 +777,8 @@ tap_dev_stop(struct rte_eth_dev *dev)  static int

> > tap_dev_configure(struct rte_eth_dev *dev)  {

> > -	uint64_t supp_tx_offloads = tap_tx_offload_get_port_capa();

> > +	uint64_t supp_tx_offloads = tap_tx_offload_get_port_capa() |

> > +				tap_tx_offload_get_queue_capa();

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

> >

> >  	if ((tx_offloads & supp_tx_offloads) != tx_offloads) {

> >
  

Patch

diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c
index fe62ab3..aea73b1 100644
--- a/drivers/net/tap/rte_eth_tap.c
+++ b/drivers/net/tap/rte_eth_tap.c
@@ -269,14 +269,9 @@  static uint64_t
 tap_rx_offload_get_port_capa(void)
 {
 	/*
-	 * In order to support legacy apps,
-	 * report capabilities also as port capabilities.
+	 * No specific port Rx offload capabilities.
 	 */
-	return DEV_RX_OFFLOAD_SCATTER |
-	       DEV_RX_OFFLOAD_IPV4_CKSUM |
-	       DEV_RX_OFFLOAD_UDP_CKSUM |
-	       DEV_RX_OFFLOAD_TCP_CKSUM |
-	       DEV_RX_OFFLOAD_CRC_STRIP;
+	return 0;
 }
 
 static uint64_t
@@ -403,14 +398,9 @@  static uint64_t
 tap_tx_offload_get_port_capa(void)
 {
 	/*
-	 * In order to support legacy apps,
-	 * report capabilities also as port capabilities.
+	 * No specific port Tx offload capabilities.
 	 */
-	return DEV_TX_OFFLOAD_MULTI_SEGS |
-	       DEV_TX_OFFLOAD_IPV4_CKSUM |
-	       DEV_TX_OFFLOAD_UDP_CKSUM |
-	       DEV_TX_OFFLOAD_TCP_CKSUM |
-	       DEV_TX_OFFLOAD_TCP_TSO;
+	return 0;
 }
 
 static uint64_t
@@ -787,7 +777,8 @@  tap_dev_stop(struct rte_eth_dev *dev)
 static int
 tap_dev_configure(struct rte_eth_dev *dev)
 {
-	uint64_t supp_tx_offloads = tap_tx_offload_get_port_capa();
+	uint64_t supp_tx_offloads = tap_tx_offload_get_port_capa() |
+				tap_tx_offload_get_queue_capa();
 	uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
 
 	if ((tx_offloads & supp_tx_offloads) != tx_offloads) {