Jiayu, please could you help in this review?

27/07/2022 10:44, Jun Qiu:
> I think this delay is tolerable.
> Many TCP stacks do not take special care of PUSH packets when receiving them. 
> All received packets with data will trigger Poll events.
> 
> The patch is simple to implement and easy to understand, similar to how the 
> kernel stack is handled.
> 
> From: kumaraparameshwaran rathinavel <kumaraparames...@gmail.com>
> Sent: Tuesday, July 26, 2022 3:08 PM
> To: Jun Qiu <jun....@jaguarmicro.com>
> Cc: dev@dpdk.org; jiayu...@intel.com; sta...@dpdk.org
> Subject: Re: [PATCH] gro: fix gro with tcp push flag
> 
> We should do it for the rte_gro_reassemble as well, with timer mode it could 
> lead to more duplicate ACKs. I had a proposal for the enhancement which would 
> handle both  rte_gro_reassemble and rte_gro_reassemble_burst but have not got 
> any response yet.
> 
> I have a custom patch which is working fine for timer mode where there is no 
> packet reordering, earlier without the patch there were DUP-ACKs and this 
> could potentially affect the window scaling.
> 
> On Tue, Jul 26, 2022 at 12:27 PM Jun Qiu 
> <jun....@jaguarmicro.com<mailto:jun....@jaguarmicro.com>> wrote:
> May be in rte_gro_reassemble_burst, where no delay is introduced, PUSH 
> packets can be merged
> 
> 发件人: kumaraparameshwaran rathinavel 
> <kumaraparames...@gmail.com<mailto:kumaraparames...@gmail.com>>
> 发送时间: 2022年7月26日 14:41
> 收件人: Jun Qiu <jun....@jaguarmicro.com<mailto:jun....@jaguarmicro.com>>
> 抄送: dev@dpdk.org<mailto:dev@dpdk.org>; 
> jiayu...@intel.com<mailto:jiayu...@intel.com>; 
> sta...@dpdk.org<mailto:sta...@dpdk.org>
> 主题: Re: [PATCH] gro: fix gro with tcp push flag
> 
> 
> 
> On Tue, Jul 26, 2022 at 11:48 AM Jun Qiu 
> <jun....@jaguarmicro.com<mailto:jun....@jaguarmicro.com>> wrote:
> TCP data packets sometimes carry a PUSH flag. Currently,
> only the packets that do not have PUSH flag can be GROed.
> The packets that have a PUSH flag cannot be GROed, the packets
> that cannot be processed by GRO are placed last.
> In this case, the received packets may be out of order.
> For example, there are two packets mbuf1 and mbuf2. mbuf1
> contains PUSH flag, mbuf2 does not contain PUSH flag.
> After GRO processing, mbuf2 is sent for processing before mbuf1.
> This out-of-order will affect TCP processing performance and
> lead to unnecessary dup-ACK.
> 
> Referring to the Linux kernel implementation, packets with PUSH
> flag can also perform GRO. And if one of the packets containing
> PUSH flag, the packets after GRO will carry PUSH flag.
> 
> In case of smaller transfers in which the TCP segment size is not more than 
> one MTU, it is a single TCP packet with PSH flag set, so in those cases  we 
> are introducing unwanted delay.  I think the better approach would be if 
> there are previous packets in the flow and the current packet received has 
> PSH flag then coalesce with the previous packet, if lookup is failure and the 
> current packet has PSH flag set then deliver it immediately.
> 
> Fixes: 0d2cbe59b719 ("lib/gro: support TCP/IPv4")
> Cc: sta...@dpdk.org<mailto:sta...@dpdk.org>
> 
> Signed-off-by: Jun Qiu 
> <jun....@jaguarmicro.com<mailto:jun....@jaguarmicro.com>>
> ---
>  lib/gro/gro_tcp4.c       |  4 ++--
>  lib/gro/gro_tcp4.h       | 16 +++++++++++++---
>  lib/gro/gro_vxlan_tcp4.c |  4 ++--
>  3 files changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/lib/gro/gro_tcp4.c b/lib/gro/gro_tcp4.c
> index 7498c66141..7849a2bd1d 100644
> --- a/lib/gro/gro_tcp4.c
> +++ b/lib/gro/gro_tcp4.c
> @@ -220,10 +220,10 @@ gro_tcp4_reassemble(struct rte_mbuf *pkt,
>         hdr_len = pkt->l2_len + pkt->l3_len + pkt->l4_len;
> 
>         /*
> -        * Don't process the packet which has FIN, SYN, RST, PSH, URG, ECE
> +        * Don't process the packet which has FIN, SYN, RST, URG, ECE
>          * or CWR set.
>          */
> -       if (tcp_hdr->tcp_flags != RTE_TCP_ACK_FLAG)
> +       if (tcp_hdr->tcp_flags & (~(RTE_TCP_ACK_FLAG | RTE_TCP_PSH_FLAG)))
>                 return -1;
>         /*
>          * Don't process the packet whose payload length is less than or
> diff --git a/lib/gro/gro_tcp4.h b/lib/gro/gro_tcp4.h
> index 212f97a042..2974faf228 100644
> --- a/lib/gro/gro_tcp4.h
> +++ b/lib/gro/gro_tcp4.h
> @@ -210,7 +210,8 @@ merge_two_tcp4_packets(struct gro_tcp4_item *item,
>                 uint16_t l2_offset)
>  {
>         struct rte_mbuf *pkt_head, *pkt_tail, *lastseg;
> -       uint16_t hdr_len, l2_len;
> +       struct rte_tcp_hdr *head_tcp_hdr, *tail_tcp_hdr;
> +       uint16_t hdr_len, l2_len, l3_offset;
> 
>         if (cmp > 0) {
>                 pkt_head = item->firstseg;
> @@ -221,13 +222,22 @@ merge_two_tcp4_packets(struct gro_tcp4_item *item,
>         }
> 
>         /* check if the IPv4 packet length is greater than the max value */
> -       hdr_len = l2_offset + pkt_head->l2_len + pkt_head->l3_len +
> -               pkt_head->l4_len;
> +       l3_offset = l2_offset + pkt_head->l2_len + pkt_head->l3_len;
> +       hdr_len = l3_offset + pkt_head->l4_len;
>         l2_len = l2_offset > 0 ? pkt_head->outer_l2_len : pkt_head->l2_len;
>         if (unlikely(pkt_head->pkt_len - l2_len + pkt_tail->pkt_len -
>                                 hdr_len > MAX_IPV4_PKT_LENGTH))
>                 return 0;
> 
> +       /* merge push flag to pkt_head */
> +       tail_tcp_hdr = rte_pktmbuf_mtod_offset(pkt_tail,
> +                               struct rte_tcp_hdr *, l3_offset);
> +       if (tail_tcp_hdr->tcp_flags & RTE_TCP_PSH_FLAG) {
> +               head_tcp_hdr = rte_pktmbuf_mtod_offset(pkt_head,
> +                                       struct rte_tcp_hdr *, l3_offset);
> +               head_tcp_hdr->tcp_flags |= RTE_TCP_PSH_FLAG;
> +       }
> +
>         /* remove the packet header for the tail packet */
>         rte_pktmbuf_adj(pkt_tail, hdr_len);
> 
> diff --git a/lib/gro/gro_vxlan_tcp4.c b/lib/gro/gro_vxlan_tcp4.c
> index 3be4deb7c7..884802af0b 100644
> --- a/lib/gro/gro_vxlan_tcp4.c
> +++ b/lib/gro/gro_vxlan_tcp4.c
> @@ -326,10 +326,10 @@ gro_vxlan_tcp4_reassemble(struct rte_mbuf *pkt,
>         tcp_hdr = (struct rte_tcp_hdr *)((char *)ipv4_hdr + pkt->l3_len);
> 
>         /*
> -        * Don't process the packet which has FIN, SYN, RST, PSH, URG,
> +        * Don't process the packet which has FIN, SYN, RST, URG,
>          * ECE or CWR set.
>          */
> -       if (tcp_hdr->tcp_flags != RTE_TCP_ACK_FLAG)
> +       if (tcp_hdr->tcp_flags & (~(RTE_TCP_ACK_FLAG | RTE_TCP_PSH_FLAG)))
>                 return -1;
> 
>         hdr_len = pkt->outer_l2_len + pkt->outer_l3_len + pkt->l2_len +
> --
> 2.25.1
> 





Reply via email to