diff mbox

[net-next,1/1] hyperv: Properly handle checksum offload

Message ID 1398451514-25593-1-git-send-email-kys@microsoft.com
State Superseded, archived
Delegated to: David Miller
Headers show

Commit Message

KY Srinivasan April 25, 2014, 6:45 p.m. UTC
Do checksum offload only if the client of the driver wants checksum to be
offloaded. Also Windows hosts support ip header checksum offload as well -
take advantage of that.

This patch fixes a bug that is exposed in gateway scenarios.


Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Cc: stable@kernel.org
---
 drivers/net/hyperv/netvsc_drv.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

Comments

Stephen Hemminger April 26, 2014, 12:43 a.m. UTC | #1
On Fri, 25 Apr 2014 11:45:14 -0700
"K. Y. Srinivasan" <kys@microsoft.com> wrote:

> @@ -474,6 +477,9 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
>  	csum_info = (struct ndis_tcp_ip_checksum_info *)((void *)ppi +
>  			ppi->ppi_offset);
>  
> +	ip_hdr(skb)->check = 0;
> +	csum_info->transmit.ip_header_checksum = 1;
> +
>  	if (net_trans_info & (INFO_IPV4 << 16))
>  		csum_info->transmit.is_ipv4 = 1;
>  	else

Linux doesn't need or want IP checksum offload.
It will not have any performance gain.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Eric Dumazet April 26, 2014, 1:15 a.m. UTC | #2
On Fri, 2014-04-25 at 17:43 -0700, Stephen Hemminger wrote:
> On Fri, 25 Apr 2014 11:45:14 -0700
> "K. Y. Srinivasan" <kys@microsoft.com> wrote:
> 
> > @@ -474,6 +477,9 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
> >  	csum_info = (struct ndis_tcp_ip_checksum_info *)((void *)ppi +
> >  			ppi->ppi_offset);
> >  
> > +	ip_hdr(skb)->check = 0;
> > +	csum_info->transmit.ip_header_checksum = 1;
> > +
> >  	if (net_trans_info & (INFO_IPV4 << 16))
> >  		csum_info->transmit.is_ipv4 = 1;
> >  	else
> 
> Linux doesn't need or want IP checksum offload.
> It will not have any performance gain.


BTW, was this patch even tested with IPv6 packets ???


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
KY Srinivasan April 26, 2014, 2:23 a.m. UTC | #3
> -----Original Message-----
> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Friday, April 25, 2014 5:43 PM
> To: KY Srinivasan
> Cc: davem@davemloft.net; netdev@vger.kernel.org; linux-
> kernel@vger.kernel.org; devel@linuxdriverproject.org; olaf@aepfle.de;
> apw@canonical.com; jasowang@redhat.com; stable@kernel.org
> Subject: Re: [PATCH net-next 1/1] hyperv: Properly handle checksum offload
> 
> On Fri, 25 Apr 2014 11:45:14 -0700
> "K. Y. Srinivasan" <kys@microsoft.com> wrote:
> 
> > @@ -474,6 +477,9 @@ static int netvsc_start_xmit(struct sk_buff *skb,
> struct net_device *net)
> >  	csum_info = (struct ndis_tcp_ip_checksum_info *)((void *)ppi +
> >  			ppi->ppi_offset);
> >
> > +	ip_hdr(skb)->check = 0;
> > +	csum_info->transmit.ip_header_checksum = 1;
> > +
> >  	if (net_trans_info & (INFO_IPV4 << 16))
> >  		csum_info->transmit.is_ipv4 = 1;
> >  	else
> 
> Linux doesn't need or want IP checksum offload.
> It will not have any performance gain.

Thanks Stephen; I will  re-spin the patch and re-submit.

K. Y
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
KY Srinivasan April 26, 2014, 2:24 a.m. UTC | #4
> -----Original Message-----

> From: Eric Dumazet [mailto:eric.dumazet@gmail.com]

> Sent: Friday, April 25, 2014 6:15 PM

> To: Stephen Hemminger

> Cc: KY Srinivasan; davem@davemloft.net; netdev@vger.kernel.org; linux-

> kernel@vger.kernel.org; devel@linuxdriverproject.org; olaf@aepfle.de;

> apw@canonical.com; jasowang@redhat.com; stable@kernel.org

> Subject: Re: [PATCH net-next 1/1] hyperv: Properly handle checksum offload

> 

> On Fri, 2014-04-25 at 17:43 -0700, Stephen Hemminger wrote:

> > On Fri, 25 Apr 2014 11:45:14 -0700

