mbox series

[PATCHv3,net-next,0/2] net: fix the features flag in sctp_gso_segment

Message ID cover.1610703289.git.lucien.xin@gmail.com
Headers show
Series net: fix the features flag in sctp_gso_segment | expand

Message

Xin Long Jan. 15, 2021, 9:36 a.m. UTC
Patch 1/2 is to improve the code in skb_segment(), and it is needed
by Patch 2/2.

v1->v2:
  - see Patch 1/2.
v2->v3:
  - change Patch 2/2 to the right patch.

Xin Long (2):
  net: move the hsize check to the else block in skb_segment
  sctp: remove the NETIF_F_SG flag before calling skb_segment

 net/core/skbuff.c  | 11 ++++++-----
 net/sctp/offload.c |  2 +-
 2 files changed, 7 insertions(+), 6 deletions(-)

Comments

Alexander Duyck Jan. 16, 2021, 1:39 a.m. UTC | #1
On Fri, Jan 15, 2021 at 1:36 AM Xin Long <lucien.xin@gmail.com> wrote:
>

> After commit 89319d3801d1 ("net: Add frag_list support to skb_segment"),

> it goes to process frag_list when !hsize in skb_segment(). However, when

> using skb frag_list, sg normally should not be set. In this case, hsize

> will be set with len right before !hsize check, then it won't go to

> frag_list processing code.

>

> So the right thing to do is move the hsize check to the else block, so

> that it won't affect the !hsize check for frag_list processing.

>

> v1->v2:

>   - change to do "hsize <= 0" check instead of "!hsize", and also move

>     "hsize < 0" into else block, to save some cycles, as Alex suggested.

>

> Signed-off-by: Xin Long <lucien.xin@gmail.com>


Looks good to me.

Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>


> ---

>  net/core/skbuff.c | 11 ++++++-----

>  1 file changed, 6 insertions(+), 5 deletions(-)

>

> diff --git a/net/core/skbuff.c b/net/core/skbuff.c

> index 6039069..e835193 100644

> --- a/net/core/skbuff.c

> +++ b/net/core/skbuff.c

> @@ -3894,12 +3894,8 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,

>                 }

>

>                 hsize = skb_headlen(head_skb) - offset;

> -               if (hsize < 0)

> -                       hsize = 0;

> -               if (hsize > len || !sg)

> -                       hsize = len;

>

> -               if (!hsize && i >= nfrags && skb_headlen(list_skb) &&

> +               if (hsize <= 0 && i >= nfrags && skb_headlen(list_skb) &&

>                     (skb_headlen(list_skb) == len || sg)) {

>                         BUG_ON(skb_headlen(list_skb) > len);

>

> @@ -3942,6 +3938,11 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,

>                         skb_release_head_state(nskb);

>                         __skb_push(nskb, doffset);

>                 } else {

> +                       if (hsize > len || !sg)

> +                               hsize = len;

> +                       else if (hsize < 0)

> +                               hsize = 0;

> +

>                         nskb = __alloc_skb(hsize + doffset + headroom,

>                                            GFP_ATOMIC, skb_alloc_rx_flag(head_skb),

>                                            NUMA_NO_NODE);

> --

> 2.1.0

>
Jakub Kicinski Jan. 17, 2021, 3:13 a.m. UTC | #2
On Fri, 15 Jan 2021 17:39:02 -0800 Alexander Duyck wrote:
> On Fri, Jan 15, 2021 at 1:36 AM Xin Long <lucien.xin@gmail.com> wrote:

> >

> > After commit 89319d3801d1 ("net: Add frag_list support to skb_segment"),

> > it goes to process frag_list when !hsize in skb_segment(). However, when

> > using skb frag_list, sg normally should not be set. In this case, hsize

> > will be set with len right before !hsize check, then it won't go to

> > frag_list processing code.

> >

> > So the right thing to do is move the hsize check to the else block, so

> > that it won't affect the !hsize check for frag_list processing.

> >

> > v1->v2:

> >   - change to do "hsize <= 0" check instead of "!hsize", and also move

> >     "hsize < 0" into else block, to save some cycles, as Alex suggested.

> >

> > Signed-off-by: Xin Long <lucien.xin@gmail.com>  

> 

> Looks good to me.

> 

> Reviewed-by: Alexander Duyck <alexanderduyck@fb.com>


Applied, thanks!