Skip to content

Commit 251bc41

Browse files
netdev-dpdk: Use guest TSO segmentation size hint.
In a typical setup like: guest A <-virtio-> OVS A <-vxlan-> OVS B <-virtio-> guest B TSO packets from guest A are segmented against the OVS A physical port mtu adjusted by the vxlan tunnel header size, regardless of guest A interface mtu. As an example, let's say guest A and guest B mtu are set to 1500 bytes. OVS A and OVS B physical ports mtu are set to 1600 bytes. Guest A will request TCP segmentation for 1448 bytes segments. On the other hand, OVS A will request 1498 bytes segments to the HW. This results in OVS B dropping packets because decapsulated packets are larger than the vhost-user port (serving guest B) mtu. 2024-04-17T14:13:01.239Z|00002|netdev_dpdk(pmd-c03/id:7)|WARN|vhost0: Too big size 1564 max_packet_len 1518 vhost-user ports expose a guest mtu by filling mbuf->tso_segsz. Use it as a hint. This may result in segments (on the wire) slightly shorter than the optimal size. Reported-at: openvswitch/ovs-issues#321 Signed-off-by: David Marchand <[email protected]>
1 parent edb8e86 commit 251bc41

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

lib/netdev-dpdk.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2670,14 +2670,19 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf)
26702670

26712671
if (mbuf->ol_flags & RTE_MBUF_F_TX_TCP_SEG) {
26722672
struct tcp_header *th = dp_packet_l4(pkt);
2673+
uint16_t link_tso_segsz;
26732674
int hdr_len;
26742675

26752676
if (tunnel_type) {
2676-
mbuf->tso_segsz = dev->mtu - mbuf->l2_len - mbuf->l3_len -
2677-
mbuf->l4_len - mbuf->outer_l3_len;
2677+
link_tso_segsz = dev->mtu - mbuf->l2_len - mbuf->l3_len -
2678+
mbuf->l4_len - mbuf->outer_l3_len;
26782679
} else {
26792680
mbuf->l4_len = TCP_OFFSET(th->tcp_ctl) * 4;
2680-
mbuf->tso_segsz = dev->mtu - mbuf->l3_len - mbuf->l4_len;
2681+
link_tso_segsz = dev->mtu - mbuf->l3_len - mbuf->l4_len;
2682+
}
2683+
2684+
if (mbuf->tso_segsz > link_tso_segsz) {
2685+
mbuf->tso_segsz = link_tso_segsz;
26812686
}
26822687

26832688
hdr_len = mbuf->l2_len + mbuf->l3_len + mbuf->l4_len;

0 commit comments

Comments
 (0)