Re: [tipc-discussion] [PATCH net-next 8/8] tipc: add hardware gso
On Fri, Sep 10, 2021 at 8:08 AM Jon Maloy wrote: > > > > On 06/07/2021 14:22, Xin Long wrote: > > Since there's no enough bit in netdev_features_t for > > NETIF_F_GSO_TIPC_BIT, and tipc is using the simliar > > code as sctp, this patch will reuse SKB_GSO_SCTP and > > NETIF_F_GSO_SCTP_BIT for tipc. > > > > Signed-off-by: Xin Long > > --- > > include/linux/skbuff.h | 2 -- > > net/tipc/node.c| 15 ++- > > net/tipc/offload.c | 4 ++-- > > 3 files changed, 16 insertions(+), 5 deletions(-) > > > > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > > index 148bf0ed7336..b2db9cd9a73f 100644 > > --- a/include/linux/skbuff.h > > +++ b/include/linux/skbuff.h > > @@ -599,8 +599,6 @@ enum { > > SKB_GSO_UDP_L4 = 1 << 17, > > > > SKB_GSO_FRAGLIST = 1 << 18, > > - > > - SKB_GSO_TIPC = 1 << 19, > > }; > > > > #if BITS_PER_LONG > 32 > > diff --git a/net/tipc/node.c b/net/tipc/node.c > > index 9947b7dfe1d2..17e59c8dac31 100644 > > --- a/net/tipc/node.c > > +++ b/net/tipc/node.c > > @@ -2068,7 +2068,7 @@ static bool tipc_node_check_state(struct tipc_node > > *n, struct sk_buff *skb, > >* Invoked with no locks held. Bearer pointer must point to a valid bearer > >* structure (i.e. cannot be NULL), but bearer can be inactive. > >*/ > > -void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) > > +static void __tipc_rcv(struct net *net, struct sk_buff *skb, struct > > tipc_bearer *b) > > { > > struct sk_buff_head xmitq; > > struct tipc_link_entry *le; > > @@ -2189,6 +2189,19 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, > > struct tipc_bearer *b) > > kfree_skb(skb); > > } > > > > +void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) > > +{ > > + struct sk_buff *seg, *next; > > + > > + if (!skb_is_gso(skb) || !skb_is_gso_sctp(skb)) > > + return __tipc_rcv(net, skb, b); > > + > > + skb_list_walk_safe(skb_shinfo(skb)->frag_list, seg, next) > > + __tipc_rcv(net, seg, b); > > + skb_shinfo(skb)->frag_list = NULL; > > + consume_skb(skb); > > +} > > + > > void tipc_node_apply_property(struct net *net, struct tipc_bearer *b, > > int prop) > > { > > diff --git a/net/tipc/offload.c b/net/tipc/offload.c > > index d137679f4db0..26e372178635 100644 > > --- a/net/tipc/offload.c > > +++ b/net/tipc/offload.c > > @@ -5,7 +5,7 @@ > > static struct sk_buff *tipc_gso_segment(struct sk_buff *skb, > > netdev_features_t features) > > { > > - if (!(skb_shinfo(skb)->gso_type & SKB_GSO_TIPC)) > > + if (!(skb_shinfo(skb)->gso_type & SKB_GSO_SCTP)) > > return ERR_PTR(-EINVAL); > > > > return skb_segment(skb, (features | NETIF_F_HW_CSUM) & ~NETIF_F_SG); > > @@ -39,7 +39,7 @@ bool tipc_msg_gso_append(struct sk_buff **p, struct > > sk_buff *skb, u16 segs) > > > > skb_shinfo(nskb)->frag_list = head; > > skb_shinfo(nskb)->gso_segs = 1; > > - skb_shinfo(nskb)->gso_type = SKB_GSO_TIPC; > > + skb_shinfo(nskb)->gso_type = SKB_GSO_SCTP; > > skb_shinfo(nskb)->gso_size = GSO_BY_FRAGS; > > skb_reset_network_header(head); > > > > > > I don´t have much more to add, -it looks good to me, and way simpler > than what I was trying a couple of years ago. > > If you fix the checkpatch issues and, maybe if possible, split it into > two series, you have my ack. > > PS. Did you test this with crypto? Hi Jon, Sorry for late. Got an urgent problem from a customer recently, and spent quite a few weeks getting things almost done. I need to do more testing for its performance in different scenarios before continuing. I think I did, but I will confirm it will work well over crypto. Thanks a lot for checking! > > ///jon > ___ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion
Re: [tipc-discussion] [PATCH net-next 8/8] tipc: add hardware gso
On 06/07/2021 14:22, Xin Long wrote: Since there's no enough bit in netdev_features_t for NETIF_F_GSO_TIPC_BIT, and tipc is using the simliar code as sctp, this patch will reuse SKB_GSO_SCTP and NETIF_F_GSO_SCTP_BIT for tipc. Signed-off-by: Xin Long --- include/linux/skbuff.h | 2 -- net/tipc/node.c| 15 ++- net/tipc/offload.c | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 148bf0ed7336..b2db9cd9a73f 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -599,8 +599,6 @@ enum { SKB_GSO_UDP_L4 = 1 << 17, SKB_GSO_FRAGLIST = 1 << 18, - - SKB_GSO_TIPC = 1 << 19, }; #if BITS_PER_LONG > 32 diff --git a/net/tipc/node.c b/net/tipc/node.c index 9947b7dfe1d2..17e59c8dac31 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -2068,7 +2068,7 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, * Invoked with no locks held. Bearer pointer must point to a valid bearer * structure (i.e. cannot be NULL), but bearer can be inactive. */ -void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) +static void __tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) { struct sk_buff_head xmitq; struct tipc_link_entry *le; @@ -2189,6 +2189,19 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) kfree_skb(skb); } +void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) +{ + struct sk_buff *seg, *next; + + if (!skb_is_gso(skb) || !skb_is_gso_sctp(skb)) + return __tipc_rcv(net, skb, b); + + skb_list_walk_safe(skb_shinfo(skb)->frag_list, seg, next) + __tipc_rcv(net, seg, b); + skb_shinfo(skb)->frag_list = NULL; + consume_skb(skb); +} + void tipc_node_apply_property(struct net *net, struct tipc_bearer *b, int prop) { diff --git a/net/tipc/offload.c b/net/tipc/offload.c index d137679f4db0..26e372178635 100644 --- a/net/tipc/offload.c +++ b/net/tipc/offload.c @@ -5,7 +5,7 @@ static struct sk_buff *tipc_gso_segment(struct sk_buff *skb, netdev_features_t features) { - if (!(skb_shinfo(skb)->gso_type & SKB_GSO_TIPC)) + if (!(skb_shinfo(skb)->gso_type & SKB_GSO_SCTP)) return ERR_PTR(-EINVAL); return skb_segment(skb, (features | NETIF_F_HW_CSUM) & ~NETIF_F_SG); @@ -39,7 +39,7 @@ bool tipc_msg_gso_append(struct sk_buff **p, struct sk_buff *skb, u16 segs) skb_shinfo(nskb)->frag_list = head; skb_shinfo(nskb)->gso_segs = 1; - skb_shinfo(nskb)->gso_type = SKB_GSO_TIPC; + skb_shinfo(nskb)->gso_type = SKB_GSO_SCTP; skb_shinfo(nskb)->gso_size = GSO_BY_FRAGS; skb_reset_network_header(head); I don´t have much more to add, -it looks good to me, and way simpler than what I was trying a couple of years ago. If you fix the checkpatch issues and, maybe if possible, split it into two series, you have my ack. PS. Did you test this with crypto? ///jon ___ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion
[tipc-discussion] [PATCH net-next 8/8] tipc: add hardware gso
Since there's no enough bit in netdev_features_t for NETIF_F_GSO_TIPC_BIT, and tipc is using the simliar code as sctp, this patch will reuse SKB_GSO_SCTP and NETIF_F_GSO_SCTP_BIT for tipc. Signed-off-by: Xin Long --- include/linux/skbuff.h | 2 -- net/tipc/node.c| 15 ++- net/tipc/offload.c | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 148bf0ed7336..b2db9cd9a73f 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -599,8 +599,6 @@ enum { SKB_GSO_UDP_L4 = 1 << 17, SKB_GSO_FRAGLIST = 1 << 18, - - SKB_GSO_TIPC = 1 << 19, }; #if BITS_PER_LONG > 32 diff --git a/net/tipc/node.c b/net/tipc/node.c index 9947b7dfe1d2..17e59c8dac31 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -2068,7 +2068,7 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, * Invoked with no locks held. Bearer pointer must point to a valid bearer * structure (i.e. cannot be NULL), but bearer can be inactive. */ -void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) +static void __tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) { struct sk_buff_head xmitq; struct tipc_link_entry *le; @@ -2189,6 +2189,19 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) kfree_skb(skb); } +void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) +{ + struct sk_buff *seg, *next; + + if (!skb_is_gso(skb) || !skb_is_gso_sctp(skb)) + return __tipc_rcv(net, skb, b); + + skb_list_walk_safe(skb_shinfo(skb)->frag_list, seg, next) + __tipc_rcv(net, seg, b); + skb_shinfo(skb)->frag_list = NULL; + consume_skb(skb); +} + void tipc_node_apply_property(struct net *net, struct tipc_bearer *b, int prop) { diff --git a/net/tipc/offload.c b/net/tipc/offload.c index d137679f4db0..26e372178635 100644 --- a/net/tipc/offload.c +++ b/net/tipc/offload.c @@ -5,7 +5,7 @@ static struct sk_buff *tipc_gso_segment(struct sk_buff *skb, netdev_features_t features) { - if (!(skb_shinfo(skb)->gso_type & SKB_GSO_TIPC)) + if (!(skb_shinfo(skb)->gso_type & SKB_GSO_SCTP)) return ERR_PTR(-EINVAL); return skb_segment(skb, (features | NETIF_F_HW_CSUM) & ~NETIF_F_SG); @@ -39,7 +39,7 @@ bool tipc_msg_gso_append(struct sk_buff **p, struct sk_buff *skb, u16 segs) skb_shinfo(nskb)->frag_list = head; skb_shinfo(nskb)->gso_segs = 1; - skb_shinfo(nskb)->gso_type = SKB_GSO_TIPC; + skb_shinfo(nskb)->gso_type = SKB_GSO_SCTP; skb_shinfo(nskb)->gso_size = GSO_BY_FRAGS; skb_reset_network_header(head); -- 2.27.0 ___ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion