Subject: Re: [PATCH 6/9] s390: qeth driver fixes [3/6]

From: Frank Pavlic <[email-masked]>
Date: Fri, 15 Sep 2006 18:50:13 +0200

yes it would but the problem in qeth is not only bonding related.
We just have found it in a bonding scenario . But this kernel
panic could also occur without bonding. 

But thanks for reviewing it 
On Fri, Sep 15, 2006 at 08:51:25AM -0700, Jay Vosburgh wrote:
> Frank Pavlic <[email-masked]> wrote:
> 
> >[PATCH 6/9] s390: qeth driver fixes [3/6]
> >
> >From: Frank Pavlic <[email-masked]>
> >       	fixed kernel panic caused by qeth driver:
> >        Using a bonding device qeth driver will realloc
> >        headroom for every skb coming from the bond device.
> >        Once this happens qeth frees the original skb and
> >        set the skb pointer to the new realloced skb.
> 
> 	Frank, does the following patch to bonding (to track larger than
> usual hard_header_len) resolve this problem without changing qeth?  I
> believe this patch is queued for 2.6.19.
> 
> To: [email-masked], [email-masked]
> Cc: Jeff Garzik <[email-masked]>
> Subject: [PATCH 5/7] bonding: Handle large hard_header_len
> X-Mailer: MH-E 7.83; nmh 1.1-RC4; GNU Emacs 21.4.1
> Date: Fri, 01 Sep 2006 15:12:44 -0700
> From: Jay Vosburgh <fubar@death>
> 
> 
> The bonding driver fails to adjust its hard_header_len when enslaving
> interfaces.  Whenever an interface with a hard_header_len greater than the
> ETH_HLEN default is enslaved, the potential for an oops exists, and if the
> oops happens while responding to an arp request, for example, the system
> panics.  GIANFAR devices may use an extended hard_header for VLAN or
> hardware checksumming.  Enslaving such a device and then transmitting over
> it causes a kernel panic.
> 
> Patch modified from submitter's original, but submitter agreed with this
> patch in private email.
> 
> Signed-off-by: Mark Huth <[email-masked]>
> Signed-off-by: Jay Vosburgh <[email-masked]>
> 
> 
> --- netdev-2.6.git-upstream/drivers/net/bonding/bond_main.c	2006/08/19 14:46:07	1.3
> +++ netdev-2.6.git-upstream/drivers/net/bonding/bond_main.c	2006/08/19 15:47:27	1.4
> @@ -1211,10 +1211,14 @@ static int bond_compute_features(struct 
>  	unsigned long features = BOND_INTERSECT_FEATURES;
>  	struct slave *slave;
>  	struct net_device *bond_dev = bond->dev;
> +	unsigned short max_hard_header_len = ETH_HLEN;
>  	int i;
>  
> -	bond_for_each_slave(bond, slave, i)
> +	bond_for_each_slave(bond, slave, i) {
>  		features &= (slave->dev->features & BOND_INTERSECT_FEATURES);
> +		if (slave->dev->hard_header_len > max_hard_header_len)
> +			max_hard_header_len = slave->dev->hard_header_len;
> +	}
>  
>  	if ((features & NETIF_F_SG) && 
>  	    !(features & NETIF_F_ALL_CSUM))
> @@ -1232,6 +1236,7 @@ static int bond_compute_features(struct 
>  
>  	features |= (bond_dev->features & ~BOND_INTERSECT_FEATURES);
>  	bond_dev->features = features;
> +	bond_dev->hard_header_len = max_hard_header_len;
>  
>  	return 0;
>  }
> 
> 
> 
> 	-J
> 
> ---
> 	-Jay Vosburgh, IBM Linux Technology Center, [email-masked]