> > "K. Y. Srinivasan" <kys@microsoft.com> wrote:

> >

> > > @@ -474,6 +477,9 @@ static int netvsc_start_xmit(struct sk_buff *skb,

> struct net_device *net)

> > >  	csum_info = (struct ndis_tcp_ip_checksum_info *)((void *)ppi +

> > >  			ppi->ppi_offset);

> > >

> > > +	ip_hdr(skb)->check = 0;

> > > +	csum_info->transmit.ip_header_checksum = 1;

> > > +

> > >  	if (net_trans_info & (INFO_IPV4 << 16))

> > >  		csum_info->transmit.is_ipv4 = 1;

> > >  	else

> >

> > Linux doesn't need or want IP checksum offload.

> > It will not have any performance gain.

> 

> 

> BTW, was this patch even tested with IPv6 packets ???


No; I only tested this on ipv4.

K. Y
>
KY Srinivasan April 26, 2014, 2:40 a.m. UTC | #5
> -----Original Message-----
> From: driverdev-devel-bounces@linuxdriverproject.org [mailto:driverdev-
> devel-bounces@linuxdriverproject.org] On Behalf Of KY Srinivasan
> Sent: Friday, April 25, 2014 7:24 PM
> To: Eric Dumazet; Stephen Hemminger
> Cc: olaf@aepfle.de; netdev@vger.kernel.org; jasowang@redhat.com; linux-
> kernel@vger.kernel.org; stable@kernel.org; apw@canonical.com;
> devel@linuxdriverproject.org; davem@davemloft.net
> Subject: RE: [PATCH net-next 1/1] hyperv: Properly handle checksum offload
> 
> 
> 
> > -----Original Message-----
> > From: Eric Dumazet [mailto:eric.dumazet@gmail.com]
> > Sent: Friday, April 25, 2014 6:15 PM
> > To: Stephen Hemminger
> > Cc: KY Srinivasan; davem@davemloft.net; netdev@vger.kernel.org; linux-
> > kernel@vger.kernel.org; devel@linuxdriverproject.org; olaf@aepfle.de;
> > apw@canonical.com; jasowang@redhat.com; stable@kernel.org
> > Subject: Re: [PATCH net-next 1/1] hyperv: Properly handle checksum
> > offload
> >
> > On Fri, 2014-04-25 at 17:43 -0700, Stephen Hemminger wrote:
> > > On Fri, 25 Apr 2014 11:45:14 -0700
> > > "K. Y. Srinivasan" <kys@microsoft.com> wrote:
> > >
> > > > @@ -474,6 +477,9 @@ static int netvsc_start_xmit(struct sk_buff
> > > > *skb,
> > struct net_device *net)
> > > >  	csum_info = (struct ndis_tcp_ip_checksum_info *)((void *)ppi +
> > > >  			ppi->ppi_offset);
> > > >
> > > > +	ip_hdr(skb)->check = 0;
> > > > +	csum_info->transmit.ip_header_checksum = 1;
> > > > +
> > > >  	if (net_trans_info & (INFO_IPV4 << 16))
> > > >  		csum_info->transmit.is_ipv4 = 1;
> > > >  	else
> > >
> > > Linux doesn't need or want IP checksum offload.
> > > It will not have any performance gain.
> >
> >
> > BTW, was this patch even tested with IPv6 packets ???
> 
> No; I only tested this on ipv4.
Oops; this would not work on ipv6. I am going to resend this patch.

K. Y
> 
> K. Y
> >
> 
> _______________________________________________
> devel mailing list
> devel@linuxdriverproject.org
> http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 939e3af..706b341 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -467,6 +467,9 @@  static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
 	if (skb_is_gso(skb))
 		goto do_lso;
 
+	if (skb->ip_summed != CHECKSUM_PARTIAL)
+		goto do_send;
+
 	rndis_msg_size += NDIS_CSUM_PPI_SIZE;
 	ppi = init_ppi_data(rndis_msg, NDIS_CSUM_PPI_SIZE,
 			    TCPIP_CHKSUM_PKTINFO);
@@ -474,6 +477,9 @@  static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
 	csum_info = (struct ndis_tcp_ip_checksum_info *)((void *)ppi +
 			ppi->ppi_offset);
 
+	ip_hdr(skb)->check = 0;
+	csum_info->transmit.ip_header_checksum = 1;
+
 	if (net_trans_info & (INFO_IPV4 << 16))
 		csum_info->transmit.is_ipv4 = 1;
 	else