Hi, Harold Thanks for the details. I have found my ovs has been patched. So it does not have this issue.
But thanks anyway. Btw, i have tried Flavio ’s patch, it is very clean and I have merged it in our own ovs. It has a minor issues that it counts the hwol drop into tx failure error which is different to the original logic. Harold Huang <[email protected]>于2022年1月21日 周五下午5:32写道: > Hi, He Peng, > > 贺鹏 <[email protected]> 于2022年1月18日周二 12:43写道: > > > > > Hi, Harold, > > > > I am curious how this bug is found as I have an unsolved bug that I > believe it's related to > > some memory issues and may be related to NIC's problem. > > > > I find this problem when I use ovs-tcpdump tool to capture the jumbo > frames in the physical dpdk port which supports TSO for the jumbo > frames. The jumbo frame is from a virtio-user port and the backend if > virtio-user is the vhost-net in the host. Ovs-tcpdump will create a > dummy port and the dpcls flow will be modified with multiple output > ports. I think a jumbo frame from vhost-user port would have the same > problem. > > > > > Harold Huang <[email protected]> 于2022年1月13日周四 16:24写道: > >> > >> From: Harold Huang <[email protected]> > >> > >> When one flow is output to multiple egress ports, OVS copy the packets > >> and send the copy packets to the intermediate ports. The original > packets > >> is sent to the last port. If the intermediate port is a dpdk port, the > copy > >> packets should also be prepared for tso offload. > >> > >> Fixes: 29cf9c1b3b ("userspace: Add TCP Segmentation Offload support") > >> Signed-off-by: Harold Huang <[email protected]> > >> --- > >> lib/netdev-dpdk.c | 13 ++++++------- > >> 1 file changed, 6 insertions(+), 7 deletions(-) > >> > >> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > >> index 6782d3e8f..83029405e 100644 > >> --- a/lib/netdev-dpdk.c > >> +++ b/lib/netdev-dpdk.c > >> @@ -2737,10 +2737,11 @@ dpdk_pktmbuf_alloc(struct rte_mempool *mp, > uint32_t data_len) > >> } > >> > >> static struct dp_packet * > >> -dpdk_copy_dp_packet_to_mbuf(struct rte_mempool *mp, struct dp_packet > *pkt_orig) > >> +dpdk_copy_dp_packet_to_mbuf(struct netdev_dpdk *dev, struct dp_packet > *pkt_orig) > >> { > >> struct rte_mbuf *mbuf_dest; > >> struct dp_packet *pkt_dest; > >> + struct rte_mempool *mp = dev->dpdk_mp->mp; > >> uint32_t pkt_len; > >> > >> pkt_len = dp_packet_size(pkt_orig); > >> @@ -2761,11 +2762,9 @@ dpdk_copy_dp_packet_to_mbuf(struct rte_mempool > *mp, struct dp_packet *pkt_orig) > >> memcpy(&pkt_dest->l2_pad_size, &pkt_orig->l2_pad_size, > >> sizeof(struct dp_packet) - offsetof(struct dp_packet, > l2_pad_size)); > >> > >> - if (mbuf_dest->ol_flags & RTE_MBUF_F_TX_L4_MASK) { > >> - mbuf_dest->l2_len = (char *)dp_packet_l3(pkt_dest) > >> - - (char *)dp_packet_eth(pkt_dest); > >> - mbuf_dest->l3_len = (char *)dp_packet_l4(pkt_dest) > >> - - (char *) dp_packet_l3(pkt_dest); > >> + if (!netdev_dpdk_prep_hwol_packet(dev, mbuf_dest)) { > > > > > > perhaps check userspace_tso_enabled()? > > Yes, but the old code may only want to support the checksum offload. I > think checking userspace_tso_enabled() in > netdev_dpdk_prep_hwol_packet() is a better solution. Flavio’s patch > could also fix this bug. > > > > >> > >> + rte_pktmbuf_free(mbuf_dest); > >> + return NULL; > >> } > >> > >> return pkt_dest; > >> @@ -2813,7 +2812,7 @@ dpdk_do_tx_copy(struct netdev *netdev, int qid, > struct dp_packet_batch *batch) > >> continue; > >> } > >> > >> - pkts[txcnt] = dpdk_copy_dp_packet_to_mbuf(dev->dpdk_mp->mp, > packet); > >> + pkts[txcnt] = dpdk_copy_dp_packet_to_mbuf(dev, packet); > >> if (OVS_UNLIKELY(!pkts[txcnt])) { > >> dropped = cnt - i; > >> break; > >> -- > >> 2.27.0 > >> > >> _______________________________________________ > >> dev mailing list > >> [email protected] > >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > > > > > > > -- > > hepeng > -- hepeng _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
