Sorry it counts the copy to mbuf error into tx failure error which is
different to the original logic


Peng He <[email protected]>于2022年1月21日 周五下午10:53写道:

> 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
>
-- 
hepeng
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to