* [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements @ 2018-06-01 12:47 Maxime Coquelin 2018-06-01 12:47 ` [dpdk-dev] [PATCH 1/4] net/virtio: use simple path for Tx even if Rx mergeable Maxime Coquelin ` (4 more replies) 0 siblings, 5 replies; 17+ messages in thread From: Maxime Coquelin @ 2018-06-01 12:47 UTC (permalink / raw) To: zhihong.wang, tiwei.bie, dev; +Cc: Maxime Coquelin This series addresses a problem seen when running benchmars, where we see a big difference in Tx performance depending on whether Rx mergeable is enabled or not. With patch 1, Tx simple path is selected even when Rx-mrg is negotiated. Digging a bit further, I found that Tx simple path could be selected even when offload features had been negotiated. With patch 2, guest does not try to negotiate Tx offload features that haven't been selected by the application. It means that without restarting the guest, we can now switch from Tx simple path when application do no request offloads, to Tx standard path when the application request offloads. Note that to do so, one must stop the port first [0]. Another advantage of doing this than using Tx simple path when guest application does not use offload features, is that on host side, the virtio net header parsing is skipped in dequeue function. Patch 3 fixes an issue with Rx offload, as simple path was be used if application requested TCP LRO only. Finally, patch 4 aims at improving the offload feature checks in the standard paths. Below are benchmarks results when offloads are enabled at device level. Rx-mrg=off benchmarks: +------------+-------+-------------+-------------+----------+ | Run | PVP | Guest->Host | Host->Guest | Loopback | +------------+-------+-------------+-------------+----------+ | v18.05 | 14.47 | 17.02 | 17.57 | 13.15 | | + series | 14.88 | 19.64 | 17.63 | 13.11 | +------------+-------+-------------+-------------+----------+ Rx-mrg=on benchmarks: +------------+-------+-------------+-------------+----------+ | Run | PVP | Guest->Host | Host->Guest | Loopback | +------------+-------+-------------+-------------+----------+ | v18.05 | 9.53 | 13.80 | 16.70 | 13.11 | | + series | 12.62 | 19.69 | 16.70 | 13.11 | +------------+-------+-------------+-------------+----------+ [0]: testpmd> port start 0 EAL: Error disabling MSI-X interrupts for fd 17 set_rxtx_funcs(): virtio: using mergeable buffer Rx path on port 0 set_rxtx_funcs(): virtio: using simple Tx path on port 0 Port 0: 52:54:00:58:D7:01 Checking link statuses... Done testpmd> show port 0 tx_offload capabilities Tx Offloading Capabilities of port 0 : Per Queue : Per Port : VLAN_INSERT UDP_CKSUM TCP_CKSUM TCP_TSO MULTI_SEGS testpmd> show port 0 tx_offload configuration Tx Offloading Configuration of port 0 : Port : Queue[ 0] : testpmd> port stop 0 Stopping ports... Checking link statuses... Done testpmd> csum set tcp hw 0 Parse tunnel is off IP checksum offload is sw UDP checksum offload is sw TCP checksum offload is hw SCTP checksum offload is sw Outer-Ip checksum offload is sw testpmd> port start 0 Configuring Port 0 (socket 0) EAL: Error disabling MSI-X interrupts for fd 17 set_rxtx_funcs(): virtio: using mergeable buffer Rx path on port 0 set_rxtx_funcs(): virtio: using standard Tx path on port 0 Port 0: 52:54:00:58:D7:01 Checking link statuses... Done testpmd> show port 0 tx_offload configuration Tx Offloading Configuration of port 0 : Port : TCP_CKSUM Queue[ 0] : Maxime Coquelin (4): net/virtio: use simple path for Tx even if Rx mergeable net/vhost: improve Tx path selection net/virtio: don't use simple Rx path if TCP LRO requested net/virtio: improve offload check performance drivers/net/virtio/virtio_ethdev.c | 43 ++++++++++++++++++++++++++++++++++---- drivers/net/virtio/virtio_ethdev.h | 3 --- drivers/net/virtio/virtio_pci.h | 2 ++ drivers/net/virtio/virtio_rxtx.c | 29 ++++++------------------- 4 files changed, 47 insertions(+), 30 deletions(-) -- 2.14.3 ^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 1/4] net/virtio: use simple path for Tx even if Rx mergeable 2018-06-01 12:47 [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin @ 2018-06-01 12:47 ` Maxime Coquelin 2018-06-01 12:47 ` [dpdk-dev] [PATCH 2/4] net/vhost: improve Tx path selection Maxime Coquelin ` (3 subsequent siblings) 4 siblings, 0 replies; 17+ messages in thread From: Maxime Coquelin @ 2018-06-01 12:47 UTC (permalink / raw) To: zhihong.wang, tiwei.bie, dev; +Cc: Maxime Coquelin Having Rx mergeable buffers feature enabled should not be a reason to not use Tx simple path. Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> --- drivers/net/virtio/virtio_ethdev.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 5833dad73..e68e9d067 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1879,7 +1879,6 @@ virtio_dev_configure(struct rte_eth_dev *dev) #endif if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF)) { hw->use_simple_rx = 0; - hw->use_simple_tx = 0; } if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | -- 2.14.3 ^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 2/4] net/vhost: improve Tx path selection 2018-06-01 12:47 [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin 2018-06-01 12:47 ` [dpdk-dev] [PATCH 1/4] net/virtio: use simple path for Tx even if Rx mergeable Maxime Coquelin @ 2018-06-01 12:47 ` Maxime Coquelin 2018-06-04 12:25 ` Tiwei Bie 2018-06-01 12:47 ` [dpdk-dev] [PATCH 3/4] net/virtio: don't use simple Rx path if TCP LRO requested Maxime Coquelin ` (2 subsequent siblings) 4 siblings, 1 reply; 17+ messages in thread From: Maxime Coquelin @ 2018-06-01 12:47 UTC (permalink / raw) To: zhihong.wang, tiwei.bie, dev; +Cc: Maxime Coquelin This patch improves the Tx path selection depending on whether the application request for offloads, and on whether offload features have been negotiated. When the application doesn't request for Tx offload features, the corresponding features bits aren't negotiated. When Tx offload virtio features have been negotiated, ensure the simple Tx path isn't selected. Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> --- drivers/net/virtio/virtio_ethdev.c | 20 ++++++++++++++++++-- drivers/net/virtio/virtio_ethdev.h | 3 --- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index e68e9d067..5730620ed 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1798,8 +1798,10 @@ static int virtio_dev_configure(struct rte_eth_dev *dev) { const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; + const struct rte_eth_txmode *txmode = &dev->data->dev_conf.txmode; struct virtio_hw *hw = dev->data->dev_private; uint64_t rx_offloads = rxmode->offloads; + uint64_t tx_offloads = txmode->offloads; uint64_t req_features; int ret; @@ -1821,6 +1823,15 @@ virtio_dev_configure(struct rte_eth_dev *dev) (1ULL << VIRTIO_NET_F_GUEST_TSO4) | (1ULL << VIRTIO_NET_F_GUEST_TSO6); + if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | + DEV_TX_OFFLOAD_UDP_CKSUM)) + req_features |= (1ULL << VIRTIO_NET_F_CSUM); + + if (tx_offloads & DEV_TX_OFFLOAD_TCP_TSO) + req_features |= + (1ULL << VIRTIO_NET_F_HOST_TSO4) | + (1ULL << VIRTIO_NET_F_HOST_TSO6); + /* if request features changed, reinit the device */ if (req_features != hw->req_guest_features) { ret = virtio_init_device(dev, req_features); @@ -1885,6 +1896,11 @@ virtio_dev_configure(struct rte_eth_dev *dev) DEV_RX_OFFLOAD_TCP_CKSUM)) hw->use_simple_rx = 0; + if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | + DEV_TX_OFFLOAD_UDP_CKSUM | + DEV_TX_OFFLOAD_TCP_TSO)) + hw->use_simple_tx = 0; + return 0; } @@ -2138,14 +2154,14 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS | DEV_TX_OFFLOAD_VLAN_INSERT; - if (hw->guest_features & (1ULL << VIRTIO_NET_F_CSUM)) { + if (host_features & (1ULL << VIRTIO_NET_F_CSUM)) { dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_UDP_CKSUM | DEV_TX_OFFLOAD_TCP_CKSUM; } tso_mask = (1ULL << VIRTIO_NET_F_HOST_TSO4) | (1ULL << VIRTIO_NET_F_HOST_TSO6); - if ((hw->guest_features & tso_mask) == tso_mask) + if ((host_features & tso_mask) == tso_mask) dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO; } diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h index bb40064ea..b603665c7 100644 --- a/drivers/net/virtio/virtio_ethdev.h +++ b/drivers/net/virtio/virtio_ethdev.h @@ -28,9 +28,6 @@ 1u << VIRTIO_NET_F_CTRL_VQ | \ 1u << VIRTIO_NET_F_CTRL_RX | \ 1u << VIRTIO_NET_F_CTRL_VLAN | \ - 1u << VIRTIO_NET_F_CSUM | \ - 1u << VIRTIO_NET_F_HOST_TSO4 | \ - 1u << VIRTIO_NET_F_HOST_TSO6 | \ 1u << VIRTIO_NET_F_MRG_RXBUF | \ 1u << VIRTIO_NET_F_MTU | \ 1ULL << VIRTIO_NET_F_GUEST_ANNOUNCE | \ -- 2.14.3 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 2/4] net/vhost: improve Tx path selection 2018-06-01 12:47 ` [dpdk-dev] [PATCH 2/4] net/vhost: improve Tx path selection Maxime Coquelin @ 2018-06-04 12:25 ` Tiwei Bie 0 siblings, 0 replies; 17+ messages in thread From: Tiwei Bie @ 2018-06-04 12:25 UTC (permalink / raw) To: Maxime Coquelin; +Cc: zhihong.wang, dev On Fri, Jun 01, 2018 at 02:47:56PM +0200, Maxime Coquelin wrote: > This patch improves the Tx path selection depending on > whether the application request for offloads, and on whether > offload features have been negotiated. > > When the application doesn't request for Tx offload features, > the corresponding features bits aren't negotiated. > > When Tx offload virtio features have been negotiated, ensure > the simple Tx path isn't selected. > > Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> > --- > drivers/net/virtio/virtio_ethdev.c | 20 ++++++++++++++++++-- > drivers/net/virtio/virtio_ethdev.h | 3 --- > 2 files changed, 18 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c > index e68e9d067..5730620ed 100644 > --- a/drivers/net/virtio/virtio_ethdev.c > +++ b/drivers/net/virtio/virtio_ethdev.c > @@ -1798,8 +1798,10 @@ static int > virtio_dev_configure(struct rte_eth_dev *dev) > { > const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode; > + const struct rte_eth_txmode *txmode = &dev->data->dev_conf.txmode; > struct virtio_hw *hw = dev->data->dev_private; > uint64_t rx_offloads = rxmode->offloads; > + uint64_t tx_offloads = txmode->offloads; > uint64_t req_features; > int ret; > > @@ -1821,6 +1823,15 @@ virtio_dev_configure(struct rte_eth_dev *dev) > (1ULL << VIRTIO_NET_F_GUEST_TSO4) | > (1ULL << VIRTIO_NET_F_GUEST_TSO6); > > + if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | > + DEV_TX_OFFLOAD_UDP_CKSUM)) I think it's better to keep DEV_TX_OFFLOAD_TCP/UDP_CKSUM aligned, something like: if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM)) > + req_features |= (1ULL << VIRTIO_NET_F_CSUM); > + > + if (tx_offloads & DEV_TX_OFFLOAD_TCP_TSO) > + req_features |= > + (1ULL << VIRTIO_NET_F_HOST_TSO4) | > + (1ULL << VIRTIO_NET_F_HOST_TSO6); > + > /* if request features changed, reinit the device */ > if (req_features != hw->req_guest_features) { > ret = virtio_init_device(dev, req_features); > @@ -1885,6 +1896,11 @@ virtio_dev_configure(struct rte_eth_dev *dev) > DEV_RX_OFFLOAD_TCP_CKSUM)) > hw->use_simple_rx = 0; > > + if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | > + DEV_TX_OFFLOAD_UDP_CKSUM | > + DEV_TX_OFFLOAD_TCP_TSO)) Ditto. I think it's better to keep them aligned, something like: if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM | DEV_TX_OFFLOAD_TCP_TSO)) Besides, we also need to consider not using simple Tx when DEV_TX_OFFLOAD_VLAN_INSERT is requested. Best regards, Tiwei Bie > + hw->use_simple_tx = 0; > + > return 0; > } > > @@ -2138,14 +2154,14 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) > > dev_info->tx_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS | > DEV_TX_OFFLOAD_VLAN_INSERT; > - if (hw->guest_features & (1ULL << VIRTIO_NET_F_CSUM)) { > + if (host_features & (1ULL << VIRTIO_NET_F_CSUM)) { > dev_info->tx_offload_capa |= > DEV_TX_OFFLOAD_UDP_CKSUM | > DEV_TX_OFFLOAD_TCP_CKSUM; > } > tso_mask = (1ULL << VIRTIO_NET_F_HOST_TSO4) | > (1ULL << VIRTIO_NET_F_HOST_TSO6); > - if ((hw->guest_features & tso_mask) == tso_mask) > + if ((host_features & tso_mask) == tso_mask) > dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO; > } > > diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h > index bb40064ea..b603665c7 100644 > --- a/drivers/net/virtio/virtio_ethdev.h > +++ b/drivers/net/virtio/virtio_ethdev.h > @@ -28,9 +28,6 @@ > 1u << VIRTIO_NET_F_CTRL_VQ | \ > 1u << VIRTIO_NET_F_CTRL_RX | \ > 1u << VIRTIO_NET_F_CTRL_VLAN | \ > - 1u << VIRTIO_NET_F_CSUM | \ > - 1u << VIRTIO_NET_F_HOST_TSO4 | \ > - 1u << VIRTIO_NET_F_HOST_TSO6 | \ > 1u << VIRTIO_NET_F_MRG_RXBUF | \ > 1u << VIRTIO_NET_F_MTU | \ > 1ULL << VIRTIO_NET_F_GUEST_ANNOUNCE | \ > -- > 2.14.3 > ^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 3/4] net/virtio: don't use simple Rx path if TCP LRO requested 2018-06-01 12:47 [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin 2018-06-01 12:47 ` [dpdk-dev] [PATCH 1/4] net/virtio: use simple path for Tx even if Rx mergeable Maxime Coquelin 2018-06-01 12:47 ` [dpdk-dev] [PATCH 2/4] net/vhost: improve Tx path selection Maxime Coquelin @ 2018-06-01 12:47 ` Maxime Coquelin 2018-06-04 11:59 ` Tiwei Bie 2018-06-01 12:47 ` [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance Maxime Coquelin 2018-06-04 7:42 ` [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin 4 siblings, 1 reply; 17+ messages in thread From: Maxime Coquelin @ 2018-06-01 12:47 UTC (permalink / raw) To: zhihong.wang, tiwei.bie, dev; +Cc: Maxime Coquelin Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> --- drivers/net/virtio/virtio_ethdev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 5730620ed..d481b282e 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1893,7 +1893,8 @@ virtio_dev_configure(struct rte_eth_dev *dev) } if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | - DEV_RX_OFFLOAD_TCP_CKSUM)) + DEV_RX_OFFLOAD_TCP_CKSUM | + DEV_RX_OFFLOAD_TCP_LRO)) hw->use_simple_rx = 0; if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | -- 2.14.3 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 3/4] net/virtio: don't use simple Rx path if TCP LRO requested 2018-06-01 12:47 ` [dpdk-dev] [PATCH 3/4] net/virtio: don't use simple Rx path if TCP LRO requested Maxime Coquelin @ 2018-06-04 11:59 ` Tiwei Bie 2018-06-04 14:32 ` Maxime Coquelin 0 siblings, 1 reply; 17+ messages in thread From: Tiwei Bie @ 2018-06-04 11:59 UTC (permalink / raw) To: Maxime Coquelin; +Cc: zhihong.wang, dev On Fri, Jun 01, 2018 at 02:47:57PM +0200, Maxime Coquelin wrote: > Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> > --- > drivers/net/virtio/virtio_ethdev.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c > index 5730620ed..d481b282e 100644 > --- a/drivers/net/virtio/virtio_ethdev.c > +++ b/drivers/net/virtio/virtio_ethdev.c > @@ -1893,7 +1893,8 @@ virtio_dev_configure(struct rte_eth_dev *dev) > } > > if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | > - DEV_RX_OFFLOAD_TCP_CKSUM)) > + DEV_RX_OFFLOAD_TCP_CKSUM | > + DEV_RX_OFFLOAD_TCP_LRO)) Maybe we also need to consider not using simple Rx when DEV_RX_OFFLOAD_VLAN_STRIP is requested. Best regards, Tiwei Bie > hw->use_simple_rx = 0; > > if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | > -- > 2.14.3 > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 3/4] net/virtio: don't use simple Rx path if TCP LRO requested 2018-06-04 11:59 ` Tiwei Bie @ 2018-06-04 14:32 ` Maxime Coquelin 2018-06-05 13:39 ` Maxime Coquelin 0 siblings, 1 reply; 17+ messages in thread From: Maxime Coquelin @ 2018-06-04 14:32 UTC (permalink / raw) To: Tiwei Bie; +Cc: zhihong.wang, dev On 06/04/2018 01:59 PM, Tiwei Bie wrote: > On Fri, Jun 01, 2018 at 02:47:57PM +0200, Maxime Coquelin wrote: >> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> >> --- >> drivers/net/virtio/virtio_ethdev.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c >> index 5730620ed..d481b282e 100644 >> --- a/drivers/net/virtio/virtio_ethdev.c >> +++ b/drivers/net/virtio/virtio_ethdev.c >> @@ -1893,7 +1893,8 @@ virtio_dev_configure(struct rte_eth_dev *dev) >> } >> >> if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | >> - DEV_RX_OFFLOAD_TCP_CKSUM)) >> + DEV_RX_OFFLOAD_TCP_CKSUM | >> + DEV_RX_OFFLOAD_TCP_LRO)) > > Maybe we also need to consider not using simple Rx > when DEV_RX_OFFLOAD_VLAN_STRIP is requested. I think that makes sense. Thanks, Maxime > Best regards, > Tiwei Bie > >> hw->use_simple_rx = 0; >> >> if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | >> -- >> 2.14.3 >> ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 3/4] net/virtio: don't use simple Rx path if TCP LRO requested 2018-06-04 14:32 ` Maxime Coquelin @ 2018-06-05 13:39 ` Maxime Coquelin 0 siblings, 0 replies; 17+ messages in thread From: Maxime Coquelin @ 2018-06-05 13:39 UTC (permalink / raw) To: Tiwei Bie; +Cc: zhihong.wang, dev On 06/04/2018 04:32 PM, Maxime Coquelin wrote: > > > On 06/04/2018 01:59 PM, Tiwei Bie wrote: >> On Fri, Jun 01, 2018 at 02:47:57PM +0200, Maxime Coquelin wrote: >>> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> >>> --- >>> drivers/net/virtio/virtio_ethdev.c | 3 ++- >>> 1 file changed, 2 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/net/virtio/virtio_ethdev.c >>> b/drivers/net/virtio/virtio_ethdev.c >>> index 5730620ed..d481b282e 100644 >>> --- a/drivers/net/virtio/virtio_ethdev.c >>> +++ b/drivers/net/virtio/virtio_ethdev.c >>> @@ -1893,7 +1893,8 @@ virtio_dev_configure(struct rte_eth_dev *dev) >>> } >>> if (rx_offloads & (DEV_RX_OFFLOAD_UDP_CKSUM | >>> - DEV_RX_OFFLOAD_TCP_CKSUM)) >>> + DEV_RX_OFFLOAD_TCP_CKSUM | >>> + DEV_RX_OFFLOAD_TCP_LRO)) >> >> Maybe we also need to consider not using simple Rx >> when DEV_RX_OFFLOAD_VLAN_STRIP is requested. > > I think that makes sense. And also the same for Tx when VLAN_INSERT is requested > Thanks, > Maxime > >> Best regards, >> Tiwei Bie >> >>> hw->use_simple_rx = 0; >>> if (tx_offloads & (DEV_TX_OFFLOAD_TCP_CKSUM | >>> -- >>> 2.14.3 >>> ^ permalink raw reply [flat|nested] 17+ messages in thread
* [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance 2018-06-01 12:47 [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin ` (2 preceding siblings ...) 2018-06-01 12:47 ` [dpdk-dev] [PATCH 3/4] net/virtio: don't use simple Rx path if TCP LRO requested Maxime Coquelin @ 2018-06-01 12:47 ` Maxime Coquelin 2018-06-04 11:55 ` Tiwei Bie 2018-06-04 7:42 ` [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin 4 siblings, 1 reply; 17+ messages in thread From: Maxime Coquelin @ 2018-06-01 12:47 UTC (permalink / raw) To: zhihong.wang, tiwei.bie, dev; +Cc: Maxime Coquelin Instead of checking the multiple Virtio features bits for every packet, let's do the check once at configure time and store it in virtio_hw struct. Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> --- drivers/net/virtio/virtio_ethdev.c | 19 +++++++++++++++++++ drivers/net/virtio/virtio_pci.h | 2 ++ drivers/net/virtio/virtio_rxtx.c | 29 ++++++----------------------- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index d481b282e..981e0994a 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1790,6 +1790,22 @@ rte_virtio_pmd_init(void) rte_pci_register(&rte_virtio_pmd); } +static inline int +rx_offload_enabled(struct virtio_hw *hw) +{ + return vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM) || + vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) || + vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6); +} + +static inline int +tx_offload_enabled(struct virtio_hw *hw) +{ + return vtpci_with_feature(hw, VIRTIO_NET_F_CSUM) || + vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO4) || + vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO6); +} + /* * Configure virtio device * It returns 0 on success. @@ -1869,6 +1885,9 @@ virtio_dev_configure(struct rte_eth_dev *dev) return -ENOTSUP; } + hw->has_tx_offload = !!tx_offload_enabled(hw); + hw->has_rx_offload = !!rx_offload_enabled(hw); + if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) /* Enable vector (0) for Link State Intrerrupt */ if (VTPCI_OPS(hw)->set_config_irq(hw, 0) == diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index a28ba8339..e0bb871f2 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -233,6 +233,8 @@ struct virtio_hw { uint8_t modern; uint8_t use_simple_rx; uint8_t use_simple_tx; + uint8_t has_tx_offload; + uint8_t has_rx_offload; uint16_t port_id; uint8_t mac_addr[ETHER_ADDR_LEN]; uint32_t notify_off_multiplier; diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c index 92fab2174..3f113a118 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -225,13 +225,6 @@ virtio_tso_fix_cksum(struct rte_mbuf *m) } } -static inline int -tx_offload_enabled(struct virtio_hw *hw) -{ - return vtpci_with_feature(hw, VIRTIO_NET_F_CSUM) || - vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO4) || - vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO6); -} /* avoid write operation when necessary, to lessen cache issues */ #define ASSIGN_UNLESS_EQUAL(var, val) do { \ @@ -253,13 +246,15 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, struct virtio_net_hdr *hdr; int offload; - offload = tx_offload_enabled(vq->hw); head_idx = vq->vq_desc_head_idx; idx = head_idx; dxp = &vq->vq_descx[idx]; dxp->cookie = (void *)cookie; dxp->ndescs = needed; + offload = vq->hw->has_tx_offload && + (cookie->ol_flags & PKT_TX_OFFLOAD_MASK); + start_dp = vq->vq_ring.desc; if (can_push) { @@ -270,7 +265,6 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, * which is wrong. Below subtract restores correct pkt size. */ cookie->pkt_len -= head_size; - /* if offload disabled, it is not zeroed below, do it now */ if (offload == 0) { ASSIGN_UNLESS_EQUAL(hdr->csum_start, 0); ASSIGN_UNLESS_EQUAL(hdr->csum_offset, 0); @@ -686,14 +680,6 @@ virtio_rx_offload(struct rte_mbuf *m, struct virtio_net_hdr *hdr) return 0; } -static inline int -rx_offload_enabled(struct virtio_hw *hw) -{ - return vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM) || - vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) || - vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6); -} - #define VIRTIO_MBUF_BURST_SZ 64 #define DESC_PER_CACHELINE (RTE_CACHE_LINE_SIZE / sizeof(struct vring_desc)) uint16_t @@ -709,7 +695,6 @@ virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) int error; uint32_t i, nb_enqueued; uint32_t hdr_size; - int offload; struct virtio_net_hdr *hdr; nb_rx = 0; @@ -731,7 +716,6 @@ virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) nb_enqueued = 0; hdr_size = hw->vtnet_hdr_size; - offload = rx_offload_enabled(hw); for (i = 0; i < num ; i++) { rxm = rcv_pkts[i]; @@ -760,7 +744,7 @@ virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) if (hw->vlan_strip) rte_vlan_strip(rxm); - if (offload && virtio_rx_offload(rxm, hdr) < 0) { + if (hw->has_rx_offload && virtio_rx_offload(rxm, hdr) < 0) { virtio_discard_rxbuf(vq, rxm); rxvq->stats.errors++; continue; @@ -825,7 +809,6 @@ virtio_recv_mergeable_pkts(void *rx_queue, uint16_t extra_idx; uint32_t seg_res; uint32_t hdr_size; - int offload; nb_rx = 0; if (unlikely(hw->started == 0)) @@ -843,7 +826,6 @@ virtio_recv_mergeable_pkts(void *rx_queue, extra_idx = 0; seg_res = 0; hdr_size = hw->vtnet_hdr_size; - offload = rx_offload_enabled(hw); while (i < nb_used) { struct virtio_net_hdr_mrg_rxbuf *header; @@ -888,7 +870,8 @@ virtio_recv_mergeable_pkts(void *rx_queue, rx_pkts[nb_rx] = rxm; prev = rxm; - if (offload && virtio_rx_offload(rxm, &header->hdr) < 0) { + if (hw->has_rx_offload && + virtio_rx_offload(rxm, &header->hdr) < 0) { virtio_discard_rxbuf(vq, rxm); rxvq->stats.errors++; continue; -- 2.14.3 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance 2018-06-01 12:47 ` [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance Maxime Coquelin @ 2018-06-04 11:55 ` Tiwei Bie 2018-06-04 14:29 ` Maxime Coquelin 0 siblings, 1 reply; 17+ messages in thread From: Tiwei Bie @ 2018-06-04 11:55 UTC (permalink / raw) To: Maxime Coquelin; +Cc: zhihong.wang, dev On Fri, Jun 01, 2018 at 02:47:58PM +0200, Maxime Coquelin wrote: > Instead of checking the multiple Virtio features bits for > every packet, let's do the check once at configure time and > store it in virtio_hw struct. > > Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> > --- > drivers/net/virtio/virtio_ethdev.c | 19 +++++++++++++++++++ > drivers/net/virtio/virtio_pci.h | 2 ++ > drivers/net/virtio/virtio_rxtx.c | 29 ++++++----------------------- > 3 files changed, 27 insertions(+), 23 deletions(-) > > diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c > index d481b282e..981e0994a 100644 > --- a/drivers/net/virtio/virtio_ethdev.c > +++ b/drivers/net/virtio/virtio_ethdev.c > @@ -1790,6 +1790,22 @@ rte_virtio_pmd_init(void) > rte_pci_register(&rte_virtio_pmd); > } > > +static inline int Maybe it's better to return bool. > +rx_offload_enabled(struct virtio_hw *hw) > +{ > + return vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM) || > + vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) || > + vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6); > +} > + > +static inline int Ditto. > +tx_offload_enabled(struct virtio_hw *hw) > +{ > + return vtpci_with_feature(hw, VIRTIO_NET_F_CSUM) || > + vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO4) || > + vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO6); > +} > + > /* > * Configure virtio device > * It returns 0 on success. > @@ -1869,6 +1885,9 @@ virtio_dev_configure(struct rte_eth_dev *dev) > return -ENOTSUP; > } > > + hw->has_tx_offload = !!tx_offload_enabled(hw); > + hw->has_rx_offload = !!rx_offload_enabled(hw); > + > if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) > /* Enable vector (0) for Link State Intrerrupt */ > if (VTPCI_OPS(hw)->set_config_irq(hw, 0) == > diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h > index a28ba8339..e0bb871f2 100644 > --- a/drivers/net/virtio/virtio_pci.h > +++ b/drivers/net/virtio/virtio_pci.h > @@ -233,6 +233,8 @@ struct virtio_hw { > uint8_t modern; > uint8_t use_simple_rx; > uint8_t use_simple_tx; > + uint8_t has_tx_offload; > + uint8_t has_rx_offload; I think it's better to use spaces, instead of 4 spaces width tabs after uint8_t. > uint16_t port_id; > uint8_t mac_addr[ETHER_ADDR_LEN]; > uint32_t notify_off_multiplier; > diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c > index 92fab2174..3f113a118 100644 > --- a/drivers/net/virtio/virtio_rxtx.c > +++ b/drivers/net/virtio/virtio_rxtx.c > @@ -225,13 +225,6 @@ virtio_tso_fix_cksum(struct rte_mbuf *m) > } > } > > -static inline int > -tx_offload_enabled(struct virtio_hw *hw) > -{ > - return vtpci_with_feature(hw, VIRTIO_NET_F_CSUM) || > - vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO4) || > - vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO6); > -} > > /* avoid write operation when necessary, to lessen cache issues */ > #define ASSIGN_UNLESS_EQUAL(var, val) do { \ > @@ -253,13 +246,15 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, > struct virtio_net_hdr *hdr; > int offload; > > - offload = tx_offload_enabled(vq->hw); > head_idx = vq->vq_desc_head_idx; > idx = head_idx; > dxp = &vq->vq_descx[idx]; > dxp->cookie = (void *)cookie; > dxp->ndescs = needed; > > + offload = vq->hw->has_tx_offload && > + (cookie->ol_flags & PKT_TX_OFFLOAD_MASK); If features aren't negotiated, I think there is no need to check ol_flags and update the net header. > + > start_dp = vq->vq_ring.desc; > > if (can_push) { > @@ -270,7 +265,6 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, > * which is wrong. Below subtract restores correct pkt size. > */ > cookie->pkt_len -= head_size; > - /* if offload disabled, it is not zeroed below, do it now */ > if (offload == 0) { > ASSIGN_UNLESS_EQUAL(hdr->csum_start, 0); > ASSIGN_UNLESS_EQUAL(hdr->csum_offset, 0); > @@ -686,14 +680,6 @@ virtio_rx_offload(struct rte_mbuf *m, struct virtio_net_hdr *hdr) > return 0; > } [...] Best regards, Tiwei Bie ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance 2018-06-04 11:55 ` Tiwei Bie @ 2018-06-04 14:29 ` Maxime Coquelin 2018-06-05 3:10 ` Tiwei Bie 0 siblings, 1 reply; 17+ messages in thread From: Maxime Coquelin @ 2018-06-04 14:29 UTC (permalink / raw) To: Tiwei Bie; +Cc: zhihong.wang, dev On 06/04/2018 01:55 PM, Tiwei Bie wrote: > On Fri, Jun 01, 2018 at 02:47:58PM +0200, Maxime Coquelin wrote: >> Instead of checking the multiple Virtio features bits for >> every packet, let's do the check once at configure time and >> store it in virtio_hw struct. >> >> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> >> --- >> drivers/net/virtio/virtio_ethdev.c | 19 +++++++++++++++++++ >> drivers/net/virtio/virtio_pci.h | 2 ++ >> drivers/net/virtio/virtio_rxtx.c | 29 ++++++----------------------- >> 3 files changed, 27 insertions(+), 23 deletions(-) >> >> diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c >> index d481b282e..981e0994a 100644 >> --- a/drivers/net/virtio/virtio_ethdev.c >> +++ b/drivers/net/virtio/virtio_ethdev.c >> @@ -1790,6 +1790,22 @@ rte_virtio_pmd_init(void) >> rte_pci_register(&rte_virtio_pmd); >> } >> >> +static inline int > > Maybe it's better to return bool. Agree, I'll do that. I just moved code from virtio_rxtx.c without change, but it is indeed better to return bool. >> +rx_offload_enabled(struct virtio_hw *hw) >> +{ >> + return vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM) || >> + vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) || >> + vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO6); >> +} >> + >> +static inline int > > Ditto. > >> +tx_offload_enabled(struct virtio_hw *hw) >> +{ >> + return vtpci_with_feature(hw, VIRTIO_NET_F_CSUM) || >> + vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO4) || >> + vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO6); >> +} >> + >> /* >> * Configure virtio device >> * It returns 0 on success. >> @@ -1869,6 +1885,9 @@ virtio_dev_configure(struct rte_eth_dev *dev) >> return -ENOTSUP; >> } >> >> + hw->has_tx_offload = !!tx_offload_enabled(hw); >> + hw->has_rx_offload = !!rx_offload_enabled(hw); >> + >> if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) >> /* Enable vector (0) for Link State Intrerrupt */ >> if (VTPCI_OPS(hw)->set_config_irq(hw, 0) == >> diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h >> index a28ba8339..e0bb871f2 100644 >> --- a/drivers/net/virtio/virtio_pci.h >> +++ b/drivers/net/virtio/virtio_pci.h >> @@ -233,6 +233,8 @@ struct virtio_hw { >> uint8_t modern; >> uint8_t use_simple_rx; >> uint8_t use_simple_tx; >> + uint8_t has_tx_offload; >> + uint8_t has_rx_offload; Acked. > > I think it's better to use spaces, instead of > 4 spaces width tabs after uint8_t. > >> uint16_t port_id; >> uint8_t mac_addr[ETHER_ADDR_LEN]; >> uint32_t notify_off_multiplier; >> diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c >> index 92fab2174..3f113a118 100644 >> --- a/drivers/net/virtio/virtio_rxtx.c >> +++ b/drivers/net/virtio/virtio_rxtx.c >> @@ -225,13 +225,6 @@ virtio_tso_fix_cksum(struct rte_mbuf *m) >> } >> } >> >> -static inline int >> -tx_offload_enabled(struct virtio_hw *hw) >> -{ >> - return vtpci_with_feature(hw, VIRTIO_NET_F_CSUM) || >> - vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO4) || >> - vtpci_with_feature(hw, VIRTIO_NET_F_HOST_TSO6); >> -} >> >> /* avoid write operation when necessary, to lessen cache issues */ >> #define ASSIGN_UNLESS_EQUAL(var, val) do { \ >> @@ -253,13 +246,15 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, >> struct virtio_net_hdr *hdr; >> int offload; >> >> - offload = tx_offload_enabled(vq->hw); >> head_idx = vq->vq_desc_head_idx; >> idx = head_idx; >> dxp = &vq->vq_descx[idx]; >> dxp->cookie = (void *)cookie; >> dxp->ndescs = needed; >> >> + offload = vq->hw->has_tx_offload && >> + (cookie->ol_flags & PKT_TX_OFFLOAD_MASK); > > If features aren't negotiated, I think there is no need to > check ol_flags and update the net header. Isn't what the code is doing? has_tx_offload will be false if none of the Tx offload features have been negotiated, so ol_flags won't be checked in that case. >> + >> start_dp = vq->vq_ring.desc; >> >> if (can_push) { >> @@ -270,7 +265,6 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, >> * which is wrong. Below subtract restores correct pkt size. >> */ >> cookie->pkt_len -= head_size; >> - /* if offload disabled, it is not zeroed below, do it now */ >> if (offload == 0) { >> ASSIGN_UNLESS_EQUAL(hdr->csum_start, 0); >> ASSIGN_UNLESS_EQUAL(hdr->csum_offset, 0); >> @@ -686,14 +680,6 @@ virtio_rx_offload(struct rte_mbuf *m, struct virtio_net_hdr *hdr) >> return 0; >> } > [...] > > Best regards, > Tiwei Bie > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance 2018-06-04 14:29 ` Maxime Coquelin @ 2018-06-05 3:10 ` Tiwei Bie 2018-06-05 9:43 ` Maxime Coquelin 0 siblings, 1 reply; 17+ messages in thread From: Tiwei Bie @ 2018-06-05 3:10 UTC (permalink / raw) To: Maxime Coquelin; +Cc: zhihong.wang, dev On Mon, Jun 04, 2018 at 04:29:56PM +0200, Maxime Coquelin wrote: > On 06/04/2018 01:55 PM, Tiwei Bie wrote: > > On Fri, Jun 01, 2018 at 02:47:58PM +0200, Maxime Coquelin wrote: [...] > > > @@ -253,13 +246,15 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, > > > struct virtio_net_hdr *hdr; > > > int offload; > > > - offload = tx_offload_enabled(vq->hw); > > > head_idx = vq->vq_desc_head_idx; > > > idx = head_idx; > > > dxp = &vq->vq_descx[idx]; > > > dxp->cookie = (void *)cookie; > > > dxp->ndescs = needed; > > > + offload = vq->hw->has_tx_offload && > > > + (cookie->ol_flags & PKT_TX_OFFLOAD_MASK); > > > > If features aren't negotiated, I think there is no need to > > check ol_flags and update the net header. > > Isn't what the code is doing? > has_tx_offload will be false if none of the Tx offload features have > been negotiated, so ol_flags won't be checked in that case. Hmm.. Somehow I treated 'and' as 'or'.. I have another question. When 'can_push' is false and 'vq->hw->has_tx_offload' is true, there will be a chance that virtio net hdr won't be zeroed when ol_flags doesn't specify any Tx offloads. Best regards, Tiwei Bie ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance 2018-06-05 3:10 ` Tiwei Bie @ 2018-06-05 9:43 ` Maxime Coquelin 2018-06-05 11:20 ` Tiwei Bie 0 siblings, 1 reply; 17+ messages in thread From: Maxime Coquelin @ 2018-06-05 9:43 UTC (permalink / raw) To: Tiwei Bie; +Cc: zhihong.wang, dev On 06/05/2018 05:10 AM, Tiwei Bie wrote: > On Mon, Jun 04, 2018 at 04:29:56PM +0200, Maxime Coquelin wrote: >> On 06/04/2018 01:55 PM, Tiwei Bie wrote: >>> On Fri, Jun 01, 2018 at 02:47:58PM +0200, Maxime Coquelin wrote: > [...] >>>> @@ -253,13 +246,15 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, >>>> struct virtio_net_hdr *hdr; >>>> int offload; >>>> - offload = tx_offload_enabled(vq->hw); >>>> head_idx = vq->vq_desc_head_idx; >>>> idx = head_idx; >>>> dxp = &vq->vq_descx[idx]; >>>> dxp->cookie = (void *)cookie; >>>> dxp->ndescs = needed; >>>> + offload = vq->hw->has_tx_offload && >>>> + (cookie->ol_flags & PKT_TX_OFFLOAD_MASK); >>> >>> If features aren't negotiated, I think there is no need to >>> check ol_flags and update the net header. >> >> Isn't what the code is doing? >> has_tx_offload will be false if none of the Tx offload features have >> been negotiated, so ol_flags won't be checked in that case. > > Hmm.. Somehow I treated 'and' as 'or'.. > > I have another question. When 'can_push' is false > and 'vq->hw->has_tx_offload' is true, there will > be a chance that virtio net hdr won't be zeroed > when ol_flags doesn't specify any Tx offloads. Right, good catch. It may be better to remove this small optimization. Indeed, with the series, if the application does not enable offloads, then the Virtio features are re-negotiated with the offload features. Thanks, Maxime > Best regards, > Tiwei Bie > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance 2018-06-05 9:43 ` Maxime Coquelin @ 2018-06-05 11:20 ` Tiwei Bie 2018-06-05 11:58 ` Maxime Coquelin 0 siblings, 1 reply; 17+ messages in thread From: Tiwei Bie @ 2018-06-05 11:20 UTC (permalink / raw) To: Maxime Coquelin; +Cc: zhihong.wang, dev On Tue, Jun 05, 2018 at 11:43:11AM +0200, Maxime Coquelin wrote: > On 06/05/2018 05:10 AM, Tiwei Bie wrote: > > On Mon, Jun 04, 2018 at 04:29:56PM +0200, Maxime Coquelin wrote: > > > On 06/04/2018 01:55 PM, Tiwei Bie wrote: > > > > On Fri, Jun 01, 2018 at 02:47:58PM +0200, Maxime Coquelin wrote: > > [...] > > > > > @@ -253,13 +246,15 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, > > > > > struct virtio_net_hdr *hdr; > > > > > int offload; > > > > > - offload = tx_offload_enabled(vq->hw); > > > > > head_idx = vq->vq_desc_head_idx; > > > > > idx = head_idx; > > > > > dxp = &vq->vq_descx[idx]; > > > > > dxp->cookie = (void *)cookie; > > > > > dxp->ndescs = needed; > > > > > + offload = vq->hw->has_tx_offload && > > > > > + (cookie->ol_flags & PKT_TX_OFFLOAD_MASK); > > > > > > > > If features aren't negotiated, I think there is no need to > > > > check ol_flags and update the net header. > > > > > > Isn't what the code is doing? > > > has_tx_offload will be false if none of the Tx offload features have > > > been negotiated, so ol_flags won't be checked in that case. > > > > Hmm.. Somehow I treated 'and' as 'or'.. > > > > I have another question. When 'can_push' is false > > and 'vq->hw->has_tx_offload' is true, there will > > be a chance that virtio net hdr won't be zeroed > > when ol_flags doesn't specify any Tx offloads. > > Right, good catch. > It may be better to remove this small optimization. > Indeed, with the series, if the application does not enable offloads, > then the Virtio features are re-negotiated with the offload features. Yeah. It's a good idea to disable the features when the corresponding Tx offloads aren't requested by the applications! I like it! This issue happens for the mbufs whose ol_flags doesn't specify Tx offloads when applications enable Tx offloads and can_push is false. I think when applications enable Tx offloads, although most packets to be sent will have Tx offloads specified in their ol_flags, it's still possible that some packets don't have Tx offloads specified in their ol_flags. Best regards, Tiwei Bie > > Thanks, > Maxime > > > Best regards, > > Tiwei Bie > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance 2018-06-05 11:20 ` Tiwei Bie @ 2018-06-05 11:58 ` Maxime Coquelin 2018-06-05 12:21 ` Tiwei Bie 0 siblings, 1 reply; 17+ messages in thread From: Maxime Coquelin @ 2018-06-05 11:58 UTC (permalink / raw) To: Tiwei Bie; +Cc: zhihong.wang, dev On 06/05/2018 01:20 PM, Tiwei Bie wrote: > On Tue, Jun 05, 2018 at 11:43:11AM +0200, Maxime Coquelin wrote: >> On 06/05/2018 05:10 AM, Tiwei Bie wrote: >>> On Mon, Jun 04, 2018 at 04:29:56PM +0200, Maxime Coquelin wrote: >>>> On 06/04/2018 01:55 PM, Tiwei Bie wrote: >>>>> On Fri, Jun 01, 2018 at 02:47:58PM +0200, Maxime Coquelin wrote: >>> [...] >>>>>> @@ -253,13 +246,15 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, >>>>>> struct virtio_net_hdr *hdr; >>>>>> int offload; >>>>>> - offload = tx_offload_enabled(vq->hw); >>>>>> head_idx = vq->vq_desc_head_idx; >>>>>> idx = head_idx; >>>>>> dxp = &vq->vq_descx[idx]; >>>>>> dxp->cookie = (void *)cookie; >>>>>> dxp->ndescs = needed; >>>>>> + offload = vq->hw->has_tx_offload && >>>>>> + (cookie->ol_flags & PKT_TX_OFFLOAD_MASK); >>>>> >>>>> If features aren't negotiated, I think there is no need to >>>>> check ol_flags and update the net header. >>>> >>>> Isn't what the code is doing? >>>> has_tx_offload will be false if none of the Tx offload features have >>>> been negotiated, so ol_flags won't be checked in that case. >>> >>> Hmm.. Somehow I treated 'and' as 'or'.. >>> >>> I have another question. When 'can_push' is false >>> and 'vq->hw->has_tx_offload' is true, there will >>> be a chance that virtio net hdr won't be zeroed >>> when ol_flags doesn't specify any Tx offloads. >> >> Right, good catch. >> It may be better to remove this small optimization. >> Indeed, with the series, if the application does not enable offloads, >> then the Virtio features are re-negotiated with the offload features. > > Yeah. It's a good idea to disable the features when > the corresponding Tx offloads aren't requested by > the applications! I like it! > > This issue happens for the mbufs whose ol_flags > doesn't specify Tx offloads when applications > enable Tx offloads and can_push is false. I think > when applications enable Tx offloads, although > most packets to be sent will have Tx offloads > specified in their ol_flags, it's still possible > that some packets don't have Tx offloads specified > in their ol_flags. Reading again my reply, I think it wasn't clear enough, let me rephrase it. My proposal is to keep disabling the features if the corresponding Tx offloads aren't negotiated by the application, but just to remove the check on mbuf's ol_flags, so: offload = vq->hw->has_tx_offload; Doing that, we retrieve the old behaviour, i.e. if Virtio features are negotiated but no ol_flags set, virtio-net header will be cleared. Maxime > Best regards, > Tiwei Bie > >> >> Thanks, >> Maxime >> >>> Best regards, >>> Tiwei Bie >>> ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance 2018-06-05 11:58 ` Maxime Coquelin @ 2018-06-05 12:21 ` Tiwei Bie 0 siblings, 0 replies; 17+ messages in thread From: Tiwei Bie @ 2018-06-05 12:21 UTC (permalink / raw) To: Maxime Coquelin; +Cc: zhihong.wang, dev On Tue, Jun 05, 2018 at 01:58:00PM +0200, Maxime Coquelin wrote: > On 06/05/2018 01:20 PM, Tiwei Bie wrote: > > On Tue, Jun 05, 2018 at 11:43:11AM +0200, Maxime Coquelin wrote: > > > On 06/05/2018 05:10 AM, Tiwei Bie wrote: > > > > On Mon, Jun 04, 2018 at 04:29:56PM +0200, Maxime Coquelin wrote: > > > > > On 06/04/2018 01:55 PM, Tiwei Bie wrote: > > > > > > On Fri, Jun 01, 2018 at 02:47:58PM +0200, Maxime Coquelin wrote: > > > > [...] > > > > > > > @@ -253,13 +246,15 @@ virtqueue_enqueue_xmit(struct virtnet_tx *txvq, struct rte_mbuf *cookie, > > > > > > > struct virtio_net_hdr *hdr; > > > > > > > int offload; > > > > > > > - offload = tx_offload_enabled(vq->hw); > > > > > > > head_idx = vq->vq_desc_head_idx; > > > > > > > idx = head_idx; > > > > > > > dxp = &vq->vq_descx[idx]; > > > > > > > dxp->cookie = (void *)cookie; > > > > > > > dxp->ndescs = needed; > > > > > > > + offload = vq->hw->has_tx_offload && > > > > > > > + (cookie->ol_flags & PKT_TX_OFFLOAD_MASK); > > > > > > > > > > > > If features aren't negotiated, I think there is no need to > > > > > > check ol_flags and update the net header. > > > > > > > > > > Isn't what the code is doing? > > > > > has_tx_offload will be false if none of the Tx offload features have > > > > > been negotiated, so ol_flags won't be checked in that case. > > > > > > > > Hmm.. Somehow I treated 'and' as 'or'.. > > > > > > > > I have another question. When 'can_push' is false > > > > and 'vq->hw->has_tx_offload' is true, there will > > > > be a chance that virtio net hdr won't be zeroed > > > > when ol_flags doesn't specify any Tx offloads. > > > > > > Right, good catch. > > > It may be better to remove this small optimization. > > > Indeed, with the series, if the application does not enable offloads, > > > then the Virtio features are re-negotiated with the offload features. > > > > Yeah. It's a good idea to disable the features when > > the corresponding Tx offloads aren't requested by > > the applications! I like it! > > > > This issue happens for the mbufs whose ol_flags > > doesn't specify Tx offloads when applications > > enable Tx offloads and can_push is false. I think > > when applications enable Tx offloads, although > > most packets to be sent will have Tx offloads > > specified in their ol_flags, it's still possible > > that some packets don't have Tx offloads specified > > in their ol_flags. > > Reading again my reply, I think it wasn't clear enough, > let me rephrase it. > > My proposal is to keep disabling the features if the corresponding > Tx offloads aren't negotiated by the application, but just to remove the > check on mbuf's ol_flags, so: > offload = vq->hw->has_tx_offload; > > Doing that, we retrieve the old behaviour, i.e. if Virtio features are > negotiated but no ol_flags set, virtio-net header will be cleared. It sounds good! Thanks! Best regards, Tiwei Bie ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements 2018-06-01 12:47 [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin ` (3 preceding siblings ...) 2018-06-01 12:47 ` [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance Maxime Coquelin @ 2018-06-04 7:42 ` Maxime Coquelin 4 siblings, 0 replies; 17+ messages in thread From: Maxime Coquelin @ 2018-06-04 7:42 UTC (permalink / raw) To: zhihong.wang, tiwei.bie, dev On 06/01/2018 02:47 PM, Maxime Coquelin wrote: > Below are benchmarks results when offloads are enabled at "When *no* offload" should be read here... > device level. > > Rx-mrg=off benchmarks: > +------------+-------+-------------+-------------+----------+ > | Run | PVP | Guest->Host | Host->Guest | Loopback | > +------------+-------+-------------+-------------+----------+ > | v18.05 | 14.47 | 17.02 | 17.57 | 13.15 | > | + series | 14.88 | 19.64 | 17.63 | 13.11 | > +------------+-------+-------------+-------------+----------+ > > Rx-mrg=on benchmarks: > +------------+-------+-------------+-------------+----------+ > | Run | PVP | Guest->Host | Host->Guest | Loopback | > +------------+-------+-------------+-------------+----------+ > | v18.05 | 9.53 | 13.80 | 16.70 | 13.11 | > | + series | 12.62 | 19.69 | 16.70 | 13.11 | > +------------+-------+-------------+-------------+----------+ ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2018-06-05 13:39 UTC | newest] Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-06-01 12:47 [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin 2018-06-01 12:47 ` [dpdk-dev] [PATCH 1/4] net/virtio: use simple path for Tx even if Rx mergeable Maxime Coquelin 2018-06-01 12:47 ` [dpdk-dev] [PATCH 2/4] net/vhost: improve Tx path selection Maxime Coquelin 2018-06-04 12:25 ` Tiwei Bie 2018-06-01 12:47 ` [dpdk-dev] [PATCH 3/4] net/virtio: don't use simple Rx path if TCP LRO requested Maxime Coquelin 2018-06-04 11:59 ` Tiwei Bie 2018-06-04 14:32 ` Maxime Coquelin 2018-06-05 13:39 ` Maxime Coquelin 2018-06-01 12:47 ` [dpdk-dev] [PATCH 4/4] net/virtio: improve offload check performance Maxime Coquelin 2018-06-04 11:55 ` Tiwei Bie 2018-06-04 14:29 ` Maxime Coquelin 2018-06-05 3:10 ` Tiwei Bie 2018-06-05 9:43 ` Maxime Coquelin 2018-06-05 11:20 ` Tiwei Bie 2018-06-05 11:58 ` Maxime Coquelin 2018-06-05 12:21 ` Tiwei Bie 2018-06-04 7:42 ` [dpdk-dev] [PATCH 0/4] net/virtio: Tx path selection and offload improvements Maxime Coquelin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).