* [PATCH v2 1/6] Revert "app/testpmd: modify mac in csum forwarding"
2022-06-08 12:49 [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
@ 2022-06-08 12:49 ` Maxime Coquelin
2022-06-13 12:24 ` Singh, Aman Deep
2022-06-08 12:49 ` [PATCH v2 2/6] vhost: fix missing enqueue pseudo-header calculation Maxime Coquelin
` (5 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Maxime Coquelin @ 2022-06-08 12:49 UTC (permalink / raw)
To: dev, jasowang, chenbo.xia, david.marchand, olivier.matz,
wenwux.ma, yuying.zhang, aman.deep.singh
Cc: Maxime Coquelin, stable
This patch reverts commit 10f4620f02e1 ("app/testpmd: modify mac in csum forwarding"),
as the checksum forwarding is expected to only perform
checksum and not also overwrites the source and destination
MAC addresses.
Doing so, we can test checksum offloading with real traffic
without breaking broadcast packets.
Fixes: 10f4620f02e1 ("app/testpmd: modify mac in csum forwarding")
Cc: stable@dpdk.org
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Chenbo Xia <chenbo.xia@intel.com>
---
app/test-pmd/csumonly.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
index 7df201e047..1a3fd9ce8a 100644
--- a/app/test-pmd/csumonly.c
+++ b/app/test-pmd/csumonly.c
@@ -916,10 +916,6 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
* and inner headers */
eth_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
- rte_ether_addr_copy(&peer_eth_addrs[fs->peer_addr],
- ð_hdr->dst_addr);
- rte_ether_addr_copy(&ports[fs->tx_port].eth_addr,
- ð_hdr->src_addr);
parse_ethernet(eth_hdr, &info);
l3_hdr = (char *)eth_hdr + info.l2_len;
--
2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/6] Revert "app/testpmd: modify mac in csum forwarding"
2022-06-08 12:49 ` [PATCH v2 1/6] Revert "app/testpmd: modify mac in csum forwarding" Maxime Coquelin
@ 2022-06-13 12:24 ` Singh, Aman Deep
2022-06-17 12:42 ` Maxime Coquelin
0 siblings, 1 reply; 17+ messages in thread
From: Singh, Aman Deep @ 2022-06-13 12:24 UTC (permalink / raw)
To: Maxime Coquelin, dev, jasowang, chenbo.xia, david.marchand,
olivier.matz, wenwux.ma, yuying.zhang
Cc: stable
Hi Maxime,
On 6/8/2022 6:19 PM, Maxime Coquelin wrote:
> This patch reverts commit 10f4620f02e1 ("app/testpmd: modify mac in csum forwarding"),
> as the checksum forwarding is expected to only perform
> checksum and not also overwrites the source and destination
> MAC addresses.
>
> Doing so, we can test checksum offloading with real traffic
> without breaking broadcast packets.
>
> Fixes: 10f4620f02e1 ("app/testpmd: modify mac in csum forwarding")
> Cc: stable@dpdk.org
>
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> Acked-by: Chenbo Xia <chenbo.xia@intel.com>
Acked-by: Aman Singh<aman.deep.singh@intel.com>
> ---
> app/test-pmd/csumonly.c | 4 ----
> 1 file changed, 4 deletions(-)
>
> diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
> index 7df201e047..1a3fd9ce8a 100644
> --- a/app/test-pmd/csumonly.c
> +++ b/app/test-pmd/csumonly.c
> @@ -916,10 +916,6 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
> * and inner headers */
>
> eth_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
> - rte_ether_addr_copy(&peer_eth_addrs[fs->peer_addr],
> - ð_hdr->dst_addr);
> - rte_ether_addr_copy(&ports[fs->tx_port].eth_addr,
> - ð_hdr->src_addr);
> parse_ethernet(eth_hdr, &info);
> l3_hdr = (char *)eth_hdr + info.l2_len;
>
LGTM, In principle csum mode should not modify the mac addresses.
This code has been there from start, so might break some TC's.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/6] Revert "app/testpmd: modify mac in csum forwarding"
2022-06-13 12:24 ` Singh, Aman Deep
@ 2022-06-17 12:42 ` Maxime Coquelin
0 siblings, 0 replies; 17+ messages in thread
From: Maxime Coquelin @ 2022-06-17 12:42 UTC (permalink / raw)
To: Singh, Aman Deep, dev, jasowang, chenbo.xia, david.marchand,
olivier.matz, wenwux.ma, yuying.zhang
Cc: stable
On 6/13/22 14:24, Singh, Aman Deep wrote:
> Hi Maxime,
>
> On 6/8/2022 6:19 PM, Maxime Coquelin wrote:
>> This patch reverts commit 10f4620f02e1 ("app/testpmd: modify mac in
>> csum forwarding"),
>> as the checksum forwarding is expected to only perform
>> checksum and not also overwrites the source and destination
>> MAC addresses.
>>
>> Doing so, we can test checksum offloading with real traffic
>> without breaking broadcast packets.
>>
>> Fixes: 10f4620f02e1 ("app/testpmd: modify mac in csum forwarding")
>> Cc: stable@dpdk.org
>>
>> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
>> Acked-by: Chenbo Xia <chenbo.xia@intel.com>
>
> Acked-by: Aman Singh<aman.deep.singh@intel.com>
>
>> ---
>> app/test-pmd/csumonly.c | 4 ----
>> 1 file changed, 4 deletions(-)
>>
>> diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c
>> index 7df201e047..1a3fd9ce8a 100644
>> --- a/app/test-pmd/csumonly.c
>> +++ b/app/test-pmd/csumonly.c
>> @@ -916,10 +916,6 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
>> * and inner headers */
>> eth_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *);
>> - rte_ether_addr_copy(&peer_eth_addrs[fs->peer_addr],
>> - ð_hdr->dst_addr);
>> - rte_ether_addr_copy(&ports[fs->tx_port].eth_addr,
>> - ð_hdr->src_addr);
>> parse_ethernet(eth_hdr, &info);
>> l3_hdr = (char *)eth_hdr + info.l2_len;
>
> LGTM, In principle csum mode should not modify the mac addresses.
> This code has been there from start, so might break some TC's.
>
>
Agree, some tests will need to be adapted.
David showed me some tests in DTS were removing the MAC rewriting.
Thanks,
Maxime
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 2/6] vhost: fix missing enqueue pseudo-header calculation
2022-06-08 12:49 [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
2022-06-08 12:49 ` [PATCH v2 1/6] Revert "app/testpmd: modify mac in csum forwarding" Maxime Coquelin
@ 2022-06-08 12:49 ` Maxime Coquelin
2022-06-08 12:49 ` [PATCH v2 3/6] net/vhost: enable compliant offloading mode Maxime Coquelin
` (4 subsequent siblings)
6 siblings, 0 replies; 17+ messages in thread
From: Maxime Coquelin @ 2022-06-08 12:49 UTC (permalink / raw)
To: dev, jasowang, chenbo.xia, david.marchand, olivier.matz,
wenwux.ma, yuying.zhang, aman.deep.singh
Cc: Maxime Coquelin, stable
The Virtio specification requires that in case of checksum
offloading, the pseudo-header checksum must be set in the
L4 header.
When received from another Vhost-user port, the packet
checksum might already contain the pseudo-header checksum
but we have no way to know it. So we have no other choice
than doing the pseudo-header checksum systematically.
This patch handles this using the rte_net_intel_cksum_prepare()
helper.
Fixes: 859b480d5afd ("vhost: add guest offload setting")
Cc: stable@dpdk.org
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
---
lib/vhost/virtio_net.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c
index 68a26eb17d..ce22e3ac79 100644
--- a/lib/vhost/virtio_net.c
+++ b/lib/vhost/virtio_net.c
@@ -596,6 +596,16 @@ virtio_enqueue_offload(struct rte_mbuf *m_buf, struct virtio_net_hdr *net_hdr)
csum_l4 |= RTE_MBUF_F_TX_TCP_CKSUM;
if (csum_l4) {
+ /*
+ * Pseudo-header checksum must be set as per Virtio spec.
+ *
+ * Note: We don't propagate rte_net_intel_cksum_prepare()
+ * errors, as it would have an impact on performance, and an
+ * error would mean the packet is dropped by the guest instead
+ * of being dropped here.
+ */
+ rte_net_intel_cksum_prepare(m_buf);
+
net_hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
net_hdr->csum_start = m_buf->l2_len + m_buf->l3_len;
--
2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 3/6] net/vhost: enable compliant offloading mode
2022-06-08 12:49 [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
2022-06-08 12:49 ` [PATCH v2 1/6] Revert "app/testpmd: modify mac in csum forwarding" Maxime Coquelin
2022-06-08 12:49 ` [PATCH v2 2/6] vhost: fix missing enqueue pseudo-header calculation Maxime Coquelin
@ 2022-06-08 12:49 ` Maxime Coquelin
2022-06-08 12:49 ` [PATCH v2 4/6] net/vhost: make VLAN stripping flag a boolean Maxime Coquelin
` (3 subsequent siblings)
6 siblings, 0 replies; 17+ messages in thread
From: Maxime Coquelin @ 2022-06-08 12:49 UTC (permalink / raw)
To: dev, jasowang, chenbo.xia, david.marchand, olivier.matz,
wenwux.ma, yuying.zhang, aman.deep.singh
Cc: Maxime Coquelin
This patch enables the compliant offloading flags mode by
default, which prevents the Rx path to set Tx offload flags,
which is illegal. A new legacy-ol-flags devarg is introduced
to enable the legacy behaviour.
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
---
doc/guides/nics/vhost.rst | 6 ++++++
drivers/net/vhost/rte_eth_vhost.c | 20 +++++++++++++++++---
2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/doc/guides/nics/vhost.rst b/doc/guides/nics/vhost.rst
index ee802ec4a8..d7c0e2ade8 100644
--- a/doc/guides/nics/vhost.rst
+++ b/doc/guides/nics/vhost.rst
@@ -64,6 +64,12 @@ The user can specify below arguments in `--vdev` option.
It is used to enable external buffer support in vhost library.
(Default: 0 (disabled))
+#. ``legacy-ol-flags``:
+
+ It is used to restore legacy behavior for offloading that was not
+ compliant with offloading API.
+ (Default: 0 (disabled))
+
Vhost PMD event handling
------------------------
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 8dee629fb0..1620e30df8 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -31,9 +31,10 @@ enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM};
#define ETH_VHOST_CLIENT_ARG "client"
#define ETH_VHOST_IOMMU_SUPPORT "iommu-support"
#define ETH_VHOST_POSTCOPY_SUPPORT "postcopy-support"
-#define ETH_VHOST_VIRTIO_NET_F_HOST_TSO "tso"
-#define ETH_VHOST_LINEAR_BUF "linear-buffer"
-#define ETH_VHOST_EXT_BUF "ext-buffer"
+#define ETH_VHOST_VIRTIO_NET_F_HOST_TSO "tso"
+#define ETH_VHOST_LINEAR_BUF "linear-buffer"
+#define ETH_VHOST_EXT_BUF "ext-buffer"
+#define ETH_VHOST_LEGACY_OL_FLAGS "legacy-ol-flags"
#define VHOST_MAX_PKT_BURST 32
static const char *valid_arguments[] = {
@@ -45,6 +46,7 @@ static const char *valid_arguments[] = {
ETH_VHOST_VIRTIO_NET_F_HOST_TSO,
ETH_VHOST_LINEAR_BUF,
ETH_VHOST_EXT_BUF,
+ ETH_VHOST_LEGACY_OL_FLAGS,
NULL
};
@@ -1470,6 +1472,7 @@ rte_pmd_vhost_probe(struct rte_vdev_device *dev)
int tso = 0;
int linear_buf = 0;
int ext_buf = 0;
+ int legacy_ol_flags = 0;
struct rte_eth_dev *eth_dev;
const char *name = rte_vdev_device_name(dev);
@@ -1579,6 +1582,17 @@ rte_pmd_vhost_probe(struct rte_vdev_device *dev)
flags |= RTE_VHOST_USER_EXTBUF_SUPPORT;
}
+ if (rte_kvargs_count(kvlist, ETH_VHOST_LEGACY_OL_FLAGS) == 1) {
+ ret = rte_kvargs_process(kvlist,
+ ETH_VHOST_LEGACY_OL_FLAGS,
+ &open_int, &legacy_ol_flags);
+ if (ret < 0)
+ goto out_free;
+ }
+
+ if (legacy_ol_flags == 0)
+ flags |= RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS;
+
if (dev->device.numa_node == SOCKET_ID_ANY)
dev->device.numa_node = rte_socket_id();
--
2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 4/6] net/vhost: make VLAN stripping flag a boolean
2022-06-08 12:49 [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
` (2 preceding siblings ...)
2022-06-08 12:49 ` [PATCH v2 3/6] net/vhost: enable compliant offloading mode Maxime Coquelin
@ 2022-06-08 12:49 ` Maxime Coquelin
2022-06-08 12:49 ` [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path Maxime Coquelin
` (2 subsequent siblings)
6 siblings, 0 replies; 17+ messages in thread
From: Maxime Coquelin @ 2022-06-08 12:49 UTC (permalink / raw)
To: dev, jasowang, chenbo.xia, david.marchand, olivier.matz,
wenwux.ma, yuying.zhang, aman.deep.singh
Cc: Maxime Coquelin
This trivial patch makes the vlan_strip field of the
pmd_internal struct a boolean, since it is handled as
such.
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
---
drivers/net/vhost/rte_eth_vhost.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 1620e30df8..e931d59053 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -88,7 +88,7 @@ struct pmd_internal {
uint16_t max_queues;
int vid;
rte_atomic32_t started;
- uint8_t vlan_strip;
+ bool vlan_strip;
};
struct internal_list {
--
2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path
2022-06-08 12:49 [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
` (3 preceding siblings ...)
2022-06-08 12:49 ` [PATCH v2 4/6] net/vhost: make VLAN stripping flag a boolean Maxime Coquelin
@ 2022-06-08 12:49 ` Maxime Coquelin
2022-06-09 1:59 ` Xia, Chenbo
2022-06-10 3:49 ` Xia, Chenbo
2022-06-08 12:49 ` [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path Maxime Coquelin
2022-06-17 14:06 ` [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
6 siblings, 2 replies; 17+ messages in thread
From: Maxime Coquelin @ 2022-06-08 12:49 UTC (permalink / raw)
To: dev, jasowang, chenbo.xia, david.marchand, olivier.matz,
wenwux.ma, yuying.zhang, aman.deep.singh
Cc: Maxime Coquelin
Virtio specification supports host checksum offloading
for L4, which is enabled with VIRTIO_NET_F_CSUM feature
negotiation. However, the Vhost PMD does not advertise
Rx checksum offload capabilities, so we can end-up with
the VIRTIO_NET_F_CSUM feature being negotiated, implying
the Vhost library returns packets with checksum being
offloaded while the application did not request for it.
Advertising these offload capabilities at the ethdev level
is not enough, because we could still end-up with the
application not enabling these offloads while the guest
still negotiate them.
This patch advertises the Rx checksum offload capabilities,
and introduces a compatibility layer to cover the case
VIRTIO_NET_F_CSUM has been negotiated but the application
does not configure the Rx checksum offloads. This function
performis the L4 Rx checksum in SW for UDP and TCP. Note
that it is not needed to calculate the pseudo-header
checksum, because the Virtio specification requires that
the driver do it.
This patch does not advertise SCTP checksum offloading
capability for now, but it could be handled later if the
need arises.
Reported-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
doc/guides/nics/features/vhost.ini | 1 +
drivers/net/vhost/rte_eth_vhost.c | 83 ++++++++++++++++++++++++++++++
2 files changed, 84 insertions(+)
diff --git a/doc/guides/nics/features/vhost.ini b/doc/guides/nics/features/vhost.ini
index ef81abb439..15f4dfe5e8 100644
--- a/doc/guides/nics/features/vhost.ini
+++ b/doc/guides/nics/features/vhost.ini
@@ -7,6 +7,7 @@
Link status = Y
Free Tx mbuf on demand = Y
Queue status event = Y
+L4 checksum offload = P
Basic stats = Y
Extended stats = Y
x86-32 = Y
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index e931d59053..42f0d52ebc 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -12,6 +12,7 @@
#include <ethdev_vdev.h>
#include <rte_malloc.h>
#include <rte_memcpy.h>
+#include <rte_net.h>
#include <rte_bus_vdev.h>
#include <rte_kvargs.h>
#include <rte_vhost.h>
@@ -85,10 +86,12 @@ struct pmd_internal {
char *iface_name;
uint64_t flags;
uint64_t disable_flags;
+ uint64_t features;
uint16_t max_queues;
int vid;
rte_atomic32_t started;
bool vlan_strip;
+ bool rx_sw_csum;
};
struct internal_list {
@@ -275,6 +278,70 @@ vhost_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
return nstats;
}
+static void
+vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
+{
+ struct pmd_internal *internal = eth_dev->data->dev_private;
+ const struct rte_eth_rxmode *rxmode = ð_dev->data->dev_conf.rxmode;
+
+ internal->rx_sw_csum = false;
+
+ /* SW checksum is not compatible with legacy mode */
+ if (!(internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS))
+ return;
+
+ if (internal->features & (1ULL << VIRTIO_NET_F_CSUM)) {
+ if (!(rxmode->offloads &
+ (RTE_ETH_RX_OFFLOAD_UDP_CKSUM | RTE_ETH_RX_OFFLOAD_TCP_CKSUM))) {
+ VHOST_LOG(NOTICE, "Rx csum will be done in SW, may impact performance.");
+ internal->rx_sw_csum = true;
+ }
+ }
+}
+
+static void
+vhost_dev_rx_sw_csum(struct rte_mbuf *mbuf)
+{
+ struct rte_net_hdr_lens hdr_lens;
+ uint32_t ptype, hdr_len;
+ uint16_t csum = 0, csum_offset;
+
+ /* Return early if the L4 checksum was not offloaded */
+ if ((mbuf->ol_flags & RTE_MBUF_F_RX_L4_CKSUM_MASK) != RTE_MBUF_F_RX_L4_CKSUM_NONE)
+ return;
+
+ ptype = rte_net_get_ptype(mbuf, &hdr_lens, RTE_PTYPE_ALL_MASK);
+
+ hdr_len = hdr_lens.l2_len + hdr_lens.l3_len;
+
+ switch (ptype & RTE_PTYPE_L4_MASK) {
+ case RTE_PTYPE_L4_TCP:
+ csum_offset = offsetof(struct rte_tcp_hdr, cksum) + hdr_len;
+ break;
+ case RTE_PTYPE_L4_UDP:
+ csum_offset = offsetof(struct rte_udp_hdr, dgram_cksum) + hdr_len;
+ break;
+ default:
+ /* Unsupported packet type */
+ return;
+ }
+
+ /* The pseudo-header checksum is already performed, as per Virtio spec */
+ if (rte_raw_cksum_mbuf(mbuf, hdr_len, rte_pktmbuf_pkt_len(mbuf) - hdr_len, &csum) < 0)
+ return;
+
+ csum = ~csum;
+ /* See RFC768 */
+ if (unlikely((ptype & RTE_PTYPE_L4_UDP) && csum == 0))
+ csum = 0xffff;
+
+ if (rte_pktmbuf_data_len(mbuf) >= csum_offset + 1)
+ *rte_pktmbuf_mtod_offset(mbuf, uint16_t *, csum_offset) = csum;
+
+ mbuf->ol_flags &= ~RTE_MBUF_F_RX_L4_CKSUM_MASK;
+ mbuf->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_GOOD;
+}
+
static uint16_t
eth_vhost_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
{
@@ -315,6 +382,9 @@ eth_vhost_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
if (r->internal->vlan_strip)
rte_vlan_strip(bufs[i]);
+ if (r->internal->rx_sw_csum)
+ vhost_dev_rx_sw_csum(bufs[i]);
+
r->stats.bytes += bufs[i]->pkt_len;
}
@@ -711,6 +781,11 @@ new_device(int vid)
eth_dev->data->numa_node = newnode;
#endif
+ if (rte_vhost_get_negotiated_features(vid, &internal->features)) {
+ VHOST_LOG(ERR, "Failed to get device features\n");
+ return -1;
+ }
+
internal->vid = vid;
if (rte_atomic32_read(&internal->started) == 1) {
queue_setup(eth_dev, internal);
@@ -733,6 +808,8 @@ new_device(int vid)
eth_dev->data->dev_link.link_status = RTE_ETH_LINK_UP;
+ vhost_dev_csum_configure(eth_dev);
+
rte_atomic32_set(&internal->dev_attached, 1);
update_queuing_status(eth_dev);
@@ -1039,6 +1116,8 @@ eth_dev_configure(struct rte_eth_dev *dev)
internal->vlan_strip = !!(rxmode->offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP);
+ vhost_dev_csum_configure(dev);
+
return 0;
}
@@ -1189,6 +1268,10 @@ eth_dev_info(struct rte_eth_dev *dev,
dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
+ if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
+ dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
+ RTE_ETH_RX_OFFLOAD_TCP_CKSUM;
+ }
return 0;
}
--
2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path
2022-06-08 12:49 ` [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path Maxime Coquelin
@ 2022-06-09 1:59 ` Xia, Chenbo
2022-06-10 3:49 ` Xia, Chenbo
1 sibling, 0 replies; 17+ messages in thread
From: Xia, Chenbo @ 2022-06-09 1:59 UTC (permalink / raw)
To: Maxime Coquelin, dev, jasowang, david.marchand, Matz, Olivier,
Ma, WenwuX, Zhang, Yuying, Singh, Aman Deep
Hi Maxime,
> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Wednesday, June 8, 2022 8:50 PM
> To: dev@dpdk.org; jasowang@redhat.com; Xia, Chenbo <chenbo.xia@intel.com>;
> david.marchand@redhat.com; Matz, Olivier <olivier.matz@6wind.com>; Ma,
> WenwuX <wenwux.ma@intel.com>; Zhang, Yuying <yuying.zhang@intel.com>;
> Singh, Aman Deep <aman.deep.singh@intel.com>
> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
> Subject: [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path
>
> Virtio specification supports host checksum offloading
> for L4, which is enabled with VIRTIO_NET_F_CSUM feature
> negotiation. However, the Vhost PMD does not advertise
> Rx checksum offload capabilities, so we can end-up with
> the VIRTIO_NET_F_CSUM feature being negotiated, implying
> the Vhost library returns packets with checksum being
> offloaded while the application did not request for it.
>
> Advertising these offload capabilities at the ethdev level
> is not enough, because we could still end-up with the
> application not enabling these offloads while the guest
> still negotiate them.
>
> This patch advertises the Rx checksum offload capabilities,
> and introduces a compatibility layer to cover the case
> VIRTIO_NET_F_CSUM has been negotiated but the application
> does not configure the Rx checksum offloads. This function
> performis the L4 Rx checksum in SW for UDP and TCP. Note
performs
> that it is not needed to calculate the pseudo-header
> checksum, because the Virtio specification requires that
> the driver do it.
>
> This patch does not advertise SCTP checksum offloading
> capability for now, but it could be handled later if the
> need arises.
>
> Reported-by: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> ---
> doc/guides/nics/features/vhost.ini | 1 +
> drivers/net/vhost/rte_eth_vhost.c | 83 ++++++++++++++++++++++++++++++
> 2 files changed, 84 insertions(+)
>
> diff --git a/doc/guides/nics/features/vhost.ini
> b/doc/guides/nics/features/vhost.ini
> index ef81abb439..15f4dfe5e8 100644
> --- a/doc/guides/nics/features/vhost.ini
> +++ b/doc/guides/nics/features/vhost.ini
> @@ -7,6 +7,7 @@
> Link status = Y
> Free Tx mbuf on demand = Y
> Queue status event = Y
> +L4 checksum offload = P
> Basic stats = Y
> Extended stats = Y
> x86-32 = Y
> diff --git a/drivers/net/vhost/rte_eth_vhost.c
> b/drivers/net/vhost/rte_eth_vhost.c
> index e931d59053..42f0d52ebc 100644
> --- a/drivers/net/vhost/rte_eth_vhost.c
> +++ b/drivers/net/vhost/rte_eth_vhost.c
> @@ -12,6 +12,7 @@
> #include <ethdev_vdev.h>
> #include <rte_malloc.h>
> #include <rte_memcpy.h>
> +#include <rte_net.h>
> #include <rte_bus_vdev.h>
> #include <rte_kvargs.h>
> #include <rte_vhost.h>
> @@ -85,10 +86,12 @@ struct pmd_internal {
> char *iface_name;
> uint64_t flags;
> uint64_t disable_flags;
> + uint64_t features;
> uint16_t max_queues;
> int vid;
> rte_atomic32_t started;
> bool vlan_strip;
> + bool rx_sw_csum;
> };
>
> struct internal_list {
> @@ -275,6 +278,70 @@ vhost_dev_xstats_get(struct rte_eth_dev *dev, struct
> rte_eth_xstat *xstats,
> return nstats;
> }
>
> +static void
> +vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
> +{
> + struct pmd_internal *internal = eth_dev->data->dev_private;
> + const struct rte_eth_rxmode *rxmode = ð_dev->data-
> >dev_conf.rxmode;
> +
> + internal->rx_sw_csum = false;
> +
> + /* SW checksum is not compatible with legacy mode */
> + if (!(internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS))
> + return;
> +
> + if (internal->features & (1ULL << VIRTIO_NET_F_CSUM)) {
> + if (!(rxmode->offloads &
> + (RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
> RTE_ETH_RX_OFFLOAD_TCP_CKSUM))) {
> + VHOST_LOG(NOTICE, "Rx csum will be done in SW, may
> impact performance.");
Missing \n
With above fixed:
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
> + internal->rx_sw_csum = true;
> + }
> + }
> +}
> +
> +static void
> +vhost_dev_rx_sw_csum(struct rte_mbuf *mbuf)
> +{
> + struct rte_net_hdr_lens hdr_lens;
> + uint32_t ptype, hdr_len;
> + uint16_t csum = 0, csum_offset;
> +
> + /* Return early if the L4 checksum was not offloaded */
> + if ((mbuf->ol_flags & RTE_MBUF_F_RX_L4_CKSUM_MASK) !=
> RTE_MBUF_F_RX_L4_CKSUM_NONE)
> + return;
> +
> + ptype = rte_net_get_ptype(mbuf, &hdr_lens, RTE_PTYPE_ALL_MASK);
> +
> + hdr_len = hdr_lens.l2_len + hdr_lens.l3_len;
> +
> + switch (ptype & RTE_PTYPE_L4_MASK) {
> + case RTE_PTYPE_L4_TCP:
> + csum_offset = offsetof(struct rte_tcp_hdr, cksum) + hdr_len;
> + break;
> + case RTE_PTYPE_L4_UDP:
> + csum_offset = offsetof(struct rte_udp_hdr, dgram_cksum) +
> hdr_len;
> + break;
> + default:
> + /* Unsupported packet type */
> + return;
> + }
> +
> + /* The pseudo-header checksum is already performed, as per Virtio
> spec */
> + if (rte_raw_cksum_mbuf(mbuf, hdr_len, rte_pktmbuf_pkt_len(mbuf) -
> hdr_len, &csum) < 0)
> + return;
> +
> + csum = ~csum;
> + /* See RFC768 */
> + if (unlikely((ptype & RTE_PTYPE_L4_UDP) && csum == 0))
> + csum = 0xffff;
> +
> + if (rte_pktmbuf_data_len(mbuf) >= csum_offset + 1)
> + *rte_pktmbuf_mtod_offset(mbuf, uint16_t *, csum_offset) = csum;
> +
> + mbuf->ol_flags &= ~RTE_MBUF_F_RX_L4_CKSUM_MASK;
> + mbuf->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_GOOD;
> +}
> +
> static uint16_t
> eth_vhost_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
> {
> @@ -315,6 +382,9 @@ eth_vhost_rx(void *q, struct rte_mbuf **bufs, uint16_t
> nb_bufs)
> if (r->internal->vlan_strip)
> rte_vlan_strip(bufs[i]);
>
> + if (r->internal->rx_sw_csum)
> + vhost_dev_rx_sw_csum(bufs[i]);
> +
> r->stats.bytes += bufs[i]->pkt_len;
> }
>
> @@ -711,6 +781,11 @@ new_device(int vid)
> eth_dev->data->numa_node = newnode;
> #endif
>
> + if (rte_vhost_get_negotiated_features(vid, &internal->features)) {
> + VHOST_LOG(ERR, "Failed to get device features\n");
> + return -1;
> + }
> +
> internal->vid = vid;
> if (rte_atomic32_read(&internal->started) == 1) {
> queue_setup(eth_dev, internal);
> @@ -733,6 +808,8 @@ new_device(int vid)
>
> eth_dev->data->dev_link.link_status = RTE_ETH_LINK_UP;
>
> + vhost_dev_csum_configure(eth_dev);
> +
> rte_atomic32_set(&internal->dev_attached, 1);
> update_queuing_status(eth_dev);
>
> @@ -1039,6 +1116,8 @@ eth_dev_configure(struct rte_eth_dev *dev)
>
> internal->vlan_strip = !!(rxmode->offloads &
> RTE_ETH_RX_OFFLOAD_VLAN_STRIP);
>
> + vhost_dev_csum_configure(dev);
> +
> return 0;
> }
>
> @@ -1189,6 +1268,10 @@ eth_dev_info(struct rte_eth_dev *dev,
> dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
> RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
> dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
> + if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
> + dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
> + RTE_ETH_RX_OFFLOAD_TCP_CKSUM;
> + }
>
> return 0;
> }
> --
> 2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path
2022-06-08 12:49 ` [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path Maxime Coquelin
2022-06-09 1:59 ` Xia, Chenbo
@ 2022-06-10 3:49 ` Xia, Chenbo
2022-06-10 7:19 ` Jiang, Cheng1
1 sibling, 1 reply; 17+ messages in thread
From: Xia, Chenbo @ 2022-06-10 3:49 UTC (permalink / raw)
To: Maxime Coquelin, dev, jasowang, david.marchand, Matz, Olivier,
Ma, WenwuX, Zhang, Yuying, Singh, Aman Deep, Jiang, Cheng1
+ Cheng for review
> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Wednesday, June 8, 2022 8:50 PM
> To: dev@dpdk.org; jasowang@redhat.com; Xia, Chenbo <chenbo.xia@intel.com>;
> david.marchand@redhat.com; Matz, Olivier <olivier.matz@6wind.com>; Ma,
> WenwuX <wenwux.ma@intel.com>; Zhang, Yuying <yuying.zhang@intel.com>;
> Singh, Aman Deep <aman.deep.singh@intel.com>
> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
> Subject: [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path
>
> Virtio specification supports host checksum offloading
> for L4, which is enabled with VIRTIO_NET_F_CSUM feature
> negotiation. However, the Vhost PMD does not advertise
> Rx checksum offload capabilities, so we can end-up with
> the VIRTIO_NET_F_CSUM feature being negotiated, implying
> the Vhost library returns packets with checksum being
> offloaded while the application did not request for it.
>
> Advertising these offload capabilities at the ethdev level
> is not enough, because we could still end-up with the
> application not enabling these offloads while the guest
> still negotiate them.
>
> This patch advertises the Rx checksum offload capabilities,
> and introduces a compatibility layer to cover the case
> VIRTIO_NET_F_CSUM has been negotiated but the application
> does not configure the Rx checksum offloads. This function
> performis the L4 Rx checksum in SW for UDP and TCP. Note
> that it is not needed to calculate the pseudo-header
> checksum, because the Virtio specification requires that
> the driver do it.
>
> This patch does not advertise SCTP checksum offloading
> capability for now, but it could be handled later if the
> need arises.
>
> Reported-by: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> ---
> doc/guides/nics/features/vhost.ini | 1 +
> drivers/net/vhost/rte_eth_vhost.c | 83 ++++++++++++++++++++++++++++++
> 2 files changed, 84 insertions(+)
>
> diff --git a/doc/guides/nics/features/vhost.ini
> b/doc/guides/nics/features/vhost.ini
> index ef81abb439..15f4dfe5e8 100644
> --- a/doc/guides/nics/features/vhost.ini
> +++ b/doc/guides/nics/features/vhost.ini
> @@ -7,6 +7,7 @@
> Link status = Y
> Free Tx mbuf on demand = Y
> Queue status event = Y
> +L4 checksum offload = P
> Basic stats = Y
> Extended stats = Y
> x86-32 = Y
> diff --git a/drivers/net/vhost/rte_eth_vhost.c
> b/drivers/net/vhost/rte_eth_vhost.c
> index e931d59053..42f0d52ebc 100644
> --- a/drivers/net/vhost/rte_eth_vhost.c
> +++ b/drivers/net/vhost/rte_eth_vhost.c
> @@ -12,6 +12,7 @@
> #include <ethdev_vdev.h>
> #include <rte_malloc.h>
> #include <rte_memcpy.h>
> +#include <rte_net.h>
> #include <rte_bus_vdev.h>
> #include <rte_kvargs.h>
> #include <rte_vhost.h>
> @@ -85,10 +86,12 @@ struct pmd_internal {
> char *iface_name;
> uint64_t flags;
> uint64_t disable_flags;
> + uint64_t features;
> uint16_t max_queues;
> int vid;
> rte_atomic32_t started;
> bool vlan_strip;
> + bool rx_sw_csum;
> };
>
> struct internal_list {
> @@ -275,6 +278,70 @@ vhost_dev_xstats_get(struct rte_eth_dev *dev, struct
> rte_eth_xstat *xstats,
> return nstats;
> }
>
> +static void
> +vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
> +{
> + struct pmd_internal *internal = eth_dev->data->dev_private;
> + const struct rte_eth_rxmode *rxmode = ð_dev->data-
> >dev_conf.rxmode;
> +
> + internal->rx_sw_csum = false;
> +
> + /* SW checksum is not compatible with legacy mode */
> + if (!(internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS))
> + return;
> +
> + if (internal->features & (1ULL << VIRTIO_NET_F_CSUM)) {
> + if (!(rxmode->offloads &
> + (RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
> RTE_ETH_RX_OFFLOAD_TCP_CKSUM))) {
> + VHOST_LOG(NOTICE, "Rx csum will be done in SW, may
> impact performance.");
> + internal->rx_sw_csum = true;
> + }
> + }
> +}
> +
> +static void
> +vhost_dev_rx_sw_csum(struct rte_mbuf *mbuf)
> +{
> + struct rte_net_hdr_lens hdr_lens;
> + uint32_t ptype, hdr_len;
> + uint16_t csum = 0, csum_offset;
> +
> + /* Return early if the L4 checksum was not offloaded */
> + if ((mbuf->ol_flags & RTE_MBUF_F_RX_L4_CKSUM_MASK) !=
> RTE_MBUF_F_RX_L4_CKSUM_NONE)
> + return;
> +
> + ptype = rte_net_get_ptype(mbuf, &hdr_lens, RTE_PTYPE_ALL_MASK);
> +
> + hdr_len = hdr_lens.l2_len + hdr_lens.l3_len;
> +
> + switch (ptype & RTE_PTYPE_L4_MASK) {
> + case RTE_PTYPE_L4_TCP:
> + csum_offset = offsetof(struct rte_tcp_hdr, cksum) + hdr_len;
> + break;
> + case RTE_PTYPE_L4_UDP:
> + csum_offset = offsetof(struct rte_udp_hdr, dgram_cksum) +
> hdr_len;
> + break;
> + default:
> + /* Unsupported packet type */
> + return;
> + }
> +
> + /* The pseudo-header checksum is already performed, as per Virtio
> spec */
> + if (rte_raw_cksum_mbuf(mbuf, hdr_len, rte_pktmbuf_pkt_len(mbuf) -
> hdr_len, &csum) < 0)
> + return;
> +
> + csum = ~csum;
> + /* See RFC768 */
> + if (unlikely((ptype & RTE_PTYPE_L4_UDP) && csum == 0))
> + csum = 0xffff;
> +
> + if (rte_pktmbuf_data_len(mbuf) >= csum_offset + 1)
> + *rte_pktmbuf_mtod_offset(mbuf, uint16_t *, csum_offset) = csum;
> +
> + mbuf->ol_flags &= ~RTE_MBUF_F_RX_L4_CKSUM_MASK;
> + mbuf->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_GOOD;
> +}
> +
> static uint16_t
> eth_vhost_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
> {
> @@ -315,6 +382,9 @@ eth_vhost_rx(void *q, struct rte_mbuf **bufs, uint16_t
> nb_bufs)
> if (r->internal->vlan_strip)
> rte_vlan_strip(bufs[i]);
>
> + if (r->internal->rx_sw_csum)
> + vhost_dev_rx_sw_csum(bufs[i]);
> +
> r->stats.bytes += bufs[i]->pkt_len;
> }
>
> @@ -711,6 +781,11 @@ new_device(int vid)
> eth_dev->data->numa_node = newnode;
> #endif
>
> + if (rte_vhost_get_negotiated_features(vid, &internal->features)) {
> + VHOST_LOG(ERR, "Failed to get device features\n");
> + return -1;
> + }
> +
> internal->vid = vid;
> if (rte_atomic32_read(&internal->started) == 1) {
> queue_setup(eth_dev, internal);
> @@ -733,6 +808,8 @@ new_device(int vid)
>
> eth_dev->data->dev_link.link_status = RTE_ETH_LINK_UP;
>
> + vhost_dev_csum_configure(eth_dev);
> +
> rte_atomic32_set(&internal->dev_attached, 1);
> update_queuing_status(eth_dev);
>
> @@ -1039,6 +1116,8 @@ eth_dev_configure(struct rte_eth_dev *dev)
>
> internal->vlan_strip = !!(rxmode->offloads &
> RTE_ETH_RX_OFFLOAD_VLAN_STRIP);
>
> + vhost_dev_csum_configure(dev);
> +
> return 0;
> }
>
> @@ -1189,6 +1268,10 @@ eth_dev_info(struct rte_eth_dev *dev,
> dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
> RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
> dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
> + if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
> + dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
> + RTE_ETH_RX_OFFLOAD_TCP_CKSUM;
> + }
>
> return 0;
> }
> --
> 2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path
2022-06-10 3:49 ` Xia, Chenbo
@ 2022-06-10 7:19 ` Jiang, Cheng1
0 siblings, 0 replies; 17+ messages in thread
From: Jiang, Cheng1 @ 2022-06-10 7:19 UTC (permalink / raw)
To: Xia, Chenbo, Maxime Coquelin, dev, jasowang, david.marchand,
Matz, Olivier, Ma, WenwuX, Zhang, Yuying, Singh, Aman Deep
Hi Maxime,
> -----Original Message-----
> From: Xia, Chenbo <chenbo.xia@intel.com>
> Sent: Friday, June 10, 2022 11:49 AM
> To: Maxime Coquelin <maxime.coquelin@redhat.com>; dev@dpdk.org;
> jasowang@redhat.com; david.marchand@redhat.com; Matz, Olivier
> <olivier.matz@6wind.com>; Ma, WenwuX <wenwux.ma@intel.com>; Zhang,
> Yuying <yuying.zhang@intel.com>; Singh, Aman Deep
> <aman.deep.singh@intel.com>; Jiang, Cheng1 <cheng1.jiang@intel.com>
> Subject: RE: [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path
>
> + Cheng for review
>
> > -----Original Message-----
> > From: Maxime Coquelin <maxime.coquelin@redhat.com>
> > Sent: Wednesday, June 8, 2022 8:50 PM
> > To: dev@dpdk.org; jasowang@redhat.com; Xia, Chenbo
> > <chenbo.xia@intel.com>; david.marchand@redhat.com; Matz, Olivier
> > <olivier.matz@6wind.com>; Ma, WenwuX <wenwux.ma@intel.com>;
> Zhang,
> > Yuying <yuying.zhang@intel.com>; Singh, Aman Deep
> > <aman.deep.singh@intel.com>
> > Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
> > Subject: [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path
> >
> > Virtio specification supports host checksum offloading for L4, which
> > is enabled with VIRTIO_NET_F_CSUM feature negotiation. However, the
> > Vhost PMD does not advertise Rx checksum offload capabilities, so we
> > can end-up with the VIRTIO_NET_F_CSUM feature being negotiated,
> > implying the Vhost library returns packets with checksum being
> > offloaded while the application did not request for it.
> >
> > Advertising these offload capabilities at the ethdev level is not
> > enough, because we could still end-up with the application not
> > enabling these offloads while the guest still negotiate them.
> >
> > This patch advertises the Rx checksum offload capabilities, and
> > introduces a compatibility layer to cover the case VIRTIO_NET_F_CSUM
> > has been negotiated but the application does not configure the Rx
> > checksum offloads. This function performis the L4 Rx checksum in SW
> > for UDP and TCP. Note that it is not needed to calculate the
> > pseudo-header checksum, because the Virtio specification requires that
> > the driver do it.
> >
> > This patch does not advertise SCTP checksum offloading capability for
> > now, but it could be handled later if the need arises.
> >
> > Reported-by: Jason Wang <jasowang@redhat.com>
> > Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> > ---
> >
Reviewed-by: Cheng Jiang <cheng1.jiang@intel.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
2022-06-08 12:49 [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
` (4 preceding siblings ...)
2022-06-08 12:49 ` [PATCH v2 5/6] net/vhost: perform SW checksum in Rx path Maxime Coquelin
@ 2022-06-08 12:49 ` Maxime Coquelin
2022-06-09 2:26 ` Xia, Chenbo
` (2 more replies)
2022-06-17 14:06 ` [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
6 siblings, 3 replies; 17+ messages in thread
From: Maxime Coquelin @ 2022-06-08 12:49 UTC (permalink / raw)
To: dev, jasowang, chenbo.xia, david.marchand, olivier.matz,
wenwux.ma, yuying.zhang, aman.deep.singh
Cc: Maxime Coquelin
Virtio specification supports guest checksum offloading
for L4, which is enabled with VIRTIO_NET_F_GUEST_CSUM
feature negotiation. However, the Vhost PMD does not
advertise Tx checksum offload capabilities.
Advertising these offload capabilities at the ethdev level
is not enough, because we could still end-up with the
application enabling these offloads while the guest not
negotiating it.
This patch advertises the Tx checksum offload capabilities,
and introduces a compatibility layer to cover the case
VIRTIO_NET_F_GUEST_CSUM has not been negotiated but the
application does configure the Tx checksum offloads. This
function performs the L4 Tx checksum in SW for UDP and TCP.
Compared to Rx SW checksum, the Tx SW checksum function
needs to compute the pseudo-header checksum, as we cannot
know whether it was done before.
This patch does not advertise SCTP checksum offloading
capability for now, but it could be handled later if the
need arises.
Reported-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
drivers/net/vhost/rte_eth_vhost.c | 62 +++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
index 42f0d52ebc..d75d256040 100644
--- a/drivers/net/vhost/rte_eth_vhost.c
+++ b/drivers/net/vhost/rte_eth_vhost.c
@@ -92,6 +92,7 @@ struct pmd_internal {
rte_atomic32_t started;
bool vlan_strip;
bool rx_sw_csum;
+ bool tx_sw_csum;
};
struct internal_list {
@@ -283,8 +284,10 @@ vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
{
struct pmd_internal *internal = eth_dev->data->dev_private;
const struct rte_eth_rxmode *rxmode = ð_dev->data->dev_conf.rxmode;
+ const struct rte_eth_txmode *txmode = ð_dev->data->dev_conf.txmode;
internal->rx_sw_csum = false;
+ internal->tx_sw_csum = false;
/* SW checksum is not compatible with legacy mode */
if (!(internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS))
@@ -297,6 +300,56 @@ vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
internal->rx_sw_csum = true;
}
}
+
+ if (!(internal->features & (1ULL << VIRTIO_NET_F_GUEST_CSUM))) {
+ if (txmode->offloads &
+ (RTE_ETH_TX_OFFLOAD_UDP_CKSUM | RTE_ETH_TX_OFFLOAD_TCP_CKSUM)) {
+ VHOST_LOG(NOTICE, "Tx csum will be done in SW, may impact performance.");
+ internal->tx_sw_csum = true;
+ }
+ }
+}
+
+static void
+vhost_dev_tx_sw_csum(struct rte_mbuf *mbuf)
+{
+ uint32_t hdr_len;
+ uint16_t csum = 0, csum_offset;
+
+ switch (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) {
+ case RTE_MBUF_F_TX_L4_NO_CKSUM:
+ return;
+ case RTE_MBUF_F_TX_TCP_CKSUM:
+ csum_offset = offsetof(struct rte_tcp_hdr, cksum);
+ break;
+ case RTE_MBUF_F_TX_UDP_CKSUM:
+ csum_offset = offsetof(struct rte_udp_hdr, dgram_cksum);
+ break;
+ default:
+ /* Unsupported packet type. */
+ return;
+ }
+
+ hdr_len = mbuf->l2_len + mbuf->l3_len;
+ csum_offset += hdr_len;
+
+ /* Prepare the pseudo-header checksum */
+ if (rte_net_intel_cksum_prepare(mbuf) < 0)
+ return;
+
+ if (rte_raw_cksum_mbuf(mbuf, hdr_len, rte_pktmbuf_pkt_len(mbuf) - hdr_len, &csum) < 0)
+ return;
+
+ csum = ~csum;
+ /* See RFC768 */
+ if (unlikely((mbuf->packet_type & RTE_PTYPE_L4_UDP) && csum == 0))
+ csum = 0xffff;
+
+ if (rte_pktmbuf_data_len(mbuf) >= csum_offset + 1)
+ *rte_pktmbuf_mtod_offset(mbuf, uint16_t *, csum_offset) = csum;
+
+ mbuf->ol_flags &= ~RTE_MBUF_F_TX_L4_MASK;
+ mbuf->ol_flags |= RTE_MBUF_F_TX_L4_NO_CKSUM;
}
static void
@@ -423,6 +476,10 @@ eth_vhost_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
}
}
+ if (r->internal->tx_sw_csum)
+ vhost_dev_tx_sw_csum(m);
+
+
bufs[nb_send] = m;
++nb_send;
}
@@ -1267,6 +1324,11 @@ eth_dev_info(struct rte_eth_dev *dev,
dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
+ if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
+ dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
+ RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
+ }
+
dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
--
2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
2022-06-08 12:49 ` [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path Maxime Coquelin
@ 2022-06-09 2:26 ` Xia, Chenbo
2022-06-10 3:49 ` Xia, Chenbo
2022-06-10 3:50 ` Xia, Chenbo
2 siblings, 0 replies; 17+ messages in thread
From: Xia, Chenbo @ 2022-06-09 2:26 UTC (permalink / raw)
To: Maxime Coquelin, dev, jasowang, david.marchand, Matz, Olivier,
Ma, WenwuX, Zhang, Yuying, Singh, Aman Deep
Hi Maxime,
> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Wednesday, June 8, 2022 8:50 PM
> To: dev@dpdk.org; jasowang@redhat.com; Xia, Chenbo <chenbo.xia@intel.com>;
> david.marchand@redhat.com; Matz, Olivier <olivier.matz@6wind.com>; Ma,
> WenwuX <wenwux.ma@intel.com>; Zhang, Yuying <yuying.zhang@intel.com>;
> Singh, Aman Deep <aman.deep.singh@intel.com>
> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
> Subject: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
>
> Virtio specification supports guest checksum offloading
> for L4, which is enabled with VIRTIO_NET_F_GUEST_CSUM
> feature negotiation. However, the Vhost PMD does not
> advertise Tx checksum offload capabilities.
>
> Advertising these offload capabilities at the ethdev level
> is not enough, because we could still end-up with the
> application enabling these offloads while the guest not
> negotiating it.
>
> This patch advertises the Tx checksum offload capabilities,
> and introduces a compatibility layer to cover the case
> VIRTIO_NET_F_GUEST_CSUM has not been negotiated but the
> application does configure the Tx checksum offloads. This
> function performs the L4 Tx checksum in SW for UDP and TCP.
> Compared to Rx SW checksum, the Tx SW checksum function
> needs to compute the pseudo-header checksum, as we cannot
> know whether it was done before.
>
> This patch does not advertise SCTP checksum offloading
> capability for now, but it could be handled later if the
> need arises.
>
> Reported-by: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> ---
> drivers/net/vhost/rte_eth_vhost.c | 62 +++++++++++++++++++++++++++++++
> 1 file changed, 62 insertions(+)
>
> diff --git a/drivers/net/vhost/rte_eth_vhost.c
> b/drivers/net/vhost/rte_eth_vhost.c
> index 42f0d52ebc..d75d256040 100644
> --- a/drivers/net/vhost/rte_eth_vhost.c
> +++ b/drivers/net/vhost/rte_eth_vhost.c
> @@ -92,6 +92,7 @@ struct pmd_internal {
> rte_atomic32_t started;
> bool vlan_strip;
> bool rx_sw_csum;
> + bool tx_sw_csum;
> };
>
> struct internal_list {
> @@ -283,8 +284,10 @@ vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
> {
> struct pmd_internal *internal = eth_dev->data->dev_private;
> const struct rte_eth_rxmode *rxmode = ð_dev->data-
> >dev_conf.rxmode;
> + const struct rte_eth_txmode *txmode = ð_dev->data-
> >dev_conf.txmode;
>
> internal->rx_sw_csum = false;
> + internal->tx_sw_csum = false;
>
> /* SW checksum is not compatible with legacy mode */
> if (!(internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS))
> @@ -297,6 +300,56 @@ vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
> internal->rx_sw_csum = true;
> }
> }
> +
> + if (!(internal->features & (1ULL << VIRTIO_NET_F_GUEST_CSUM))) {
> + if (txmode->offloads &
> + (RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
> RTE_ETH_TX_OFFLOAD_TCP_CKSUM)) {
> + VHOST_LOG(NOTICE, "Tx csum will be done in SW, may
> impact performance.");
Missing \n
With above fixed:
Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
> + internal->tx_sw_csum = true;
> + }
> + }
> +}
> +
> +static void
> +vhost_dev_tx_sw_csum(struct rte_mbuf *mbuf)
> +{
> + uint32_t hdr_len;
> + uint16_t csum = 0, csum_offset;
> +
> + switch (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) {
> + case RTE_MBUF_F_TX_L4_NO_CKSUM:
> + return;
> + case RTE_MBUF_F_TX_TCP_CKSUM:
> + csum_offset = offsetof(struct rte_tcp_hdr, cksum);
> + break;
> + case RTE_MBUF_F_TX_UDP_CKSUM:
> + csum_offset = offsetof(struct rte_udp_hdr, dgram_cksum);
> + break;
> + default:
> + /* Unsupported packet type. */
> + return;
> + }
> +
> + hdr_len = mbuf->l2_len + mbuf->l3_len;
> + csum_offset += hdr_len;
> +
> + /* Prepare the pseudo-header checksum */
> + if (rte_net_intel_cksum_prepare(mbuf) < 0)
> + return;
> +
> + if (rte_raw_cksum_mbuf(mbuf, hdr_len, rte_pktmbuf_pkt_len(mbuf) -
> hdr_len, &csum) < 0)
> + return;
> +
> + csum = ~csum;
> + /* See RFC768 */
> + if (unlikely((mbuf->packet_type & RTE_PTYPE_L4_UDP) && csum == 0))
> + csum = 0xffff;
> +
> + if (rte_pktmbuf_data_len(mbuf) >= csum_offset + 1)
> + *rte_pktmbuf_mtod_offset(mbuf, uint16_t *, csum_offset) = csum;
> +
> + mbuf->ol_flags &= ~RTE_MBUF_F_TX_L4_MASK;
> + mbuf->ol_flags |= RTE_MBUF_F_TX_L4_NO_CKSUM;
> }
>
> static void
> @@ -423,6 +476,10 @@ eth_vhost_tx(void *q, struct rte_mbuf **bufs,
> uint16_t nb_bufs)
> }
> }
>
> + if (r->internal->tx_sw_csum)
> + vhost_dev_tx_sw_csum(m);
> +
> +
> bufs[nb_send] = m;
> ++nb_send;
> }
> @@ -1267,6 +1324,11 @@ eth_dev_info(struct rte_eth_dev *dev,
>
> dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
> RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
> + if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
> + dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
> + RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
> + }
> +
> dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
> if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
> dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
> --
> 2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
2022-06-08 12:49 ` [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path Maxime Coquelin
2022-06-09 2:26 ` Xia, Chenbo
@ 2022-06-10 3:49 ` Xia, Chenbo
2022-06-10 7:31 ` Jiang, Cheng1
2022-06-10 3:50 ` Xia, Chenbo
2 siblings, 1 reply; 17+ messages in thread
From: Xia, Chenbo @ 2022-06-10 3:49 UTC (permalink / raw)
To: Maxime Coquelin, dev, jasowang, david.marchand, Matz, Olivier,
Ma, WenwuX, Zhang, Yuying, Singh, Aman Deep
+Cheng for review
> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Wednesday, June 8, 2022 8:50 PM
> To: dev@dpdk.org; jasowang@redhat.com; Xia, Chenbo <chenbo.xia@intel.com>;
> david.marchand@redhat.com; Matz, Olivier <olivier.matz@6wind.com>; Ma,
> WenwuX <wenwux.ma@intel.com>; Zhang, Yuying <yuying.zhang@intel.com>;
> Singh, Aman Deep <aman.deep.singh@intel.com>
> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
> Subject: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
>
> Virtio specification supports guest checksum offloading
> for L4, which is enabled with VIRTIO_NET_F_GUEST_CSUM
> feature negotiation. However, the Vhost PMD does not
> advertise Tx checksum offload capabilities.
>
> Advertising these offload capabilities at the ethdev level
> is not enough, because we could still end-up with the
> application enabling these offloads while the guest not
> negotiating it.
>
> This patch advertises the Tx checksum offload capabilities,
> and introduces a compatibility layer to cover the case
> VIRTIO_NET_F_GUEST_CSUM has not been negotiated but the
> application does configure the Tx checksum offloads. This
> function performs the L4 Tx checksum in SW for UDP and TCP.
> Compared to Rx SW checksum, the Tx SW checksum function
> needs to compute the pseudo-header checksum, as we cannot
> know whether it was done before.
>
> This patch does not advertise SCTP checksum offloading
> capability for now, but it could be handled later if the
> need arises.
>
> Reported-by: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> ---
> drivers/net/vhost/rte_eth_vhost.c | 62 +++++++++++++++++++++++++++++++
> 1 file changed, 62 insertions(+)
>
> diff --git a/drivers/net/vhost/rte_eth_vhost.c
> b/drivers/net/vhost/rte_eth_vhost.c
> index 42f0d52ebc..d75d256040 100644
> --- a/drivers/net/vhost/rte_eth_vhost.c
> +++ b/drivers/net/vhost/rte_eth_vhost.c
> @@ -92,6 +92,7 @@ struct pmd_internal {
> rte_atomic32_t started;
> bool vlan_strip;
> bool rx_sw_csum;
> + bool tx_sw_csum;
> };
>
> struct internal_list {
> @@ -283,8 +284,10 @@ vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
> {
> struct pmd_internal *internal = eth_dev->data->dev_private;
> const struct rte_eth_rxmode *rxmode = ð_dev->data-
> >dev_conf.rxmode;
> + const struct rte_eth_txmode *txmode = ð_dev->data-
> >dev_conf.txmode;
>
> internal->rx_sw_csum = false;
> + internal->tx_sw_csum = false;
>
> /* SW checksum is not compatible with legacy mode */
> if (!(internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS))
> @@ -297,6 +300,56 @@ vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
> internal->rx_sw_csum = true;
> }
> }
> +
> + if (!(internal->features & (1ULL << VIRTIO_NET_F_GUEST_CSUM))) {
> + if (txmode->offloads &
> + (RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
> RTE_ETH_TX_OFFLOAD_TCP_CKSUM)) {
> + VHOST_LOG(NOTICE, "Tx csum will be done in SW, may
> impact performance.");
> + internal->tx_sw_csum = true;
> + }
> + }
> +}
> +
> +static void
> +vhost_dev_tx_sw_csum(struct rte_mbuf *mbuf)
> +{
> + uint32_t hdr_len;
> + uint16_t csum = 0, csum_offset;
> +
> + switch (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) {
> + case RTE_MBUF_F_TX_L4_NO_CKSUM:
> + return;
> + case RTE_MBUF_F_TX_TCP_CKSUM:
> + csum_offset = offsetof(struct rte_tcp_hdr, cksum);
> + break;
> + case RTE_MBUF_F_TX_UDP_CKSUM:
> + csum_offset = offsetof(struct rte_udp_hdr, dgram_cksum);
> + break;
> + default:
> + /* Unsupported packet type. */
> + return;
> + }
> +
> + hdr_len = mbuf->l2_len + mbuf->l3_len;
> + csum_offset += hdr_len;
> +
> + /* Prepare the pseudo-header checksum */
> + if (rte_net_intel_cksum_prepare(mbuf) < 0)
> + return;
> +
> + if (rte_raw_cksum_mbuf(mbuf, hdr_len, rte_pktmbuf_pkt_len(mbuf) -
> hdr_len, &csum) < 0)
> + return;
> +
> + csum = ~csum;
> + /* See RFC768 */
> + if (unlikely((mbuf->packet_type & RTE_PTYPE_L4_UDP) && csum == 0))
> + csum = 0xffff;
> +
> + if (rte_pktmbuf_data_len(mbuf) >= csum_offset + 1)
> + *rte_pktmbuf_mtod_offset(mbuf, uint16_t *, csum_offset) = csum;
> +
> + mbuf->ol_flags &= ~RTE_MBUF_F_TX_L4_MASK;
> + mbuf->ol_flags |= RTE_MBUF_F_TX_L4_NO_CKSUM;
> }
>
> static void
> @@ -423,6 +476,10 @@ eth_vhost_tx(void *q, struct rte_mbuf **bufs,
> uint16_t nb_bufs)
> }
> }
>
> + if (r->internal->tx_sw_csum)
> + vhost_dev_tx_sw_csum(m);
> +
> +
> bufs[nb_send] = m;
> ++nb_send;
> }
> @@ -1267,6 +1324,11 @@ eth_dev_info(struct rte_eth_dev *dev,
>
> dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
> RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
> + if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
> + dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
> + RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
> + }
> +
> dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
> if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
> dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
> --
> 2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
2022-06-10 3:49 ` Xia, Chenbo
@ 2022-06-10 7:31 ` Jiang, Cheng1
0 siblings, 0 replies; 17+ messages in thread
From: Jiang, Cheng1 @ 2022-06-10 7:31 UTC (permalink / raw)
To: Xia, Chenbo, Maxime Coquelin, dev, jasowang, david.marchand,
Matz, Olivier, Ma, WenwuX, Zhang, Yuying, Singh, Aman Deep
Hi Maxime,
> -----Original Message-----
> From: Xia, Chenbo <chenbo.xia@intel.com>
> Sent: Friday, June 10, 2022 11:50 AM
> To: Maxime Coquelin <maxime.coquelin@redhat.com>; dev@dpdk.org;
> jasowang@redhat.com; david.marchand@redhat.com; Matz, Olivier
> <olivier.matz@6wind.com>; Ma, WenwuX <wenwux.ma@intel.com>; Zhang,
> Yuying <yuying.zhang@intel.com>; Singh, Aman Deep
> <aman.deep.singh@intel.com>
> Subject: RE: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
>
> +Cheng for review
>
> > -----Original Message-----
> > From: Maxime Coquelin <maxime.coquelin@redhat.com>
> > Sent: Wednesday, June 8, 2022 8:50 PM
> > To: dev@dpdk.org; jasowang@redhat.com; Xia, Chenbo
> > <chenbo.xia@intel.com>; david.marchand@redhat.com; Matz, Olivier
> > <olivier.matz@6wind.com>; Ma, WenwuX <wenwux.ma@intel.com>;
> Zhang,
> > Yuying <yuying.zhang@intel.com>; Singh, Aman Deep
> > <aman.deep.singh@intel.com>
> > Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
> > Subject: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
> >
> > Virtio specification supports guest checksum offloading for L4, which
> > is enabled with VIRTIO_NET_F_GUEST_CSUM feature negotiation.
> However,
> > the Vhost PMD does not advertise Tx checksum offload capabilities.
> >
> > Advertising these offload capabilities at the ethdev level is not
> > enough, because we could still end-up with the application enabling
> > these offloads while the guest not negotiating it.
> >
> > This patch advertises the Tx checksum offload capabilities, and
> > introduces a compatibility layer to cover the case
> > VIRTIO_NET_F_GUEST_CSUM has not been negotiated but the application
> > does configure the Tx checksum offloads. This function performs the L4
> > Tx checksum in SW for UDP and TCP.
> > Compared to Rx SW checksum, the Tx SW checksum function needs to
> > compute the pseudo-header checksum, as we cannot know whether it was
> > done before.
> >
> > This patch does not advertise SCTP checksum offloading capability for
> > now, but it could be handled later if the need arises.
> >
> > Reported-by: Jason Wang <jasowang@redhat.com>
> > Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> > ---
Reviewed-by: Cheng Jiang <cheng1.jiang@intel.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
2022-06-08 12:49 ` [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path Maxime Coquelin
2022-06-09 2:26 ` Xia, Chenbo
2022-06-10 3:49 ` Xia, Chenbo
@ 2022-06-10 3:50 ` Xia, Chenbo
2 siblings, 0 replies; 17+ messages in thread
From: Xia, Chenbo @ 2022-06-10 3:50 UTC (permalink / raw)
To: Maxime Coquelin, dev, jasowang, david.marchand, Matz, Olivier,
Ma, WenwuX, Zhang, Yuying, Singh, Aman Deep, Jiang, Cheng1
+Cheng
> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin@redhat.com>
> Sent: Wednesday, June 8, 2022 8:50 PM
> To: dev@dpdk.org; jasowang@redhat.com; Xia, Chenbo <chenbo.xia@intel.com>;
> david.marchand@redhat.com; Matz, Olivier <olivier.matz@6wind.com>; Ma,
> WenwuX <wenwux.ma@intel.com>; Zhang, Yuying <yuying.zhang@intel.com>;
> Singh, Aman Deep <aman.deep.singh@intel.com>
> Cc: Maxime Coquelin <maxime.coquelin@redhat.com>
> Subject: [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path
>
> Virtio specification supports guest checksum offloading
> for L4, which is enabled with VIRTIO_NET_F_GUEST_CSUM
> feature negotiation. However, the Vhost PMD does not
> advertise Tx checksum offload capabilities.
>
> Advertising these offload capabilities at the ethdev level
> is not enough, because we could still end-up with the
> application enabling these offloads while the guest not
> negotiating it.
>
> This patch advertises the Tx checksum offload capabilities,
> and introduces a compatibility layer to cover the case
> VIRTIO_NET_F_GUEST_CSUM has not been negotiated but the
> application does configure the Tx checksum offloads. This
> function performs the L4 Tx checksum in SW for UDP and TCP.
> Compared to Rx SW checksum, the Tx SW checksum function
> needs to compute the pseudo-header checksum, as we cannot
> know whether it was done before.
>
> This patch does not advertise SCTP checksum offloading
> capability for now, but it could be handled later if the
> need arises.
>
> Reported-by: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
> ---
> drivers/net/vhost/rte_eth_vhost.c | 62 +++++++++++++++++++++++++++++++
> 1 file changed, 62 insertions(+)
>
> diff --git a/drivers/net/vhost/rte_eth_vhost.c
> b/drivers/net/vhost/rte_eth_vhost.c
> index 42f0d52ebc..d75d256040 100644
> --- a/drivers/net/vhost/rte_eth_vhost.c
> +++ b/drivers/net/vhost/rte_eth_vhost.c
> @@ -92,6 +92,7 @@ struct pmd_internal {
> rte_atomic32_t started;
> bool vlan_strip;
> bool rx_sw_csum;
> + bool tx_sw_csum;
> };
>
> struct internal_list {
> @@ -283,8 +284,10 @@ vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
> {
> struct pmd_internal *internal = eth_dev->data->dev_private;
> const struct rte_eth_rxmode *rxmode = ð_dev->data-
> >dev_conf.rxmode;
> + const struct rte_eth_txmode *txmode = ð_dev->data-
> >dev_conf.txmode;
>
> internal->rx_sw_csum = false;
> + internal->tx_sw_csum = false;
>
> /* SW checksum is not compatible with legacy mode */
> if (!(internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS))
> @@ -297,6 +300,56 @@ vhost_dev_csum_configure(struct rte_eth_dev *eth_dev)
> internal->rx_sw_csum = true;
> }
> }
> +
> + if (!(internal->features & (1ULL << VIRTIO_NET_F_GUEST_CSUM))) {
> + if (txmode->offloads &
> + (RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
> RTE_ETH_TX_OFFLOAD_TCP_CKSUM)) {
> + VHOST_LOG(NOTICE, "Tx csum will be done in SW, may
> impact performance.");
> + internal->tx_sw_csum = true;
> + }
> + }
> +}
> +
> +static void
> +vhost_dev_tx_sw_csum(struct rte_mbuf *mbuf)
> +{
> + uint32_t hdr_len;
> + uint16_t csum = 0, csum_offset;
> +
> + switch (mbuf->ol_flags & RTE_MBUF_F_TX_L4_MASK) {
> + case RTE_MBUF_F_TX_L4_NO_CKSUM:
> + return;
> + case RTE_MBUF_F_TX_TCP_CKSUM:
> + csum_offset = offsetof(struct rte_tcp_hdr, cksum);
> + break;
> + case RTE_MBUF_F_TX_UDP_CKSUM:
> + csum_offset = offsetof(struct rte_udp_hdr, dgram_cksum);
> + break;
> + default:
> + /* Unsupported packet type. */
> + return;
> + }
> +
> + hdr_len = mbuf->l2_len + mbuf->l3_len;
> + csum_offset += hdr_len;
> +
> + /* Prepare the pseudo-header checksum */
> + if (rte_net_intel_cksum_prepare(mbuf) < 0)
> + return;
> +
> + if (rte_raw_cksum_mbuf(mbuf, hdr_len, rte_pktmbuf_pkt_len(mbuf) -
> hdr_len, &csum) < 0)
> + return;
> +
> + csum = ~csum;
> + /* See RFC768 */
> + if (unlikely((mbuf->packet_type & RTE_PTYPE_L4_UDP) && csum == 0))
> + csum = 0xffff;
> +
> + if (rte_pktmbuf_data_len(mbuf) >= csum_offset + 1)
> + *rte_pktmbuf_mtod_offset(mbuf, uint16_t *, csum_offset) = csum;
> +
> + mbuf->ol_flags &= ~RTE_MBUF_F_TX_L4_MASK;
> + mbuf->ol_flags |= RTE_MBUF_F_TX_L4_NO_CKSUM;
> }
>
> static void
> @@ -423,6 +476,10 @@ eth_vhost_tx(void *q, struct rte_mbuf **bufs,
> uint16_t nb_bufs)
> }
> }
>
> + if (r->internal->tx_sw_csum)
> + vhost_dev_tx_sw_csum(m);
> +
> +
> bufs[nb_send] = m;
> ++nb_send;
> }
> @@ -1267,6 +1324,11 @@ eth_dev_info(struct rte_eth_dev *dev,
>
> dev_info->tx_offload_capa = RTE_ETH_TX_OFFLOAD_MULTI_SEGS |
> RTE_ETH_TX_OFFLOAD_VLAN_INSERT;
> + if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
> + dev_info->tx_offload_capa |= RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
> + RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
> + }
> +
> dev_info->rx_offload_capa = RTE_ETH_RX_OFFLOAD_VLAN_STRIP;
> if (internal->flags & RTE_VHOST_USER_NET_COMPLIANT_OL_FLAGS) {
> dev_info->rx_offload_capa |= RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
> --
> 2.35.3
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/6] Vhost checksum offload improvements
2022-06-08 12:49 [PATCH v2 0/6] Vhost checksum offload improvements Maxime Coquelin
` (5 preceding siblings ...)
2022-06-08 12:49 ` [PATCH v2 6/6] net/vhost: perform SW checksum in Tx path Maxime Coquelin
@ 2022-06-17 14:06 ` Maxime Coquelin
6 siblings, 0 replies; 17+ messages in thread
From: Maxime Coquelin @ 2022-06-17 14:06 UTC (permalink / raw)
To: dev, jasowang, chenbo.xia, david.marchand, olivier.matz,
wenwux.ma, yuying.zhang, aman.deep.singh
On 6/8/22 14:49, Maxime Coquelin wrote:
> This series aims at improving Vhost checksum offloading
> support.
>
> The first patch reverts overwritting MAC address in
> testpmd CSUM forward mode. This is required to be able to
> test checksum offloading with real traffic. MAC forwarding
> mode should be used if the MAC addresses need to be
> changed.
>
> Second patch is a Vhost library fix to be compliant with
> the Virtio specification, which requires that the
> pseudo-header checksum is being set by the device when
> offloading the checksum to the guest.
>
> Third patch enables the compliant offloading mode of Vhost
> library in Vhost PMD by default, since the legacy mode
> violates the mbuf API by setting Tx flags in the receive
> path. A new devarg is introduced for application willing
> to use the legacy mode.
>
> Fourth patch is just a small cleanup to represent a boolean
> value as a boolean.
>
> The two last patches introduces compatibility layers
> that performs checksum in SW when the ethdev and Virtio
> features are not aligned.
>
> Note that the two last patches are not tagged as fixes
> because they rely on the new compliant offload mode of
> Vhost library, and so would casue an ABI breakage if
> backported.
>
> With this series, it is now possible to perform IO
> forwarding between a vhost-user port and a Vitio-user
> with kernel backend port even if the guest has negotiated
> VIRTIO_NET_F_CSUM.
>
> With csum forward mode, it now works whathever the
> offloading configuration set either on Virtio or Ethdev
> sides.
>
> Changes in v2:
> ==============
> - Add the new devarg to validation array (Wenwu)
> - Fix typos in commit messages (Chenbo, checkpatch, Yuying)
>
> Maxime Coquelin (6):
> Revert "app/testpmd: modify mac in csum forwarding"
> vhost: fix missing enqueue pseudo-header calculation
> net/vhost: enable compliant offloading mode
> net/vhost: make VLAN stripping flag a boolean
> net/vhost: perform SW checksum in Rx path
> net/vhost: perform SW checksum in Tx path
>
> app/test-pmd/csumonly.c | 4 -
> doc/guides/nics/features/vhost.ini | 1 +
> doc/guides/nics/vhost.rst | 6 ++
> drivers/net/vhost/rte_eth_vhost.c | 167 ++++++++++++++++++++++++++++-
> lib/vhost/virtio_net.c | 10 ++
> 5 files changed, 180 insertions(+), 8 deletions(-)
>
Applied to dpdk-next-virtio/main.
Thanks,
Maxime
^ permalink raw reply [flat|nested] 17+ messages in thread