[dpdk-dev,v1] net/tap: return empty port offload capabilities
Checks
Commit Message
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
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) {
>
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"
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;
}
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) {
> >
@@ -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) {