* [PATCH net-next 0/2] net: add support for ip generic checksum offload for gre
@ 2021-01-24 8:44 Xin Long
2021-01-24 8:44 ` [PATCH net-next 1/2] net: support ip generic csum processing in skb_csum_hwoffload_help Xin Long
2021-01-24 8:44 ` [PATCH net-next 2/2] ip_gre: add csum offload support for gre header Xin Long
0 siblings, 2 replies; 5+ messages in thread
From: Xin Long @ 2021-01-24 8:44 UTC (permalink / raw)
To: network dev
Cc: Marcelo Ricardo Leitner, davem, Jakub Kicinski, Davide Caratti,
Alexander Duyck
This patchset it to add ip generic csum processing first in
skb_csum_hwoffload_help() in Patch 1/2 and then add csum
offload support for GRE header in Patch 2/2.
v1->v2:
- See each patch's changelog.
Xin Long (2):
net: support ip generic csum processing in skb_csum_hwoffload_help
ip_gre: add csum offload support for gre header
include/net/gre.h | 19 +++++++------------
net/core/dev.c | 13 ++++++++++++-
net/ipv4/gre_offload.c | 15 +++++++++++++--
3 files changed, 32 insertions(+), 15 deletions(-)
--
2.1.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net-next 1/2] net: support ip generic csum processing in skb_csum_hwoffload_help
2021-01-24 8:44 [PATCH net-next 0/2] net: add support for ip generic checksum offload for gre Xin Long
@ 2021-01-24 8:44 ` Xin Long
2021-01-26 1:58 ` Willem de Bruijn
2021-01-24 8:44 ` [PATCH net-next 2/2] ip_gre: add csum offload support for gre header Xin Long
1 sibling, 1 reply; 5+ messages in thread
From: Xin Long @ 2021-01-24 8:44 UTC (permalink / raw)
To: network dev
Cc: Marcelo Ricardo Leitner, davem, Jakub Kicinski, Davide Caratti,
Alexander Duyck
NETIF_F_IP|IPV6_CSUM feature flag indicates UDP and TCP csum offload
while NETIF_F_HW_CSUM feature flag indicates ip generic csum offload
for HW, which includes not only for TCP/UDP csum, but also for other
protocols' csum like GRE's.
However, in skb_csum_hwoffload_help() it only checks features against
NETIF_F_CSUM_MASK(NETIF_F_HW|IP|IPV6_CSUM). So if it's a non TCP/UDP
packet and the features doesn't support NETIF_F_HW_CSUM, but supports
NETIF_F_IP|IPV6_CSUM only, it would still return 0 and leave the HW
to do csum.
This patch is to support ip generic csum processing by checking
NETIF_F_HW_CSUM for all protocols, and check (NETIF_F_IP_CSUM |
NETIF_F_IPV6_CSUM) only for TCP and UDP.
v1->v2:
- not extend skb->csum_not_inet, but use skb->csum_offset to tell
if it's an UDP/TCP csum packet.
Suggested-by: Alexander Duyck <alexander.duyck@gmail.com>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/core/dev.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index 6df3f1b..aae116d 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -3621,7 +3621,18 @@ int skb_csum_hwoffload_help(struct sk_buff *skb,
return !!(features & NETIF_F_SCTP_CRC) ? 0 :
skb_crc32c_csum_help(skb);
- return !!(features & NETIF_F_CSUM_MASK) ? 0 : skb_checksum_help(skb);
+ if (features & NETIF_F_HW_CSUM)
+ return 0;
+
+ if (features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) {
+ switch (skb->csum_offset) {
+ case offsetof(struct tcphdr, check):
+ case offsetof(struct udphdr, check):
+ return 0;
+ }
+ }
+
+ return skb_checksum_help(skb);
}
EXPORT_SYMBOL(skb_csum_hwoffload_help);
--
2.1.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH net-next 2/2] ip_gre: add csum offload support for gre header
2021-01-24 8:44 [PATCH net-next 0/2] net: add support for ip generic checksum offload for gre Xin Long
2021-01-24 8:44 ` [PATCH net-next 1/2] net: support ip generic csum processing in skb_csum_hwoffload_help Xin Long
@ 2021-01-24 8:44 ` Xin Long
1 sibling, 0 replies; 5+ messages in thread
From: Xin Long @ 2021-01-24 8:44 UTC (permalink / raw)
To: network dev
Cc: Marcelo Ricardo Leitner, davem, Jakub Kicinski, Davide Caratti,
Alexander Duyck
This patch is to add csum offload support for gre header:
On the TX path in gre_build_header(), when CHECKSUM_PARTIAL's set
for inner proto, it will calculate the csum for outer proto, and
inner csum will be offloaded later. Otherwise, CHECKSUM_PARTIAL
and csum_start/offset will be set for outer proto, and the outer
csum will be offloaded later.
On the GSO path in gre_gso_segment(), when CHECKSUM_PARTIAL is
not set for inner proto and the hardware supports csum offload,
CHECKSUM_PARTIAL and csum_start/offset will be set for outer
proto, and outer csum will be offloaded later. Otherwise, it
will do csum for outer proto by calling gso_make_checksum().
Note that SCTP has to do the csum by itself for non GSO path in
sctp_packet_pack(), as gre_build_header() can't handle the csum
with CHECKSUM_PARTIAL set for SCTP CRC csum offload.
v1->v2:
- remove the SCTP part, as GRE dev doesn't support SCTP CRC CSUM
and it will always do checksum for SCTP in sctp_packet_pack()
when it's not a GSO packet.
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
include/net/gre.h | 19 +++++++------------
net/ipv4/gre_offload.c | 15 +++++++++++++--
2 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/include/net/gre.h b/include/net/gre.h
index b60f212..4e20970 100644
--- a/include/net/gre.h
+++ b/include/net/gre.h
@@ -106,17 +106,6 @@ static inline __be16 gre_tnl_flags_to_gre_flags(__be16 tflags)
return flags;
}
-static inline __sum16 gre_checksum(struct sk_buff *skb)
-{
- __wsum csum;
-
- if (skb->ip_summed == CHECKSUM_PARTIAL)
- csum = lco_csum(skb);
- else
- csum = skb_checksum(skb, 0, skb->len, 0);
- return csum_fold(csum);
-}
-
static inline void gre_build_header(struct sk_buff *skb, int hdr_len,
__be16 flags, __be16 proto,
__be32 key, __be32 seq)
@@ -146,7 +135,13 @@ static inline void gre_build_header(struct sk_buff *skb, int hdr_len,
!(skb_shinfo(skb)->gso_type &
(SKB_GSO_GRE | SKB_GSO_GRE_CSUM))) {
*ptr = 0;
- *(__sum16 *)ptr = gre_checksum(skb);
+ if (skb->ip_summed == CHECKSUM_PARTIAL) {
+ *(__sum16 *)ptr = csum_fold(lco_csum(skb));
+ } else {
+ skb->ip_summed = CHECKSUM_PARTIAL;
+ skb->csum_start = skb_transport_header(skb) - skb->head;
+ skb->csum_offset = sizeof(*greh);
+ }
}
}
}
diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c
index 10bc49b..1121a9d 100644
--- a/net/ipv4/gre_offload.c
+++ b/net/ipv4/gre_offload.c
@@ -15,10 +15,10 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
netdev_features_t features)
{
int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb);
+ bool need_csum, offload_csum, gso_partial, need_ipsec;
struct sk_buff *segs = ERR_PTR(-EINVAL);
u16 mac_offset = skb->mac_header;
__be16 protocol = skb->protocol;
- bool need_csum, gso_partial;
u16 mac_len = skb->mac_len;
int gre_offset, outer_hlen;
@@ -47,6 +47,11 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
if (need_csum)
features &= ~NETIF_F_SCTP_CRC;
+ need_ipsec = skb_dst(skb) && dst_xfrm(skb_dst(skb));
+ /* Try to offload checksum if possible */
+ offload_csum = !!(need_csum && !need_ipsec &&
+ (skb->dev->features & NETIF_F_HW_CSUM));
+
/* segment inner packet. */
segs = skb_mac_gso_segment(skb, features);
if (IS_ERR_OR_NULL(segs)) {
@@ -100,7 +105,13 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
}
*(pcsum + 1) = 0;
- *pcsum = gso_make_checksum(skb, 0);
+ if (skb->encapsulation || !offload_csum) {
+ *pcsum = gso_make_checksum(skb, 0);
+ } else {
+ skb->ip_summed = CHECKSUM_PARTIAL;
+ skb->csum_start = skb_transport_header(skb) - skb->head;
+ skb->csum_offset = sizeof(*greh);
+ }
} while ((skb = skb->next));
out:
return segs;
--
2.1.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net-next 1/2] net: support ip generic csum processing in skb_csum_hwoffload_help
2021-01-24 8:44 ` [PATCH net-next 1/2] net: support ip generic csum processing in skb_csum_hwoffload_help Xin Long
@ 2021-01-26 1:58 ` Willem de Bruijn
2021-01-28 9:13 ` Xin Long
0 siblings, 1 reply; 5+ messages in thread
From: Willem de Bruijn @ 2021-01-26 1:58 UTC (permalink / raw)
To: Xin Long
Cc: network dev, Marcelo Ricardo Leitner, David Miller,
Jakub Kicinski, Davide Caratti, Alexander Duyck
On Sun, Jan 24, 2021 at 3:47 AM Xin Long <lucien.xin@gmail.com> wrote:
>
> NETIF_F_IP|IPV6_CSUM feature flag indicates UDP and TCP csum offload
> while NETIF_F_HW_CSUM feature flag indicates ip generic csum offload
> for HW, which includes not only for TCP/UDP csum, but also for other
> protocols' csum like GRE's.
>
> However, in skb_csum_hwoffload_help() it only checks features against
> NETIF_F_CSUM_MASK(NETIF_F_HW|IP|IPV6_CSUM). So if it's a non TCP/UDP
> packet and the features doesn't support NETIF_F_HW_CSUM, but supports
> NETIF_F_IP|IPV6_CSUM only, it would still return 0 and leave the HW
> to do csum.
>
> This patch is to support ip generic csum processing by checking
> NETIF_F_HW_CSUM for all protocols, and check (NETIF_F_IP_CSUM |
> NETIF_F_IPV6_CSUM) only for TCP and UDP.
>
> v1->v2:
> - not extend skb->csum_not_inet, but use skb->csum_offset to tell
> if it's an UDP/TCP csum packet.
>
> Suggested-by: Alexander Duyck <alexander.duyck@gmail.com>
> Signed-off-by: Xin Long <lucien.xin@gmail.com>
> ---
> net/core/dev.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/net/core/dev.c b/net/core/dev.c
> index 6df3f1b..aae116d 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -3621,7 +3621,18 @@ int skb_csum_hwoffload_help(struct sk_buff *skb,
> return !!(features & NETIF_F_SCTP_CRC) ? 0 :
> skb_crc32c_csum_help(skb);
>
> - return !!(features & NETIF_F_CSUM_MASK) ? 0 : skb_checksum_help(skb);
> + if (features & NETIF_F_HW_CSUM)
> + return 0;
> +
> + if (features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) {
> + switch (skb->csum_offset) {
> + case offsetof(struct tcphdr, check):
> + case offsetof(struct udphdr, check):
This relies on no other protocols requesting CHECKSUM_PARTIAL
with these csum_offset values.
That is a fragile assumption. It may well be correct, and Alex argues
that point in v1 of the patch. I think that argumentation at the least
should be captured as a comment or in the commit message.
Or perhaps limit this optimization over s/w checksumming to
skb->sk &&
(skb->sk->sk_family == AF_INET || .. ) &&
(skb->sk->sk_type == SOCK_STREAM || ..)
?
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next 1/2] net: support ip generic csum processing in skb_csum_hwoffload_help
2021-01-26 1:58 ` Willem de Bruijn
@ 2021-01-28 9:13 ` Xin Long
0 siblings, 0 replies; 5+ messages in thread
From: Xin Long @ 2021-01-28 9:13 UTC (permalink / raw)
To: Willem de Bruijn
Cc: network dev, Marcelo Ricardo Leitner, David Miller,
Jakub Kicinski, Davide Caratti, Alexander Duyck
On Tue, Jan 26, 2021 at 9:59 AM Willem de Bruijn
<willemdebruijn.kernel@gmail.com> wrote:
>
> On Sun, Jan 24, 2021 at 3:47 AM Xin Long <lucien.xin@gmail.com> wrote:
> >
> > NETIF_F_IP|IPV6_CSUM feature flag indicates UDP and TCP csum offload
> > while NETIF_F_HW_CSUM feature flag indicates ip generic csum offload
> > for HW, which includes not only for TCP/UDP csum, but also for other
> > protocols' csum like GRE's.
> >
> > However, in skb_csum_hwoffload_help() it only checks features against
> > NETIF_F_CSUM_MASK(NETIF_F_HW|IP|IPV6_CSUM). So if it's a non TCP/UDP
> > packet and the features doesn't support NETIF_F_HW_CSUM, but supports
> > NETIF_F_IP|IPV6_CSUM only, it would still return 0 and leave the HW
> > to do csum.
> >
> > This patch is to support ip generic csum processing by checking
> > NETIF_F_HW_CSUM for all protocols, and check (NETIF_F_IP_CSUM |
> > NETIF_F_IPV6_CSUM) only for TCP and UDP.
> >
> > v1->v2:
> > - not extend skb->csum_not_inet, but use skb->csum_offset to tell
> > if it's an UDP/TCP csum packet.
> >
> > Suggested-by: Alexander Duyck <alexander.duyck@gmail.com>
> > Signed-off-by: Xin Long <lucien.xin@gmail.com>
> > ---
> > net/core/dev.c | 13 ++++++++++++-
> > 1 file changed, 12 insertions(+), 1 deletion(-)
> >
> > diff --git a/net/core/dev.c b/net/core/dev.c
> > index 6df3f1b..aae116d 100644
> > --- a/net/core/dev.c
> > +++ b/net/core/dev.c
> > @@ -3621,7 +3621,18 @@ int skb_csum_hwoffload_help(struct sk_buff *skb,
> > return !!(features & NETIF_F_SCTP_CRC) ? 0 :
> > skb_crc32c_csum_help(skb);
> >
> > - return !!(features & NETIF_F_CSUM_MASK) ? 0 : skb_checksum_help(skb);
> > + if (features & NETIF_F_HW_CSUM)
> > + return 0;
> > +
> > + if (features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)) {
> > + switch (skb->csum_offset) {
> > + case offsetof(struct tcphdr, check):
> > + case offsetof(struct udphdr, check):
>
> This relies on no other protocols requesting CHECKSUM_PARTIAL
> with these csum_offset values.
>
> That is a fragile assumption. It may well be correct, and Alex argues
> that point in v1 of the patch. I think that argumentation at the least
> should be captured as a comment or in the commit message.
will add a note in changelog and repost, thanks!
>
> Or perhaps limit this optimization over s/w checksumming to
>
> skb->sk &&
> (skb->sk->sk_family == AF_INET || .. ) &&
> (skb->sk->sk_type == SOCK_STREAM || ..)
>
> ?
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-01-28 9:20 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-01-24 8:44 [PATCH net-next 0/2] net: add support for ip generic checksum offload for gre Xin Long
2021-01-24 8:44 ` [PATCH net-next 1/2] net: support ip generic csum processing in skb_csum_hwoffload_help Xin Long
2021-01-26 1:58 ` Willem de Bruijn
2021-01-28 9:13 ` Xin Long
2021-01-24 8:44 ` [PATCH net-next 2/2] ip_gre: add csum offload support for gre header Xin Long
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.